web-dev-qa-db-ja.com

wkhtmltopdfのパフォーマンス

Wkhtmltopdfを使用してhtmlをpdfに変換する予定ですが、wkhtmltopdfのスケーラビリティが懸念されます。誰かがそれがどのようにスケーリングするかについて何か考えがありますか?私たちのWebアプリは、数十万の(非常に複雑な)htmlの変換を試みる可能性があるため、何らかのアイデアを持っていることが重要です。誰かがこれに関する情報を持っていますか?

21
rajadhi

まず第一に、あなたの質問は非常に一般的です。プロジェクトのスケーラビリティについて質問するときは、考慮すべき多くの変数があります。明らかに、1週間で「数十万」のHTMLファイルを変換することと、1日または1時間で変換することを期待することには違いがあります。その「比較的複雑な」HTMLに加えて、他の人にとっては異なる意味を持つ可能性があります。

そうは言っても、私はこれに似た何かをして、wkhtmltopdfを利用して約450,000のhtmlファイルを変換したので考えました。私の経験を共有したいと思います。

これが私のシナリオでした:

  • 450,000のHTMLファイル
    • ファイルの95%は1ページの長さでした
    • 通常、2つの画像が含まれます(相対パス、ローカルシステム)
    • 表形式のデータ(ネストされたテーブルが含まれる場合もあります)
    • 他の場所での単純なマークアップ(強い、斜体、下線など)
  • 予備のデスクトップPC
    • 8GBのRAM
    • 2.4GHzデュアルコアプロセッサ
    • 7200RPM HD

PHPで記述された単純なシングルスレッドスクリプトを使用して、フォルダーを反復処理し、htmlファイルパスをwkhtmltopdfに渡しました。このプロセスは、すべてのファイルを変換するのに約2。5日かかり、エラーはごくわずかでした。

これにより、Webアプリケーションでwkhtmltopdfを利用することで何が期待できるかについての洞察が得られることを願っています。いくつかの明らかな改善は、これをより優れたハードウェアで実行することからもたらされますが、主にマルチスレッドアプリケーションを利用してファイルを同時に処理することからもたらされます。

20
Alistair Ronan

私の経験では、パフォーマンスはあなたの写真に大きく依存します。大きな写真がたくさんあると、大幅に遅くなる可能性があります。可能であれば、サーバーの負荷を見積もってテストをステージングしようとします。集中的な操作に使用する人もいますが、数十万人のことは聞いたことがありません。私はすべてのように、それはあなたのコンテンツとリソースに依存すると思います。

次の引用は wkhtmltopdfメーリングリスト から直接引用しています:

私はwkHtmlToPDFを使用して、1日に約6000通の電子メールをPDFに変換しています。それはすべて4GBのメモリを備えたクアッドコアサーバーで行われます...それだけでは十分です。

パフォーマンスのヒントがいくつかありますが、パフォーマンスを最適化する前に、ボトルネックを試してみることをお勧めします。たとえば、可能であれば、間にWebサーバーを配置するのではなく、ディスクから直接画像をロードすると、かなり高速化できると言った人がいたことを覚えています。


編集:これに加えて、私はwkhtmltopdfで遊んで楽しんだ。現在、4Gbメモリを搭載したIntel Centrino 2で、PDF 57ページのコンテンツ(混合p、ul、table)、最大100枚の画像、およびtocは一貫して<7秒かかります。私はまた、ビジュアルスタジオ、ブラウザ、httpサーバー、および速度を低下させる可能性のあるその他のさまざまなソフトウェアを実行しています。ファイルの代わりにstdinとstdoutを直接使用しています。


編集:私はこれを試していませんが、CSSをリンクしている場合は、HTMLファイルに埋め込んでみてください(効果を正しく確認するには、テストの前後に行うことを忘れないでください!)。ここでの改善は、キャッシュやCSSの提供場所などに依存する可能性があります-毎回ディスクから読み取られるか、scssからの再生成が禁止されている場合は、かなり遅くなる可能性がありますが、結果がWebサーバーによってキャッシュされる場合(私は思いません) wkhtmltopdfはインスタンス間で何でもキャッシュします)大きな影響はないかもしれません。 YMMV。

7
Nenotlep

wkhtmltopdf --print-media-typeは非常に高速です。しかし、それでは通常のCSSスタイルが失われます。

これは、複雑なhtmlページのエクスポートには理想的なソリューションではない場合があります。しかし、私のhtmlコンテンツは非常にシンプルで表形式であるため、うまくいきました。

バージョンwkhtmltopdf 0.12.2.1でテスト済み

4
Ish

すべての実装でwkhtmltopdfを使用しようとします。私のオブジェクトは、生成された座標点の巨大なテーブルです。通常、私のPDFのボリューム= 500ページ

Wkhtmltopdfのポートを.netに使用しようとしています。結果は

- Pechkin - Pro: don't need other app. Contra: slow. 500 pages generated about 5 minutes
- PdfCodaxy - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Problems with non unicode text
- Nreco - only contra: slow. Slower than pure wkhtmltopdf. Required installed wkhtmltopdf. Incorrect unlock libs after use (for me)

C#コードから呼び出されたバイナリwkhtmltopdfを使用しようとします。

Pro: easy to use, faster that libs
Contra: need temporary files (cannot use Stream objects). Break with very huge (100MB+)html files as like as other libs
2
badma

Wkhtmltopdfエンジンの独自のプールを作成できます。毎回プロセスwkhtmltopdf.exeを開始するのではなく、APIを直接呼び出すことで、単純なユースケースでそれを行いました。 wkhtmltopdf APIはスレッドセーフではないため、簡単に実行することはできません。また、AppDomain間でネイティブコードを共有することを忘れないでください。

0
Alexn