Word作为目前主流的文本编辑软件之一,功能十分强大,应用人群广,但是它也存在一些问题。像是Word文件在不同软件或操作平台之间传输的时候,时不时会出现各种格式的“变化”,也会有点“不稳定”,例如内容和格式经常容易篡动。

相较于Word,pdf格式文件显然优秀不少。虽然在内容编辑和修改方面表现不佳,但pdf格式文件在不同平台和软件上的稳定性表现着实出色。日常办公中,越来越多的会选择将编辑好的Word文件转换成Pdf格式文件,然后再分享给第三方浏览。

如果只是1个Word文件转换成Pdf文件,简直so easy;10个Word文件转换成pdf文件,虽烦躁,但能忍;如果是将1000个word文件转换成pdf文件呢?这会估计一股无名之火直冲天灵盖,立马想摔电脑的冲动都有了。

但对于程序猿来说,操作起来显然会容易很多,正好接到一个任务,索性就来和大家分享一下:将docx转成PDF文档,还要以代码的方式实现批量操作。先后参考了Apache poi java库以及docx4j组件,于是选择以docx4j组件来进行文档操作。
第一批次的文档共90篇:

以下开始实现docx4j的文档转PDF功能:

一、下载依赖

docx4j所有的依赖jar包使用marven去处理还是蛮简洁的:

<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-JAXB-Internal</artifactId><version>8.2.4</version>
</dependency>
<dependency><groupId>org.docx4j</groupId><artifactId>docx4j-export-fo</artifactId><version>8.2.4</version>
</dependency>

就两个,短暂等待下载依赖之后发现,docx4j的依赖jar包还是挺多的:

手动开始敲代码吧。

二、代码实现

package com.convert.test;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;import org.docx4j.Docx4J;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;public class ConvertTest {public static void main(String[] args) {word2pdf("D:\\tran\\2.doc", "D:\\tran\\2.pdf");}public static void word2pdf(String source, String target) {try {WordprocessingMLPackage pkg = Docx4J.load(new File(source));Mapper fontMapper = new IdentityPlusMapper();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("FangSong"));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"));pkg.setFontMapper(fontMapper);Docx4J.toPDF(pkg, new FileOutputStream(target));} catch (FileNotFoundException e) {e.printStackTrace();} catch (Docx4JException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}

三、转换结果

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Using pdbs 420=7mm
Using pdbs 420=7mm

有一点报错,不过并不影响pdf的生成,打开生成的pdf,内容也是完整的。算是完成了吧,只要再写一个for循环,去遍历所有的文档就可以了。但是后来发现转换下来的pdf数量少了10个,所有的文档并没有全都转换成功。

四、后续研究

排查一番,发现这些文档中有10个doc文档,就该就是这10个没有成功了,单独拎出来转换一下,结果就报错了:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
org.docx4j.openpackaging.exceptions.Docx4JException: This file seems to be a binary doc/ppt/xls, not an encrypted OLE2 file containing a doc/pptx/xlsxat org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:612)at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:414)at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:287)at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:265)at org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(WordprocessingMLPackage.java:168)at org.docx4j.Docx4J.load(Docx4J.java:232)at com.convert.test.ConvertTest.word2pdf(ConvertTest.java:26)at com.convert.test.ConvertTest.main(ConvertTest.java:19)

This file seems to be a binary doc/ppt/xls, not an encrypted OLE2 file containing a doc/pptx/xlsx
“此文件似乎是一个二进制文件doc/ppt/xls,而不是包含doc/pptx/xlsx的加密OLE2文件”
貌似docx4j并不能完美的支持所有的word文档,至少doc文档并不能支持。我想到之前有小伙伴也遇到过这样问题,后来说是用了永中的office转换,索性今天自己也来尝试一下。

三下五除二,一顿操作,永中office官网上的office直接就能把我的doc文档转成html展示在浏览器上,心细如尘的我,还在其官网上发现有一款“PDF工具集”的产品:

在文章的右侧有“开发者”选项,可以直接点击它进入到转换的界面。进入之后,发现永中支持的格式还是不少的,在页面的上半部分就列出了当前支持的所有格式:

继续向下滚动鼠标滚轮,到达文档转换的位置:

可以直接点击上传一份doc文档,等待上传完毕,就可以直接将doc文档转换成PDF文档了,这样一来,不管多少个文件,都能一键实现word文件转换成pdf文件,小伙伴们再也不用担心了。

五、总结

其实,目前市面上已有的文档转换类的产品非常多,市场竞争十分激烈。但依旧不妨碍有好的产品涌现出来,受到一众用户的喜欢和追捧。

一款好的产品一定是契合用户的本性,能够对用户形成一种强大的吸引力,将其牢牢“粘住”。就像永中的这款产品,紧跟市场需求,更看到了用户的痛点,真正做到用一款简单、实用、好操作的产品,赢得市场,更赢得了用户!

分享+收藏+点赞,一键三连!!!

轻松搞定——JAVA实现DOC转PDF功能相关推荐

  1. 【Java多线程】轻松搞定Java多线程(一)

    轻松搞定Java多线程(一) Java多线程详解(一) 1. 线程简介 2.线程的创建 2.1 三种创建方式 2.2 Thread 2.3 实现Runnable 2.3.1 初识并发问题 2.3.2 ...

  2. 【视频教程】轻松搞定Java Web面试

    开心一笑 [唐僧师徒四人取经路上,看到一朵花,娇艳欲滴! 唐僧道:徒儿们,不如我们就以此花来作诗吧! 悟空想到花果山的一草一木,道:花果山中随处见! 沙僧想到流沙河的巨浪,道:流沙河中不曾有! 八戒想 ...

  3. 轻松搞定java高薪

    2019独角兽企业重金招聘Python工程师标准>>> 找到一份高薪的java工作,从程序员走向高级程序员.架构师.分析员,是所有java程序员们的追求. 找一份好工作,自然要看工作 ...

  4. pdf转word用python轻松搞定_使用Python将PDF转化为word

    60行Python代码,实现多线程PDF转Word 分解任务 把PDF转为Word,分几步?两步,第一步读取PDF文件,第二步写入Word文件. 是的,就是这么简单,借助Python第三方包,可以轻松 ...

  5. 七牛云这个API,让我轻松搞定Banner背景自动切换的功能

    一.背景概述 我是谁?我是一名前端攻城狮,这周刚到公司不久,我司的产品经理就跑到我面前说:"浪哥,昨晚我看到某 APP 首页 Banner 切换时,Banner 区域的背景色会跟随 Bann ...

  6. 实用小工具-----python3 pdf2docx轻松搞定pdf转word

    轻松搞定简单版本非图片pdf转doc 轻松搞定简单版本非图片pdf转doc 在我们工作学习中,遇到很多pdf文件,无法编辑,针对这个问题我,我们用python 的pdf2doc就能很好的解决这个问题, ...

  7. 渲染预览PDF文档,轻松搞定,这方案真香!

    渲染预览PDF文档,轻松搞定,这方案真香! 1.前言 2.列举一些文档预览解决方案: 3.列举一些文档解析生成解决方案: 4.案列赏析 5.准备工作: 6.模板讲解: 7.代码实现: 8.效果图: 9 ...

  8. 九十七、轻松搞定Python中的PDF办公自动化系列

    @Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  9. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null

    轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null 参考文章: (1)轻松搞定项目中的空指针异常Caused by: java.l ...

  10. 韩顺平轻松搞定网页设计(html+css+js),韩顺平轻松搞定网页设计方案(html+css+js)之javascript现场授课笔记(完整版).doc...

    2011韩顺平轻松搞定网页设计(html+css+js)之 javascript现场授课笔记(完整版) 视频18整和19的前半部分不用看 Javascript的基本介绍 JS是用于WEB开发的脚本语言 ...

最新文章

  1. php的udp数据传输,python实现udp数据报传输的方法
  2. Opencv笔记(九)——图像阈值
  3. 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
  4. 机器学习之格式变化——reshape(-1,1)
  5. Ambari离线部署Hadoop集群踩到的坑
  6. HTML布局是外边距咋表示,布局 页面设置百分比 子元素如何设置外边距?
  7. jssdk 保存文件到手机_手机混用闪存到底是真是假?教你查手机闪存型号
  8. 为什么 SQL 程序员也要懂 Python?
  9. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案
  10. 国家开放大学2021春1067知识产权法题目
  11. spider RPC过滤器
  12. “一夜成名”需要多久?他花了20年!
  13. 190306每日一句
  14. NDK开发基础④增量更新之客户端合并差分包
  15. Discuz仿集思街淘宝客网站模板/粉色淘客模板
  16. 数据采集和数据预处理
  17. matlab2010b支持svmlib
  18. 一款好用、易扩展的文件解析引擎,是怎么演变而来的
  19. javascript 字符串的排列与组合
  20. 【Tableau】时间维度

热门文章

  1. 「公众号吸粉神级插件」实现网站下载文件需要公众号获取验证码
  2. FLASH闪存原理与实验
  3. 思维▍决定你视野和眼光的16个顶级思维模型
  4. Ajax请求下载文件
  5. Caught FileNotFoundError in DataLoader worker process 0.
  6. shal+php,PHP微信开发——第二弹
  7. 数字后端基本概念介绍Wire
  8. 惠斯通电桥称重传感器检测原理
  9. 清理android根目录垃圾,安卓清理君——清除手机垃圾
  10. cad卸载不干净_BarTender卸载卸不干净的解决技巧