目的

使用docx4j可以将 docx, pptx, xlsx 文件转为 pdf

添加依赖

首先,在pom.xml中引入相关依赖

<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>11.2.9</version>
</dependency>
<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-ReferenceImpl</artifactId><version>11.2.9</version>
</dependency>

转PDF

下面两套代码均可以实现

代码1

private static boolean docx4jConvert(String src, String dst) {OutputStream os = null;try {File srcFile = new File(src);WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(srcFile);FOSettings foSettings = Docx4J.createFOSettings();foSettings.setOpcPackage(mlPackage);OutputStream os = new FileOutputStream(dst);Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (Docx4JException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {if(os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}return false;
}

代码2

private static boolean docx4jConvert(String src, String dst) {OutputStream os = null;try {File srcFile = new File(src);WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(srcFile);os = new FileOutputStream(dst);Docx4J.toPDF(mlPackage, os);return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (Docx4JException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {if(os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}return false;
}

解决乱码问题

运行上面代码,程序打印一切正常,并输出pdf文件。但是你会发现PDF里,只要有中文的地方,都是乱码。这是由于在转换时没有找到对应字体导致的

PDF乱码部分节选

因此我们需要在这里手动加载中文字体。如果该字体不存在于系统的字体库,我们需要使用 addPhysicalFonts 方法进行加载

    /*** 设置字体,解决中文乱码的问题*/private static void setFontMapper(WordprocessingMLPackage mlPackage) throws Exception {Mapper fontMapper = new IdentityPlusMapper();// 加载本地字体//PhysicalFonts.addPhysicalFonts("SimSun", new URL("/fonts/SIMSUN.TTC"));fontMapper.put("隶书", PhysicalFonts.get("LiSu"));fontMapper.put("宋体",PhysicalFonts.get("SimSun"));fontMapper.put("微软雅黑",PhysicalFonts.get("Microsoft Yahei"));fontMapper.put("黑体",PhysicalFonts.get("SimHei"));fontMapper.put("楷体",PhysicalFonts.get("KaiTi"));fontMapper.put("新宋体",PhysicalFonts.get("NSimSun"));fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));fontMapper.put("宋体扩展",PhysicalFonts.get("simsun-extB"));fontMapper.put("仿宋",PhysicalFonts.get("FangSong"));fontMapper.put("仿宋_GB2312",PhysicalFonts.get("FangSong_GB2312"));fontMapper.put("幼圆",PhysicalFonts.get("YouYuan"));fontMapper.put("华文宋体",PhysicalFonts.get("STSong"));fontMapper.put("华文中宋",PhysicalFonts.get("STZhongsong"));fontMapper.put("等线", PhysicalFonts.get("SimSun"));fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));//解决宋体(正文)和宋体(标题)的乱码问题PhysicalFonts.put("PMingLiU", PhysicalFonts.get("SimSun"));PhysicalFonts.put("新細明體", PhysicalFonts.get("SimSun"));//宋体&新宋体PhysicalFont simsunFont = PhysicalFonts.get("SimSun");fontMapper.put("SimSun", simsunFont);mlPackage.setFontMapper(fontMapper);}

之后即可正常显示了

转换限制

docx4j 只能转换 docx/pptx/xlsx 这三种类型的文件,如果你使用诸如 txt、doc 这类文件,就会报如下错误

ClassNotFoundException

javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.

这是由于,你在 pom.xml 中只引用了 docx4j-export-fo,却没用引用 JAXB 的实现。在 docx4j 的官网中可以找到该模块的实现库 docx4j-JAXB-ReferenceImpl 。注意,不要去引用 Javax 的那些 JAXB 库或者其他相关库,因为这样会引入更多错误

注意:如果你的代码用的是JDK8,那么只能使用上图8.3.1的版本;如果是JDK11及以上那么使用11.2.9版本。版本使用错会导致编译不过

docx4j 将word2007版转为pdf相关推荐

  1. php html转为pdf文件,php使用wkhtmltopdf实现html转pdf

    项目中有需求将html页面实时转为pdf并提供下载.经过各种查找比对,最终使用了wkhtmltopdf工具来实现. wkhtmltopdf,可以很方便的将输入的url渲染并打印成pdf文件.当然也有一 ...

  2. Word制作生成html模板替换动态值为占位符使用Java转为pdf文件

    引言 最近开发遇到一个需求,公司法务给了一个word合同模板,需要替换里面的动态值为具体业务数据,然后生成pdf文件进行电子签章. 在网上找寻各种方法,发现很多都是需要特定工具,或者代码不全运行不起来 ...

  3. 用C#实现实时监测文件夹,把word/excel/ppt自动转为pdf

    很久没更新了,前段时间在准备软考,最近也忙着单位新系统的开发.所以也就没更新了,等后面几个项目做好了,我在项目分享出来!! 由于新开发的信息系统,原来旧版的信息系统,在查看文件时,都需要下载到本地,然 ...

  4. Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j

    Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...

  5. CAD手机看图软件中怎么将CAD图纸转为PDF/图片格式?

    在使用CAD手机看图软件查看CAD图纸的时候,偶尔会遇到需要将CAD图纸转为PDF/图片格式的情况,这个时候该如何进行操作呢?下面给大家介绍一下在CAD手机看图软件浩辰CAD看图王中是如何进行操作的吧 ...

  6. ITEXT将HTML转为PDF内容被截断处理及相关问题总结

    ITEXT将HTML转为PDF内容被截断处理及相关问题总结 文章目录 ITEXT将HTML转为PDF内容被截断处理及相关问题总结 前言 一.ITEXT将HTML转为PDF内容被截断处理(一) 1.问题 ...

  7. 将电子书转为PDF涉及的PDF拆分合并总结

    因为阅读网上的很多电子书存在翻页繁琐和查找不方便的问题,也很难在网站上做笔记.故查阅部分资料想要自己写一个小爬虫,然后可以将爬取到的电子书内容页面(html格式)最终保存成PDF格式.故编写如下爬虫代 ...

  8. word文档转为PDF以及多种文档格式转换

    word文档转为PDF以及多种文档格式转换 项目地址:https://gitee.com/Jakewabc/word-of-pdf.git 相关案例: https://github.com/aspos ...

  9. jacob操作word查找替换转为pdf

    最近需要简单操作word文档后转为pdf,即查找word中的替换字符将其替换为需要的参数,最后生成pdf,由于服务器是在window平台下,所以选择了较为简单的jacob去实现这一功能. 工具:mye ...

最新文章

  1. zookeeper模拟监控服务节点宕机
  2. XDC约束技巧之时钟篇
  3. Intellij IDEA 使用Spring-boot-devTools无效解决办法
  4. MySQL是自主可控的吗_国产处理器那么多,究竟有哪些,是真正的“自主可控”?...
  5. 【 Thread】创建线程的2种方法
  6. Time Series Analysis
  7. python 双层for循环_day05-Python运维开发基础(双层循环、pass/break/continue、for循环)...
  8. IDA动态调试Android的DEX文件
  9. oracle管理表空间和数据文件(笔记)
  10. java图的邻接表实现两种方式及实例应用分析
  11. 线性回归实现人脸识别——ORL数据集
  12. 《Java语言程序设计与数据结构》编程练习答案(第七章)(一)
  13. 【采样算法】拉丁超立方采样
  14. kubeadm部署k8s多master节点的高可用集群
  15. MATLAB plot3绘制的不是三维图
  16. 大数据实战二十四课 - Spark SQL04
  17. lombok报错 InvalidDefinitionException: No serializer found
  18. SAP ECC 和 S4HANA Material 物料库存管理的模型比较
  19. 怎么在linux上添加网络打印机,Ubuntu下安装安装hp网络打印机图解
  20. Telephony理解

热门文章

  1. Carplay wire / wireless
  2. 2020下半年新机最新消息_2020年下半年最期待的手机盘点
  3. java 打包工具jar,打包工具类为jar包,注意事项
  4. Ureport2——自定义文件缓存
  5. 关于The remote certificate is invalid according to the validation procedure(远程证书验证过程无效)的解决方案
  6. 基于landsat7数据的TDVI指标计算
  7. Chrome驱动程序无法打开Chrome浏览器
  8. 人生该怎么才有意义?这么忙碌的活着到底是为了什么!
  9. vue webpack压缩代码_vue.js - 解决vue-cli打包后自动压缩代码
  10. 经颅磁刺激常用定位方法