轻松搞定——JAVA实现DOC转PDF功能
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功能相关推荐
- 【Java多线程】轻松搞定Java多线程(一)
轻松搞定Java多线程(一) Java多线程详解(一) 1. 线程简介 2.线程的创建 2.1 三种创建方式 2.2 Thread 2.3 实现Runnable 2.3.1 初识并发问题 2.3.2 ...
- 【视频教程】轻松搞定Java Web面试
开心一笑 [唐僧师徒四人取经路上,看到一朵花,娇艳欲滴! 唐僧道:徒儿们,不如我们就以此花来作诗吧! 悟空想到花果山的一草一木,道:花果山中随处见! 沙僧想到流沙河的巨浪,道:流沙河中不曾有! 八戒想 ...
- 轻松搞定java高薪
2019独角兽企业重金招聘Python工程师标准>>> 找到一份高薪的java工作,从程序员走向高级程序员.架构师.分析员,是所有java程序员们的追求. 找一份好工作,自然要看工作 ...
- pdf转word用python轻松搞定_使用Python将PDF转化为word
60行Python代码,实现多线程PDF转Word 分解任务 把PDF转为Word,分几步?两步,第一步读取PDF文件,第二步写入Word文件. 是的,就是这么简单,借助Python第三方包,可以轻松 ...
- 七牛云这个API,让我轻松搞定Banner背景自动切换的功能
一.背景概述 我是谁?我是一名前端攻城狮,这周刚到公司不久,我司的产品经理就跑到我面前说:"浪哥,昨晚我看到某 APP 首页 Banner 切换时,Banner 区域的背景色会跟随 Bann ...
- 实用小工具-----python3 pdf2docx轻松搞定pdf转word
轻松搞定简单版本非图片pdf转doc 轻松搞定简单版本非图片pdf转doc 在我们工作学习中,遇到很多pdf文件,无法编辑,针对这个问题我,我们用python 的pdf2doc就能很好的解决这个问题, ...
- 渲染预览PDF文档,轻松搞定,这方案真香!
渲染预览PDF文档,轻松搞定,这方案真香! 1.前言 2.列举一些文档预览解决方案: 3.列举一些文档解析生成解决方案: 4.案列赏析 5.准备工作: 6.模板讲解: 7.代码实现: 8.效果图: 9 ...
- 九十七、轻松搞定Python中的PDF办公自动化系列
@Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null 参考文章: (1)轻松搞定项目中的空指针异常Caused by: java.l ...
- 韩顺平轻松搞定网页设计(html+css+js),韩顺平轻松搞定网页设计方案(html+css+js)之javascript现场授课笔记(完整版).doc...
2011韩顺平轻松搞定网页设计(html+css+js)之 javascript现场授课笔记(完整版) 视频18整和19的前半部分不用看 Javascript的基本介绍 JS是用于WEB开发的脚本语言 ...
最新文章
- php的udp数据传输,python实现udp数据报传输的方法
- Opencv笔记(九)——图像阈值
- 全面理解Javascript闭包和闭包的几种写法及用途--转载自https://www.cnblogs.com/yunfeifei/p/4019504.html...
- 机器学习之格式变化——reshape(-1,1)
- Ambari离线部署Hadoop集群踩到的坑
- HTML布局是外边距咋表示,布局 页面设置百分比 子元素如何设置外边距?
- jssdk 保存文件到手机_手机混用闪存到底是真是假?教你查手机闪存型号
- 为什么 SQL 程序员也要懂 Python?
- Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案
- 国家开放大学2021春1067知识产权法题目
- spider RPC过滤器
- “一夜成名”需要多久?他花了20年!
- 190306每日一句
- NDK开发基础④增量更新之客户端合并差分包
- Discuz仿集思街淘宝客网站模板/粉色淘客模板
- 数据采集和数据预处理
- matlab2010b支持svmlib
- 一款好用、易扩展的文件解析引擎,是怎么演变而来的
- javascript 字符串的排列与组合
- 【Tableau】时间维度