由于工作所需,最近花時間研究了html轉(zhuǎn)換為pdf的功能。html轉(zhuǎn)換為pdf的關(guān)鍵技術(shù)是如何處理網(wǎng)頁中復雜的css樣式,通過在網(wǎng)上收集資料,發(fā)現(xiàn)目前html 轉(zhuǎn)換為pdf的解決方案主要分為三類:
客戶端模式:前后臺調(diào)用客戶端程序,利用客戶端程序的功能完成pdf文件轉(zhuǎn)換。本次測試工具有:wkhtmltopdf和PhantomJS。java jar包解析類模式:java代碼解析css樣式,翻譯html文件為pdf文件。本次測試類有:IText,F(xiàn)lying Sauser,PD4ML。js 前端解析模式:js前端解析html文件為pdf文件,本次測試案例有:html2canvas。
本次針對網(wǎng)上介紹的方案,結(jié)合實際項目的需求,做一一測試,在性能和功能方面做如下分析。
1.測試頁面介紹
通過查看各個轉(zhuǎn)換案例在網(wǎng)上的介紹,簡單的html樣式,一般的表格樣式在做pdf文件轉(zhuǎn)換時,以上的方案均支持。但考慮到實際業(yè)務(wù)的需要,本次測試特意用到了bootstrap (v 3.3.6)的css樣式,同時頁面也應用了css3的新特性。基于這樣的新特性編寫一個靜態(tài)的html頁面,html頁面在瀏覽器中的展示效果如下:
2.wkhtmltopdf測試
wkhtmltopdf是一個使用webkit網(wǎng)頁渲染引擎開發(fā)的用來將html轉(zhuǎn)成 pdf的工具,可以跟多種腳本語言進行集成來轉(zhuǎn)換文檔。官網(wǎng)地址http://wkhtmltopdf.org/
技術(shù)特點:Wkhtmltopdf可以直接把瀏覽器中瀏覽的網(wǎng)頁轉(zhuǎn)換成一個pdf,他是一個把html頁面轉(zhuǎn)換成pdf的軟件(需要安裝在服務(wù)器上)。使用時可通過java代碼調(diào)用cmd指令完成網(wǎng)頁轉(zhuǎn)換為pdf的功能。
功能測試:直接在cmd里輸入測試指令,可查看處理進度。
第一個參數(shù):wkhtmltopdf.exe所在的路徑
第二個參數(shù):需要轉(zhuǎn)換為pdf的html頁面
第三個參數(shù):pdf文件路徑及文件名
頁面導出效果如下:
測試說明:
通過測試發(fā)現(xiàn),wkhtmltopdf對bootstap的CSS樣式整體支持較好。對css3的新特性如圓形圖片樣式支持行不好。部分頁面樣式會失效。對于圖表展示,eachart圖表導出程序會報錯,不支持。不過echart有圖表轉(zhuǎn)換為圖片的接口,可通過獲取圖片地址的方式導出到pdf中。
3.PhantomJS測試
PhantomJS是一個基于webkit內(nèi)核的無頭瀏覽器,即沒有UI界面,即它是一個瀏覽器,只是其內(nèi)的點擊、翻頁等人為相關(guān)操作需要程序設(shè)計實現(xiàn)。它提供javaScript API接口,即通過編寫JS程序可以直接與webkit內(nèi)核交互,在此之上可以結(jié)合java語言等,通過java調(diào)用js等相關(guān)操作,從而解決了以前c/c++才能比較好的基于webkit開發(fā)優(yōu)質(zhì)采集器的限制。它同時提供windows、linux、mac等不同os的安裝使用包,也就是說可以在不同平臺上二次開發(fā)采集項目或是自動項目測試等工作。官網(wǎng)地址http://phantomjs.org/
PhantomJS可做網(wǎng)頁分析,功能很多,本次僅調(diào)用網(wǎng)頁的截圖功能。在cmd中的測試如下:
測試頁面導出效果如下:
測試說明:
通過測試發(fā)現(xiàn),PhantomJS對bootstap的樣式支持較好。對css3的新特性如圓形圖片樣式支持行不好。部分頁面樣式會失效。對于echart圖表展示,也可直接導出。效果如下:
3.IText和Flying Sauser
IText實現(xiàn)html2pdf,速度快,糾錯能力差,支持中文(要求HTML使用unicode編碼),但中支持一種中文字體,開源。Flying Sauser實現(xiàn)html2pdf,糾錯能力差,支持多種中文字體(部分樣式不能識別),開源。
技術(shù)特點:基于java編程將html的css樣式做解析處理,目前僅對較簡單的頁面和樣式支持。對于css3的樣式和關(guān)聯(lián)復雜的css樣式兼容性極差。當頁面內(nèi)容較長時,處理時間慢。參考地址:https://code.google.com/archive/p/flying-saucer/
測試結(jié)果:本實驗的測試頁面無法出來,普通的測試頁面效果如下:
測試說明:
通過測試發(fā)現(xiàn),IText和Flying Sauser這兩個開源項目對css3的兼容性基本不行,通過查閱資料,發(fā)現(xiàn)這種技術(shù)比較陳舊,這個開源項目現(xiàn)在也沒有更新和維護了。對于簡單表格,統(tǒng)計數(shù)據(jù)的導出,更新的技術(shù)有bootstrap table,easyui datagrid表格導出。網(wǎng)上介紹的這種方案不建議使用。
4.PD4ML測試
PD4ML是純Java的類庫,使用HTML、CSS作為頁面布局和內(nèi)容定義格式來生成PDF文檔的強大工具,可以簡化最終用戶生成PDF的工作。參考網(wǎng)站:http://www.pd4ml.com
該軟件的優(yōu)點是: