Java中Word转PDF解决方案
一、实现功能
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.****.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不影响。