docx4j 将word2007版转为pdf
目的
使用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相关推荐
- php html转为pdf文件,php使用wkhtmltopdf实现html转pdf
项目中有需求将html页面实时转为pdf并提供下载.经过各种查找比对,最终使用了wkhtmltopdf工具来实现. wkhtmltopdf,可以很方便的将输入的url渲染并打印成pdf文件.当然也有一 ...
- Word制作生成html模板替换动态值为占位符使用Java转为pdf文件
引言 最近开发遇到一个需求,公司法务给了一个word合同模板,需要替换里面的动态值为具体业务数据,然后生成pdf文件进行电子签章. 在网上找寻各种方法,发现很多都是需要特定工具,或者代码不全运行不起来 ...
- 用C#实现实时监测文件夹,把word/excel/ppt自动转为pdf
很久没更新了,前段时间在准备软考,最近也忙着单位新系统的开发.所以也就没更新了,等后面几个项目做好了,我在项目分享出来!! 由于新开发的信息系统,原来旧版的信息系统,在查看文件时,都需要下载到本地,然 ...
- Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j
Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...
- CAD手机看图软件中怎么将CAD图纸转为PDF/图片格式?
在使用CAD手机看图软件查看CAD图纸的时候,偶尔会遇到需要将CAD图纸转为PDF/图片格式的情况,这个时候该如何进行操作呢?下面给大家介绍一下在CAD手机看图软件浩辰CAD看图王中是如何进行操作的吧 ...
- ITEXT将HTML转为PDF内容被截断处理及相关问题总结
ITEXT将HTML转为PDF内容被截断处理及相关问题总结 文章目录 ITEXT将HTML转为PDF内容被截断处理及相关问题总结 前言 一.ITEXT将HTML转为PDF内容被截断处理(一) 1.问题 ...
- 将电子书转为PDF涉及的PDF拆分合并总结
因为阅读网上的很多电子书存在翻页繁琐和查找不方便的问题,也很难在网站上做笔记.故查阅部分资料想要自己写一个小爬虫,然后可以将爬取到的电子书内容页面(html格式)最终保存成PDF格式.故编写如下爬虫代 ...
- word文档转为PDF以及多种文档格式转换
word文档转为PDF以及多种文档格式转换 项目地址:https://gitee.com/Jakewabc/word-of-pdf.git 相关案例: https://github.com/aspos ...
- jacob操作word查找替换转为pdf
最近需要简单操作word文档后转为pdf,即查找word中的替换字符将其替换为需要的参数,最后生成pdf,由于服务器是在window平台下,所以选择了较为简单的jacob去实现这一功能. 工具:mye ...
最新文章
- zookeeper模拟监控服务节点宕机
- XDC约束技巧之时钟篇
- Intellij IDEA 使用Spring-boot-devTools无效解决办法
- MySQL是自主可控的吗_国产处理器那么多,究竟有哪些,是真正的“自主可控”?...
- 【 Thread】创建线程的2种方法
- Time Series Analysis
- python 双层for循环_day05-Python运维开发基础(双层循环、pass/break/continue、for循环)...
- IDA动态调试Android的DEX文件
- oracle管理表空间和数据文件(笔记)
- java图的邻接表实现两种方式及实例应用分析
- 线性回归实现人脸识别——ORL数据集
- 《Java语言程序设计与数据结构》编程练习答案(第七章)(一)
- 【采样算法】拉丁超立方采样
- kubeadm部署k8s多master节点的高可用集群
- MATLAB plot3绘制的不是三维图
- 大数据实战二十四课 - Spark SQL04
- lombok报错 InvalidDefinitionException: No serializer found
- SAP ECC 和 S4HANA Material 物料库存管理的模型比较
- 怎么在linux上添加网络打印机,Ubuntu下安装安装hp网络打印机图解
- Telephony理解
热门文章
- Carplay wire / wireless
- 2020下半年新机最新消息_2020年下半年最期待的手机盘点
- java 打包工具jar,打包工具类为jar包,注意事项
- Ureport2——自定义文件缓存
- 关于The remote certificate is invalid according to the validation procedure(远程证书验证过程无效)的解决方案
- 基于landsat7数据的TDVI指标计算
- Chrome驱动程序无法打开Chrome浏览器
- 人生该怎么才有意义?这么忙碌的活着到底是为了什么!
- vue webpack压缩代码_vue.js - 解决vue-cli打包后自动压缩代码
- 经颅磁刺激常用定位方法