2012-01-12 54 views
2

我有一個項目,我需要生成一個PDF文件。在這個PDF中,我必須插入一個文本主體以及四個或五個大圖像(大約800px * 1000px)。爲了使這種靈活性更加靈活,我選擇將FreeMarker與XHTMLRenderer(flying-saucer)結合使用。內聯圖像和臨時文件(Java XHTML-> PDF生成)

我現在面臨着兩個選擇:

  1. 創建圖像,並將其保存爲臨時文件到磁盤。然後使用FreeMarker處理.xhtml模板(將其保存到磁盤)並將處理後的.xhtml文件URL傳遞給XHTMLRenderer以生成PDF。所有這些創建的文件(bar PDF)將使用File.createTempFile創建。這將允許FreeMarker從磁盤上拾取圖像(就像它們是在XHTML中鏈接的圖像一樣)
  2. 處理.xhtml模板並將其保存在內存中。將圖像作爲base64編碼數據URL傳遞給模板。這將消除保存任何臨時文件的需要,因爲FreeMarker的輸出可以直接傳遞給XHTMLRenderer。

Base64編碼圖片網址示例(一個小的文件夾圖標):

<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條形圖和一個600x400圖形。除了600x400圖形之外,其他所有內容在開銷方面的差異都非常顯着,在這種情況下它幾乎可以忽略不計。

(旁註爲喬普Eggen-在我的情況下,生成PDF 時間是至關重要的。用戶點擊一個按鈕的PDF,預計下載立即開始。)

+0

我可以看到您的觀點,非常感謝。如果PDF達到MB範圍,我對於響應能力更加寬鬆。作爲** EPS **的圖像也可以嵌入。 – 2012-01-16 13:51:16

1

PDF生成不是時間關鍵 - 有人甚至可能考慮加速溝通。在Base64中嵌入圖像需要花費更多的CPU和內存,而且成本高昂的模板轉換:Base64 buld數據在模板流水線中拖動,然後可能從Base64解碼爲二進制文件進行壓縮。我甚至不知道嵌入的圖像是可能的。所以臨時文件的開銷是一個更可靠的解決方案。當然要開始。當然,可以對兩種情況進行基準測試

+0

從我瞭解的圖像AREN無論如何,我都不會在HTMLRenderer中進行壓縮 - 但我確實看到了您在模板處理過程中可能分配內存的觀點 – BeRecursive 2012-01-13 13:43:37