三種Java下生成PDF方式的比較

最近因項目需要用Java下生成PDF文檔,Google了很久,發現目前開源、成熟、穩定的第三方包只有iText。而用iText生成PDF有三種方式:

  1. 調用iText API,用代碼“寫”出PDF,依賴包:com.itextpdf:itextpdf:5.5.11
  2. 結合XmlWorker,從HTML模板生成PDF,依賴包:com.itextpdf.tool:xmlworker:5.5.11
  3. 結合Flying Saucer,從HTML模板生成PDF,依賴包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6

三種方式的教程,網上多的很,我就不累述了。三種方式我都嘗試了,發現它們渲染出來的效果有所不同。而且,每一種方式,不同的字體,渲染出來的效果也不同。

使用微軟雅黑

微軟雅黑字體是很漂亮的,我同時也用Word生成了PDF,互相比較下。以下都是用Adobe Reader v11.0.16下打開文檔的截圖,縮放比例150%。

Word生成的PDF
iText“手工”寫的PDF
XmlWorker從HTML模板生成的PDF
Flying Saucer從HTML模板生成的PDF

從效果上看,Word渲染出來的PDF最好看,最平滑(反失真最好),而且ASCII字符與漢字之間還留了間距,看起來更舒適。iText、XmlWorker、Flying Saucer則越來越不平滑,即反失真越來越差,連畫的Table的邊框都越來越粗。

微軟雅黑下的三種方式的對比花了我一下午加一個晚上的時間,差不多14個小時,包括Google代碼,精疲力盡。XmlWorker和Flying Saucer雖然都很方便,但都有失真,對比着Word和iText生成的,心裏總是不服氣,強迫症又犯了。若是用iText手工“寫”,要是客戶想要換個顏色呢,老子還要去改代碼,NM更不願意了。用Word生成更不用想了,總不能每次生成報告,都真的去手工敲一遍吧,我是程序員啊喂。

Flying Saucer更的是,它在加載Font的時候,會去解析Font的各種參數,且會改寫font weight發火。我指定的雅黑字體的font weight都是400,然後它加載後都改成了396,直到我在HTML模板裏強行指定font-weight爲100,才渲染成跟400一樣的粗細。如果不overwrite font-weight的話,它就把400渲染成900的效果,真TMD。發火

惆悵,先睡了……一覺睡醒,忽然靈光一現,XmlWorker和Flying Saucer的失真會不會是因爲字體造成的?於是決定換蘋果的萍方黑體試試。

使用萍方黑體

這盤沒有使用Word或iText生成PDF:

XmlWorker生成的PDF
Flying Saucer生成的PDF

Much better!但Flying Saucer渲染的還是比XmlWorker要粗一點.。

所以結論如下:從便利性、渲染效果綜合來看,還是用XmlWorker好些。雖然渲染效果沒有達到極致,但十分有利於用戶自定義模板。


原始截圖:http://pan.baidu.com/s/1geM8XtL

PS:CSDN居然不提供附件功能,差評!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章