后台要生成合同、报告这类文档,业务方最后都要求给 PDF 版本。Java 里做 word 转 pdf 也就三条路,各有各的脾气。
方案一:借 LibreOffice 的手
服务器装个 LibreOffice,用 jodconverter 这类库调它的转换服务,Maven 里引 org.jodconverter 下的 jodconverter-local 就行;或者干脆命令行:soffice --headless --convert-to pdf 文件.docx。格式还原度是开源方案里最好的一档,表格、页眉页脚、图片都能处理,而且 LibreOffice 免费开源,Windows 和 Linux 都有安装包。缺点是服务器要多装一个软件,调用有开销,并发高了要排队。
方案二:纯 Java 库
Apache POI 能读写 docx,但它不负责排版渲染,想转 PDF 还得配 docx4j 加转换模块,或者用 iText 自己排版。开源组合对复杂排版的还原度一般,嵌套表格、公式、特殊字体容易走样。商业库 Aspose.Words 还原度高而且纯 Java 无外部依赖,按授权收费,预算足的项目用得多。
方案三:调用本机 Word
documents4j 这类库能在 Windows 服务器上调用装好的 Word 本体做转换,还原度就是 Word 自己的水平,大文件记得把超时设置调够。局限也明白:绑定 Windows 加 Office 授权,Linux 服务器用不了。
几个实战注意点
- 中文字体:Linux 上装完 LibreOffice 不装中文字体,转出来全是方块,先装字体再转
- doc 和 docx 是两种格式,老 .doc 的还原度普遍不如 docx,能升模板就升
- 文件流用完就关,临时文件记得清,不然磁盘几个月就满
- 批量转换加队列控制并发,LibreOffice 实例同时开多个容易崩
- 文件名带中文和空格时注意编码处理,别直接拼字符串
怎么选:格式复杂、还原度要求高,先试 LibreOffice 方案,不行再考虑商业库;文档是程序自己生成的简单模板,纯 Java 方案就够了,没必要引入外部软件。上线前拿真实文档批量测一遍,带章、带签名的模板最容易出问题。