今天产品丢给我一个需求,说用户希望在系统里上传 word 文档,然后能一键转成 pdf 格式。好家伙,乍一听还挺简单,但仔细想想,这需求门道可不少。咱们一点点来拆解。
一、需求分析
首先,用户说的 “word 文档” 其实挺宽泛的。word 文档有.doc和.docx两种常见格式,.doc是老版本的二进制格式,.docx是基于 xml 的压缩格式,处理方式完全不一样。另外,文档里可能有图片、表格、公式、超链接,甚至还会有页眉页脚,这些内容在转换过程中都得保证原样显示,不能丢东西、乱排版。
还有,从系统角度看,得考虑转换效率和稳定性。要是用户上传个几十 mb 的大文档,转换半天没反应,或者直接把服务器搞崩了,那肯定不行。最后,还得做好异常处理,比如文档格式不对、文件损坏,这些情况都得给用户友好的提示。
二、技术选型
明确需求后,就得找趁手的工具了。在 java 里,能把 word 转 pdf 的工具还真不少。
第一个想到的是 apache poi,它能读写 word 文档,但是它主要侧重于文档内容的操作,直接转 pdf 还得配合其他库,有点麻烦,而且对复杂格式支持不太好,就先 pass 掉。
然后是 aspose.words,这个库功能超强大,几乎能完美支持所有 word 格式和元素,转换效果也很好。但它是收费的,要是公司预算充足,其实是个不错的选择。
最后,我盯上了 docx4j。它是开源的,对.docx格式支持特别好,转换 pdf 也很方便,社区资料也多,遇到问题能找到不少解决方案。虽然对老版本.doc支持差点,但现在主流都是.docx,权衡之下,就它了!
三、spring boot 整合
确定用 docx4j 后,就开始把它集成到 spring boot 项目里。
先打开pom.xml文件,加依赖:
<dependency> <groupid>org.docx4j</groupid> <artifactid>docx4j</artifactid> <version>8.3.3</version> </dependency> <dependency> <groupid>org.docx4j</groupid> <artifactid>docx4j-export-fo</artifactid> <version>8.3.3</version> </dependency>
第一个依赖是 docx4j 的核心库,第二个是用来把 word 文档转成 pdf 的模块。加完依赖,maven 会自动把需要的 jar 包下载下来。
四、代码实现
接下来就是写代码了,咱们新建一个工具类wordtopdfconverter:
import org.docx4j.docx4j; import org.docx4j.fonts.identityplusmapper; import org.docx4j.openpackaging.packages.wordprocessingmlpackage; import org.docx4j.openpackaging.parts.wordprocessingml.maindocumentpart; import org.docx4j.pdf2htmlex.pdfsettings; import org.docx4j.utils.fonts.fontutils; import java.io.file; import java.io.fileoutputstream; import java.io.outputstream; public class wordtopdfconverter { public static void convert(string inputfilepath, string outputfilepath) { try { // 加载word文档 wordprocessingmlpackage wordmlpackage = wordprocessingmlpackage.load(new java.io.file(inputfilepath)); // 处理字体,解决中文乱码问题 fontutils.setfontinfo(wordmlpackage); identityplusmapper fontmapper = new identityplusmapper(); fontmapper.put("隶书", "lisu"); fontmapper.put("宋体", "simsun"); fontmapper.put("黑体", "simhei"); fontmapper.put("楷体", "kaiti"); wordmlpackage.setfontmapper(fontmapper); // 获取文档的主部分 maindocumentpart documentpart = wordmlpackage.getmaindocumentpart(); // 创建pdf设置 pdfsettings pdfsettings = new pdfsettings(); // 设置字体嵌入,防止在其他设备上显示异常 pdfsettings.setfontembeddingenabled(true); // 执行转换 outputstream os = new fileoutputstream(new file(outputfilepath)); docx4j.topdf(wordmlpackage, os, pdfsettings); os.close(); system.out.println("转换成功!"); } catch (exception e) { e.printstacktrace(); system.out.println("转换失败:" + e.getmessage()); } } }
代码解释:
- wordprocessingmlpackage.load方法加载指定路径的 word 文档。
- 处理字体部分,因为默认可能会出现中文乱码,通过identityplusmapper指定常用中文字体的映射关系。
- pdfsettings用来配置 pdf 转换的参数,这里开启了字体嵌入,这样生成的 pdf 在其他设备上打开,字体也不会错乱。
- 最后用docx4j.topdf方法执行转换,把转换后的内容输出到指定的文件路径。
在 spring boot 的 controller 里调用这个方法,就能提供转换接口了:
import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.multipartfile; import java.io.file; import java.io.ioexception; import java.util.uuid; @restcontroller @requestmapping("/convert") public class wordtopdfcontroller { @postmapping public string convertwordtopdf(@requestparam("file") multipartfile file) { try { // 生成临时文件路径 string originalfilename = file.getoriginalfilename(); string tempfilepath = system.getproperty("java.io.tmpdir") + file.separator + uuid.randomuuid() + "_" + originalfilename; file.transferto(new file(tempfilepath)); // 生成输出pdf文件路径 string outputfilepath = system.getproperty("java.io.tmpdir") + file.separator + uuid.randomuuid() + ".pdf"; // 执行转换 wordtopdfconverter.convert(tempfilepath, outputfilepath); // 返回下载链接或者处理逻辑 return "转换成功,pdf路径:" + outputfilepath; } catch (ioexception e) { e.printstacktrace(); return "文件处理失败:" + e.getmessage(); } } }
在这个 controller 里,@postmapping定义了一个接收文件上传的接口。先把上传的文件保存到临时目录,再调用wordtopdfconverter.convert方法进行转换,最后可以根据实际需求,把生成的 pdf 返回给用户下载,或者存到指定位置。
五、总结
到这儿,从接到需求到代码实现,java 用 spring boot 把 word 转 pdf 的整个流程就走完了。当然,实际项目里还得考虑更多,比如文件存储优化、并发处理、转换进度监控。要是你在做这个功能时遇到啥问题,或者有更好的方案,欢迎一起唠唠!
到此这篇关于java springboot将word文档转为pdf的全流程解析的文章就介绍到这了,更多相关springboot word转pdf内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论