一、實現功能
1、doc、docx都可轉換爲PDF
2、word含有中文的轉換爲PDF後可顯示
二、轉換步驟
word —> html —> pdf
三、使用工具(Jar包)
1、poi、itext(如下maven配置)
作用:poi:用於將word轉換爲html;itext:將html轉換爲pdf
poi配置
itext配置
poi、itext版本
2、jsoup(maven配置如下)
作用:poi可以將以docx結尾的word完美轉換爲html,但是將以doc結尾的word轉換爲html後meta、img等標籤不閉合,導致使用itext將生成的html轉換爲pdf時報錯,因此需要使用jsoup.parse方法使html規範。
jsoup配置
四、上代碼
1、word轉html
(1)doc結尾word(相對複雜)
doc結尾word轉html
(2)docx結尾word
docx結尾word轉html
(3)使用jsoup規範html並保存到磁盤
jsoup規範html
2、html轉pdf
html轉pdf
五、問題
太棒啦,word終於可以轉換成pdf(可以升值加薪啦😁)
打臉了吧
別高興太早,打開doc結尾的word轉換的pdf會發現所有的中文都不顯示,只有數字和英文,本來十幾頁的word最後剩下幾頁;打開docx結尾的word轉換的pdf會發現更悲劇,什麼也不顯示,一個空白的文檔。捂着臉繼續研究。。。。。。
表急,聽我慢慢道來
1、中文顯示問題
原因:
中文在pdf中不顯示是因爲XMLWorkHelper的parseXHtml方法在執行過程中使用默認字體,而該字體不包含中文,因此不顯示中文。
解決方案:
parseXHtml方法還有一個重載方法,其中一個參數是FontProvider,FontProvider是一個接口,擴展接口使其擁有中文顯示功能(如下圖)。
parseXHtml重載方法
擴展類(宋體字)
項目中我的擴展類中使用宋體字(正式word文檔中使用該字體較多,simsun代表宋體),BaseFont.createFont的設置可以參考該文章http://blog.csdn.net/ol_beta/article/details/5926451,這裏不再贅述。
至此,中文不顯示問題已解決。
2、docx結尾word轉pdf空白
原因:
打開docx結尾的word轉化的html文件,發現body中有一個或多個div包裹內層標籤,這些div設置了style的width值,width過大導致轉換的pdf空白。
罪魁禍首
解決方案:
我用的方法最簡單粗暴,在jsoup格式化完成後找到style然後替換爲空。
如style有width,替換之
注:該處的div指的是body中最直接的子div,而這些div中的又包含的div不影響。