2012-01-12 4 views
2

私はPDFファイルを生成する必要があるプロジェクトを持っています。このPDF内には、テキストの本体と、4つまたは5つの大きな画像(約800px * 1000px)を挿入する必要があります。これを柔軟にするために、FreeMarkerをXHTMLRenderer(フライングソーサー)と組み合わせて使用​​することを選択しました。インラインイメージ対テンポラリファイル(Java XHTML-> PDF生成)

私は今、オプションのカップルに直面しています:

  1. がディスクに一時ファイルを画像を作成し、それらを保存します。その後、.xhtmlテンプレートをFreeMarkerで処理し(ディスクに保存する)、処理された.xhtmlファイルのURLをXHTMLRendererに渡してPDFを生成します。これらの作成されたファイル(PDFのバー)はすべてFile.createTempFileで作成されます。これにより、FreeMarkerは画像をディスクから取り除くことができます(XHTMLでリンクされている画像のように)
  2. .xhtmlテンプレートを処理してメモリに保持します。テンプレートに画像をbase64でエンコードされたデータURLとして渡します。これにより、FreeMarkerの出力をXHTMLRendererに直接渡すことができるため、一時ファイルを保存する必要がなくなります。

Base64でエンコードされたイメージのURL例(小さなフォルダアイコン):

<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/ 
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExK 
cppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" /> 

私の主な質問は、より良い技術であると思われるのですか?たくさんの一時ファイルを作成していますか(オーバーヘッドがかかりますか?)このような大きなbase64でエンコードされた文字列を作成すると、メモリが不足する可能性がありますか?

答えて

1

私は最近同じ質問をしています。いくつかのベンチマークの後、データURIのアプローチが最良の賭けだったことが分かります。

Base64でエンコードされた画像の束を保存するのは高価な場合があります。しかし、一時ファイルを作成するためのオーバーヘッド、イメージデータのストリーミング、XHTMLRendererが一時ファイルを4回ヒットするのを待って、それを掃除する前に課税しています。

私の実験では、Base64イメージがより良いアプローチであることが判明しました。つまり、私は大きな画像ではどれほど真実のままであるかは分かりません。私の場合は、32x32のアイコン、80x80のロゴ、400x240の棒グラフ、そして1つの600x400のグラフィックでテストしていました。オーバヘッドの違いは、600x400のグラフィックを除いてすべて重要でしたが、実際にはごくわずかです。

(私の場合はジョープEggen-用サイドノートでは、PDF生成 時間が重要である。ユーザーがPDFボタンをクリックするとダウンロードがすぐに開始する予定です。)私は画像が上がらない理解して何から

+0

私はあなたのポイントを見ることができます、それを感謝します。しかし、PDFがMB範囲に達すると、私は応答性についてもっとリラックスしています。 ** EPS **のような画像も埋め込み可能です。 –

1

PDF生成は時間的に重要ではありません。 Base64に画像を埋め込むには、CPUとメモリのコストがかかりすぎます。これは、Base64のバルドデータをテンプレートパイプラインにドラッグし、おそらくBase64からバイナリに圧縮して圧縮します。私は埋め込まれたイメージが可能であることに気付かなかった。したがって、一時ファイルのオーバーヘッドはもっと確実な解決策です。確かに始める。もちろん両方のケースをベンチマークすることができます。

+0

とにかくHTMLRendererで圧縮されていませんが、テンプレート処理中に可能なメモリ割り当てについてのあなたの意見があります。 – BeRecursive