最近在做一個Web項目,需要用戶把Word上傳然后展示到頁面榨呆,但是Word在線瀏覽的功能不及PDF看疗,因此需要將Word轉(zhuǎn)換成PDF然后展示出來。其中遇到許多問題益涧,特此記錄,如有不妥之處請指正驯鳖。
一闲询、實現(xiàn)功能
1、doc浅辙、docx都可轉(zhuǎn)換為PDF
2扭弧、word含有中文的轉(zhuǎn)換為PDF后可顯示
二、轉(zhuǎn)換步驟
word —> html —> pdf
三记舆、使用工具(Jar包)
1鸽捻、poi、itext(如下maven配置)
作用:poi:用于將word轉(zhuǎn)換為html泽腮;itext:將html轉(zhuǎn)換為pdf
2、jsoup(maven配置如下)
作用:poi可以將以docx結(jié)尾的word完美轉(zhuǎn)換為html诊赊,但是將以doc結(jié)尾的word轉(zhuǎn)換為html后meta厚满、img等標簽不閉合,導(dǎo)致使用itext將生成的html轉(zhuǎn)換為pdf時報錯碧磅,因此需要使用jsoup.parse方法使html規(guī)范碘箍。
四、上代碼
1鲸郊、word轉(zhuǎn)html
(1)doc結(jié)尾word(相對復(fù)雜)
(2)docx結(jié)尾word
(3)使用jsoup規(guī)范html并保存到磁盤
2丰榴、html轉(zhuǎn)pdf
五、問題
太棒啦秆撮,word終于可以轉(zhuǎn)換成pdf(可以升值加薪啦??)
別高興太早多艇,打開doc結(jié)尾的word轉(zhuǎn)換的pdf會發(fā)現(xiàn)所有的中文都不顯示,只有數(shù)字和英文像吻,本來十幾頁的word最后剩下幾頁;打開docx結(jié)尾的word轉(zhuǎn)換的pdf會發(fā)現(xiàn)更悲劇复隆,什么也不顯示拨匆,一個空白的文檔。捂著臉繼續(xù)研究挽拂。惭每。。。台腥。宏赘。
表急,聽我慢慢道來
1黎侈、中文顯示問題
原因:
中文在pdf中不顯示是因為XMLWorkHelper的parseXHtml方法在執(zhí)行過程中使用默認字體察署,而該字體不包含中文,因此不顯示中文峻汉。
解決方案:
parseXHtml方法還有一個重載方法贴汪,其中一個參數(shù)是FontProvider,F(xiàn)ontProvider是一個接口休吠,擴展接口使其擁有中文顯示功能(如下圖)扳埂。
項目中我的擴展類中使用宋體字(正式word文檔中使用該字體較多,simsun代表宋體)瘤礁,BaseFont.createFont的設(shè)置可以參考該文章http://blog.csdn.net/ol_beta/article/details/5926451阳懂,這里不再贅述。
至此柜思,中文不顯示問題已解決岩调。
2、docx結(jié)尾word轉(zhuǎn)pdf空白
原因:
打開docx結(jié)尾的word轉(zhuǎn)化的html文件酝蜒,發(fā)現(xiàn)body中有一個或多個div包裹內(nèi)層標簽誊辉,這些div設(shè)置了style的width值,width過大導(dǎo)致轉(zhuǎn)換的pdf空白亡脑。
解決方案:
我用的方法最簡單粗暴堕澄,在jsoup格式化完成后找到style然后替換為空。
注:該處的div指的是body中最直接的子div蛙紫,而這些div中的又包含的div不影響。
大功告成途戒,可以生成美美的PDF了坑傅。