1 需求背景
運營台賬功能需要將用戶上傳的doc、docx、wps格式的文檔進行在線預覽。(2月17日用戶提交需求)
運營台賬功能的“一鍵生成”功能需要生成PDF,並自動上傳以及下載至用戶端。(3月2日用戶提交需求)
2 方案研究
2.1 在線預覽
文件可能存在兩個來源,一、前端生成后用戶手動上傳;二、用戶手動創建文件后上傳。
程序生成的文件采用了jquery.wordexport.js實現,將html文本添加MSOffice文件頭后直接存儲為doc。
而用戶自己創建的文件則是由Micro Office或者WPS生成,這兩種文件存在本質性的區別。
因此為了兼容所有情況,需要對不同類型的文件進行統一處理。經過查詢各種資料,找到了kkFileView開源項目。
kkFileView項目為文件文檔在線預覽項目解決方案,對標業內付費產品有【永中office】【office365】【idocv】等。
使用spring boot搭建,易上手和部署,基本支持主流辦公文檔的在線預覽,如doc,docx,Excel,pdf,txt,zip,rar,圖片等等。
然而,開發的過程終究會遇到各種坎坷。使用jquery.wordexport.js生成doc文件,kkFileView無法正確渲染。因此考慮更換前端生成doc文檔插件。
經過測試,生成的doc文件如果在pc端打開后另存為docx格式后再上傳,kkFileView是可以正常渲染的。因此找到了Html-docx.js插件, 它可以將HTML轉換為docx,於是將其集成到開發環境中,就在我們以為一切都已經OK的時候,用戶提交了新的需求:需要將頁面導出為PDF。
2.2 生成PDF
與台賬功能十分相似的還有另外一個功能:月報。月報中也存在一鍵導出、上傳。而月報的頁面布局、樣式相對比較復雜,因此我們需要的還是直接將HTML文本轉換為PDF文檔。經過一番搜索后,找到了以下幾種方案。
序號 |
描述 |
備注 |
測試結果 |
1 |
前端繪制canvas,保存為圖片,后端將圖片生成PDF |
canvas |
1、 生成的圖片不清晰 2、 只能生成當前屏幕的截圖,頁面缺失 |
2 |
前端直接轉為PDF |
jspdf.js |
原理同上,結果同上 |
3 |
wkhtmltopdf |
服務端命令調用 |
1、 需要在服務器安裝wkhtmltopdf程序 2、 集成方式:Java調用shell命令將頁面地址傳入wkhtmltopdf工具來生成PDF 3、 pass原因:需要重構頁面;華為雲容器部署難以實現 |
4 |
Apache iText |
Jar包集成 |
1、 對HTML的css樣式渲染效果很差,導致生成的PDF樣式錯亂 2、 對HTML標簽要求嚴格,標簽未關閉則會渲染失敗 |
5 |
flying-saucer-pdf
|
Jar包集成 |
1、 基於Apache iText二次開發 2、 支持css樣式渲染 3、 也存在HTML標簽要求嚴格的問題,因台賬功能中包含富文本編輯器,無法保證渲染效果 |
6 |
Aspose.word |
Jar包集成 企業級收費產品 |
1、 收費 2、 暫未實現如何設置字體,導致在Linux部署時生成的文檔字體存在小小的問題 |
7 |
Spire.doc |
Jar包集成 企業級收費產品 |
1、 收費 2、 只能對通過Office創建的文檔進行轉換,對於使用html-docx.js生成的文檔無法轉換 |
8 |
Docx4j |
Jar包集成 |
1、 只能對通過Office創建的文檔進行轉換,對於使用html-docx.js生成的文檔無法轉換 2、 效率極低,50Kb的docx文檔轉換過程需要1分鍾以上 |
9 |
MdToPdf |
Jar包集成 |
1、 只支持markDown文件轉換為PDF 2、 無法渲染圖片 3、 無法完美渲染表格 |
經過多方對比,比較符合需求的只有方案6(Aspose.word)
萬幸的是,找到了熱心網友上傳的破解Jar包,無需設置Licence,生成的文檔中也沒有版權水印等信息。
3 集成Aspose.word
目前只存在一個問題,字體設置未生效。
在外網環境中,生成的PDF效果正常。
在內網環境中,文檔中部分文字顯示效果不理想,效果如下。
嘗試解決:
- 將外網機器中的“C:windows/fonts”中的所有字體拷貝至內網機器中並安裝,問題依舊未能解決。
- 查詢word官方文檔,在程序中添加了字體掃描路徑,問題依舊未能解決。
暫時放棄,直接在Linux環境進行部署測試。
在Linux環境部署后,新的問題出現了。
猜測這個問題應該是服務器未安裝中文字體導致的,因此將windows端的中文字體上傳至服務器,並安裝,問題解決。
4 華為雲部署
雲上環境和252測試系統區別很大,252是jar包部署,華為雲是docker環境部署。
在雲服務器上提前裝好了中文字體,然而在部署后,經過測試,中文字體依舊沒能正常渲染。
猜測原因可能是docker鏡像中不存在中文字體,而華為雲部署時上傳jar包后,打鏡像的過程是華為雲實現的,無法進行介入,無法安裝字體。
與華為雲負責人進行協調,答復是不支持,並且不提供幫助。
在多方同事的協助下,進行了兩個方向的研究,一、程序配置字體掃描及字體設置;二、依賴自帶中文字體的基礎鏡像手動構建docker鏡像。