Loading... > 工作中需求需要用 Java 生成 Word 报表并可以在线预览,用的是 FreeMarker 生成 Word XML。 预览的方案是用 LibreOffice 将 Word 报表转换成 PDF,利用 Chrome 对 PDF 的良好支持达到不错的预览效果。 然而,Word XML 转换 PDF 这一步却遇到了很大的困难。LibreOffice 转换出来的 PDF 内容全是 XML。 解决这个问题期间真是花费了大量时间精力去搜索,然而中文和英文的资料都不尽人意。找到的方案要么是 .NET 的,要么是商业收费的,还有复杂的不知道从哪里开始的。看到这里估计你也采用了类似的方案碰到了同样的困难。最后找到的解决方案并复杂,解决方案如下: ## 思路 用 docx4j 将 Word XML 转换成常规的 docx ,接下来直接用 LibreOffice 转换 PDF就可以了。 ## 代码 添加依赖 ```xml <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-JAXB-ReferenceImpl</artifactId> <version>8.1.5</version> </dependency> ``` Word XML 转换成常规的 docx 代码 ```java import org.docx4j.Docx4J; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import java.io.File; public class Xml2Docx { public static void main(String[] args) { String inputfilepath = System.getProperty("user.dir") + "/in/test.xml"; String outputfilepath = System.getProperty("user.dir") + "/out/out.docx"; try { WordprocessingMLPackage wmlPackage = Docx4J.load(new File(inputfilepath)); Docx4J.save(wmlPackage, new File(outputfilepath), Docx4J.FLAG_SAVE_ZIP_FILE); System.out.println("Saved: " + outputfilepath); } catch (Exception exc) { exc.printStackTrace(); throw new RuntimeException(exc); } } } ``` 接下来只要用 LibreOffice 转换即可 ```bash timeout 300 libreoffice6.2 --convert-to pdf:writer_pdf_Export out/out.docx --outdir /tmp/ ``` 另外一个坑是 LibreOffice 有时候转换 PDF 会出现卡死的问题,卡死后新的转换任务都会卡死,需要杀进程之后才能恢复正常。因此在 LibreOffice 命令前用 `timeout` 限制转换的时间最多为 300 秒,如果超时则杀死进程,此时 Shell 也会返回执行结果失败,接下来是要重试还是抛出错误就由你定了。 如果有幸能帮到你,请留言让我知道:laughing: 最后修改:2020 年 04 月 02 日 12 : 44 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付