Java中Word转PDF解决方案

16 篇文章 0 订阅

一、实现功能

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不影响。


 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
可以使用 Apache POI 和 iText 库来实现 Java Word PDF。具体实现可以参考以下代码: ``` import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.xwpf.usermodel.XWPFDocument; import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfWriter; public class WordToPdfConverter { public static void main(String[] args) { try { // 读取 Word 文档 InputStream in = new FileInputStream("input.docx"); XWPFDocument document = new XWPFDocument(in); // 创建 PDF 文档 OutputStream out = new FileOutputStream("output.pdf"); Document pdfDoc = new Document(); PdfWriter.getInstance(pdfDoc, out); // 将 Word 文档内容写入 PDF 文档 pdfDoc.open(); pdfDoc.addTitle("Word to PDF"); pdfDoc.addAuthor("CSDN"); pdfDoc.addSubject("Convert Word to PDF using Java"); pdfDoc.addKeywords("Java, Word, PDF"); pdfDoc.addCreator("C知道"); pdfDoc.addCreationDate(); pdfDoc.addHeader("CSDN", "Java Word to PDF"); pdfDoc.newPage(); pdfDoc.setPageSize(document.getDocument().getPageSize()); pdfDoc.setMargins(document.getDocument().getPageMargins().getLeft(), document.getDocument().getPageMargins().getRight(), document.getDocument().getPageMargins().getTop(), document.getDocument().getPageMargins().getBottom()); document.write(pdfDoc); pdfDoc.close(); document.close(); out.close(); in.close(); System.out.println("Word to PDF conversion completed successfully!"); } catch (Exception e) { System.out.println("Exception occurred: " + e.getMessage()); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjunli

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值