web-dev-qa-db-ja.com

PDFアプリが強制終了されたときに、PDFKit / wkhtmltopdfがハングするのにRailsが期待どおりにレンダリングされるのはなぜですか?

バックグラウンド

周りを読んだ後、 Prawn が出ていて、 wkhtmltopdf が入っているように思えました。また、 PDFKitwicked_pdf Railsのgemが新しいクールです。だから私は PDFKit の使い方の Ryan によるスクリーンキャストを見つけました。私はすべてをインストールし、CLIでwkhtmltopdfを問題なくテストし、Rails設定をいじって複数のプロセスを実行してアセットパイプラインが機能するようにしましたが、すべてが問題なく終了しましたが、プロセス(実際にはサーバーからPDF応答を取得)。

質問

ビューの.pdfバージョンを要求すると(PDFKitミドルウェアオプションを使用しています)、ブラウザは応答を待っているだけですが、Rails PDFを処理します。ブラウザウィンドウにポップアップが表示されて初めて表示されます。何ができますか?

私が使用しているもの

  • OS:OSX 10.8.1
  • レール:3.2.8
  • Ruby:1.9.3
  • wkhtmltopdf:0.11.0_rc1(ただし、wkhtmltopdf -Vを実行すると0.10.0_rc2と表示されます)
  • qt:4.8.2

私がやったこと

  • config.middleware.use "PDFKit::Middleware"ファイルにapplication.rbをロードしてPDFKitミドルウェアを使用しました。
  • gemfileにgem 'pdfkit'を含め、Bundlerでインストールしました
  • .pdf初期化子でmime_types.rb mime-typeをMime::Type.register_alias "application/pdf", :pdfで設定します
  • 複数のスレッドのconfig.threadsafe!config/environments/development.rbを追加して、アセットパイプラインがPDFエンジンと競合しないようにしました
  • wkhtmltopdf http://www.google.com google.pdfをテストし、期待どおりにGoogleホームページのPDFを生成しました
  • pDFKitをwicked_pdfに交換しようとして、同じ問題が発生しました(ハングしますが、Railsプロセスが強制終了されるとPDFが期待どおりにレンダリングされます)

それはどのようなものか

これは、Railsによってレンダリングされた通常のHTMLページです(クライアントの詳細をぼかしました)。 enter image description here

これは、localhost:3000/some/path.pdfに移動しようとしたときのRailsによるCLI出力です。 (アプリは応答を待っている間にハングします): enter image description here

ctrl-cを使用してRailsプロセスを最後に強制終了すると、予期したとおりにPDFが最終的にブラウザーに表示されます(CSSとHTMLが適切にレンダリングされるため、アセットは正常に読み込まれるようです)。 enter image description here

これまでの結論

PDFKitをwicked_pdfと入れ替えて同じ結果を得ると、問題はそれらのライブラリにあるのではなく、私の開発環境に関係しているように思えます。しかし、wkhtmltopdfはコマンドラインから正常に実行されるため、QTとQTがうまく機能していると思います。問題はRailsにあるはずです。多分私は何かを正しく設定していませんか?

助けを求める

whatを正確に判断するにはどうすればよいですか?

あなたが私を助けることができれば私はあなたを愛します<3

更新

次のように、ミドルウェアオプションなしでPDF(.to_pdfを使用)をレンダリングする別の方法も試してみました(これを行うと、config.middleware.use "PDFKit::Middleware"ファイルからapplication.rbをコメントアウトしました)。

respond_to do |format|
    format.html
    format.pdf do
        html = '<html><body>This is a test.</body></html>'
        @pdf = PDFKit.new(html)

        send_data @pdf.to_pdf, 
            :filename => 'whatever.pdf', 
            :type => 'application/pdf', 
            :disposition => 'attachment'
    end
end
37
robmclarty

問題はwkhtmltopdf自体、特​​に0.9.9以降のバージョンにあります。コマンドラインから直接実行すると、wkhtmltopdfがハングします。

修正する手順:

brew uninstall wkhtmltopdf
cd /usr/local/Library/Formula/
git checkout 6e2d550 /usr/local/Library/Formula/wkhtmltopdf.rb
brew install wkhtmltopdf

次に、正しいバージョンがインストールされていることを確認しますwkhtmltopdf --versionwkhtmltopdf 0.9.9

引用:

  1. https://github.com/mileszs/wicked_pdf/issues/11
  2. http://wearepandr.com/blog/article/homebrew-and-installing-old-package-versions#blog_nav
70
scarver2

最後のバージョンを試してください。 MacOSへの簡単なインストール方法:

brew install Caskroom/cask/wkhtmltopdf
8
Abel

scarver2 による修正は、宣伝どおりに機能しました。しかし、wkhtmltopdfのより新しいバージョンが必要でした。自作バージョンはまだ古くなっているようです(まだコマンドラインでハングします)。また、最近コンパイルされたバイナリが利用できないため、os xビルドスクリプトを使用して自分でコンパイルしました。

$ git clone [email protected]:wkhtmltopdf/wkhtmltopdf.git
$ cd wkhtmltopdf
$ ./build_osx.sh     # i'm running 10.9.2
$ bin/wkhtmltopdf --version                                                                                  
Name:
  wkhtmltopdf 0.12.1-72a9f2066fe9ffd162dec007a4d9b6a5cd63b670
$ curl www.example.com | bin/wkhtmltopdf - test.pdf  # render pdf of example.com
$ open test.pdf   # to confirm pdf 

pdfkit 0.6.2Rails 3.2.17とともに使用しています。バイナリを/vendorに入れ、pdfkitイニシャライザでconfig.wkhtmltopdfを使用してポイントしました。ここまでは順調ですね。

2
user778174

同じ問題が発生しました。追加したときに機能します: 'config.threadsafe!' スタック の答えとしてapplication.rbに。この助けを願っています。

1
Jacky

まったく同じ症状ですが、現在WickedPdfを使用しています。この時点で、問題はwkhtmltopdfにもあると思います。

残念ながら、私がStack/Googleで見つけた推奨事項はどちらもうまくいきませんでした。代わりに、この投稿にあるものを含め、いくつかの提案を組み合わせる必要がありました。

解決策は:

  1. brew uninstall wkhtmltopdf
  2. /usr/binwkhtmltopdfのコピーを見つけて削除します
  3. コメントWickedPdf.configconfig/initializers
  4. config.threadsafe!development.rbに追加
  5. ミドルウェアを削除し、メインコントローラーの「表示」アクションがPDF要求を処理できるようにする(必要でない場合があります)
  6. wkhtmltopdf-binaryをgemfileに追加
  7. バンドル
  8. サーバーを再起動する
  9. Mime::Type.register_alias "application/pdf", :pdfconfig/initializers/mime_types.rbに追加する必要がある場合もあります(私にとっては、これにより '警告:すでに初期化された定数PDF'が発生します)

私のセットアップは:Rails 3.2.1、Webrick、Postgresおよびwkhtmltopdf-binary(0.9.9.1)を使用したMac OSX Mountain Lionでした。

0
Zorak

私もぶら下がっていてドックのwkhtmltopdfアイコンを開いていました。

私が実際に問題を見つけたのは、実行しているUnicornワーカープロセスが1つだけだったからです。 1つ以上追加すると、問題なく動作しました。

OS Xでpdfkit 0.6.2を使用してwkhtmltopdf 0.9.9を実行しています

0
Bob Fleming