使用具有非 XSL 转换的 Docx4j 将 DOCX 转换为 PDF 时出现 Nullpointer 异常

Nullpointer Exception when converting DOCX to PDF using Docx4j with non-XSL transformation

提问人:New2Java 提问时间:11/3/2023 更新时间:11/3/2023 访问量:40

问:

我对 Docx4j 库相当陌生。我正在尝试使用 Docx4j 库将 DOCX 文件转换为 PDF,我想使用非 XSL 转换方法 (Docx4J.FLAG_EXPORT_PREFER_NONXSL) 来减少整体处理/转换时间(整个转换过程大约需要 2 分钟)。但是我遇到了与图像处理相关的异常。

这是我面临的例外:

java.lang.NullPointerException: Cannot invoke "org.docx4j.model.images.WordXmlPictureE20.createXslFoImageElement()" because "converter" is null
at org.docx4j.model.images.WordXmlPictureE20.createXslFoImgE20 (WordXmlPictureE20.java)

上述异常表明在 DOCX 到 PDF 转换期间图像转换存在问题。但是,我不确定为什么会发生这种情况,因为我希望 Docx4j 使用其默认设置处理图像。

下面是导致异常的代码片段:

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

public class DocxToPDFConverter {

    public static void convertToPDF(File docxFile, File pdfFile) throws Exception {
        // Load the DOCX into a WordprocessingMLPackage
        WordprocessingMLPackage wordMLPackage = Docx4J.load(docxFile);
        wordMLPackage.setFontMapper(new BestMatchingMapper());

        // Configure FO settings
        FOSettings foSettings = Docx4J.createFOSettings();
        foSettings.setWmlPackage(wordMLPackage);
        foSettings.setApacheFopMime(FOSettings.MIME_PDF);

        // Prepare the output stream
        try (OutputStream out = new FileOutputStream(pdfFile)) {
            // Convert to PDF with non-XSL transformation
            Docx4J.toFO(foSettings, out, Docx4J.FLAG_EXPORT_PREFER_NONXSL);
        }
    }

尝试解决:

确保所有必需的 jar 都在类路径上。我的 pom.xml 中有 docx4j-JAXB-ReferenceImpl、11.4.9 版的 docx4j-export-fo

尝试使用FLAG_EXPORT_PREFER_NONXSL以加快转换速度,但由于异常,响应时间没有明显改善。

已根据默认 Docx4J 配置检查图像处理程序设置。

问题:

  1. 如何解决“转换器为空”问题以成功完成 DOCX 到 PDF 的转换?

  2. 在使用 Docx4J.toPDF() 转换文档时,我可以应用任何优化来减少响应时间吗?我已经尝试使用非基于 XSLT 的转换 (FLAG_EXPORT_PREFER_NONXSL),但性能改进还不够。

环境:

Java 版本:17 和 Docx4J 版本:11.4.9(类路径中的 docx4j-export-fo)

参考: https://github.com/plutext/docx4j/blob/VERSION_11_4_8/docx4j-samples-docx-export-fo/src/main/java/org/docx4j/samples/ConvertOutPDFviaXSLFO.java

任何可以解决这些问题的见解、建议或优化将不胜感激。感谢您的时间和帮助!

java pdf docx docx4j

评论

0赞 JasonPlutext 11/5/2023
你能在展示问题的某个地方发布一个文档吗?Docx4J.FLAG_EXPORT_PREFER_NONXSL 比 FLAG_EXPORT_PREFER_XSL 快,但没有功能奇偶校验。有关其他PDF转换方法,请参阅 docx4java.org/blog/2020/09/...
0赞 New2Java 11/6/2023
嗨,杰森,由于敏感性和机密性,我可以共享 Docx 文件。但它是单单元格隐藏表中的PNG图像。FLAG_EXPORT_PREFER_XSL能够转换它。我想支持PNG文件,对吧?当您说 Docx4J.FLAG_EXPORT_PREFER_NONXSL 不是功能奇偶校验时,这是否意味着它确实支持 PNG 转换?
0赞 New2Java 11/6/2023
其次,转换代码(使用FLAG_EXPORT_PREFER_XSL)是否有任何方面可以静态初始化,或者通过配置进行任何潜在的改进,从而可以减少整体转换时间?整个过程对我来说大约需要 2 分钟,这对用户来说是不可接受的。
0赞 JasonPlutext 11/7/2023
巴布亚新几内亚?是的。转换时间:你的docx是多少页?
0赞 New2Java 11/7/2023
是的,它是.PNG文件。我的文档平均大约有 80-90 页

答: 暂无答案