【问题标题】:Docx4j - Docx to Image convertionDocx4j - Docx 到图像的转换
【发布时间】:2023-02-11 04:18:50
【问题描述】:

我正在尝试使用 doc4x 将 docx 转换为 png 文件并遇到一些错误。

摇篮条目,

// https://mvnrepository.com/artifact/org.docx4j/docx4j
    implementation group: 'org.docx4j', name: 'docx4j', version: '6.1.2'

    // https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
    implementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.4.0-b180830.0359'
    
    // https://mvnrepository.com/artifact/org.docx4j/docx4j-export-fo
    implementation group: 'org.docx4j', name: 'docx4j-export-fo', version: '11.4.5'
    
    // https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api
    implementation group: 'jakarta.xml.bind', name: 'jakarta.xml.bind-api', version: '4.0.0-RC3'

Java代码,

public static void main(String args[]) throws Exception {
        String sourceFile = "/Users/test/test1.docx";
        String destFile = "/Users/test/test1.png";
        
        File theFile = new File(sourceFile);
        File outile=new File(destFile);
        WordprocessingMLPackage wordMLPckg = Docx4J.load(theFile);
        OutputStream os = new FileOutputStream(outile);
        FOSettings settings = Docx4J.createFOSettings();
        settings.setWmlPackage(wordMLPckg);
        settings.setApacheFopMime(MimeConstants.MIME_PNG);
        Docx4J.toFO(settings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
        os.close();
    }

错误,

17:48:29.976 [main] ERROR org.docx4j.XmlUtils - java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
javax.xml.transform.TransformerException: java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:417) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:440) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:475) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.XPath.execute(XPath.java:337) [xalan-2.7.2.jar:2.7.2]
    at org.apache.xalan.templates.ElemCopyOf.execute(ElemCopyOf.java:134) [xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2402) [xalan-2.7.2.jar:?]


Caused by: java.lang.NoSuchMethodError: 'jakarta.xml.bind.JAXBElement org.docx4j.wml.ObjectFactory.createRT(org.docx4j.wml.Text)'
    at org.docx4j.convert.out.fo.FOPAreaTreeHelper.createFillerP(FOPAreaTreeHelper.java:167) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.FOPAreaTreeHelper.trimContent(FOPAreaTreeHelper.java:100) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.LayoutMasterSetBuilder.fixExtents(LayoutMasterSetBuilder.java:136) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.LayoutMasterSetBuilder.getLayoutMasterSetFragment(LayoutMasterSetBuilder.java:97) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.XsltFOFunctions.getLayoutMasterSetFragment(XsltFOFunctions.java:85) ~[docx4j-export-fo-11.4.5.jar:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:343) ~[xalan-2.7.2.jar:?]
    ... 24 more
17:48:30.002 [main] ERROR org.docx4j.XmlUtils - java.lang.NoSuchFieldError: jc
javax.xml.transform.TransformerException: java.lang.NoSuchFieldError: jc
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:417) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:440) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:222) ~[xalan-2.7.2.jar:?]
    at org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:475) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:208) ~[xalan-2.7.2.jar:?]
    at org.apache.xpath.XPath.execute(XPath.java:337) [xalan-2.7.2.jar:2.7.2]

Caused by: java.lang.NoSuchFieldError: jc
    at org.docx4j.convert.out.fo.XsltFOFunctions.createBlock(XsltFOFunctions.java:324) ~[docx4j-export-fo-11.4.5.jar:?]
    at org.docx4j.convert.out.fo.XsltFOFunctions.createBlockForPPr(XsltFOFunctions.java:141) ~[docx4j-export-fo-11.4.5.jar:?]
    at jdk.internal.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
    at org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:300) ~[xalan-2.7.2.jar:?]
    ... 32 more
Exception in thread "main" org.docx4j.openpackaging.exceptions.Docx4JException: Exception exporting package
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:106)
    at org.docx4j.Docx4J.toFO(Docx4J.java:734)
    at com.whskr.service.admin.report.spring.handler.Test.main(Test.java:71)
Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: You must invoke FORendererApacheFOP.getFOUserAgent
    at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:124)
    at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168)
    at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:47)
    at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:81)
    ... 2 more

【问题讨论】:

    标签: java docx4j


    【解决方案1】:

    我有一个类似的错误。我删除了docx4j依赖后就ok了。

    我有一个例子。

    pom.xml 属性

    <docx4j-JAXB-Internal.version>8.3.4</docx4j-JAXB-Internal.version>
    <docx4j-JAXB-ReferenceImpl.version>8.3.4</docx4j-JAXB-ReferenceImpl.version>
    <docx4j-JAXB-MOXy.version>8.3.4</docx4j-JAXB-MOXy.version>
    <docx4j-export-fo.version>8.3.4</docx4j-export-fo.version>
    

    pom.xml 依赖项

    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-Internal</artifactId>
        <version>${docx4j-JAXB-Internal.version}</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
        <version>${docx4j-JAXB-ReferenceImpl.version}</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-MOXy</artifactId>
        <version>${docx4j-JAXB-MOXy.version}</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-export-fo</artifactId>
        <version>${docx4j-export-fo.version}</version>
    </dependency>
    

    docx转png

    public static void docx2Png(String docxPath, String pngPath) throws Exception {
        FileInputStream fis = new FileInputStream(docxPath);
        WordprocessingMLPackage wordPackage = WordprocessingMLPackage.load(fis);
        // font mapper
        wordPackage.setFontMapper(IFontHandler.getFontMapper());
        FOSettings foSettings = Docx4J.createFOSettings();
        foSettings.setApacheFopMime(MimeConstants.MIME_PNG);
        foSettings.setOpcPackage(wordPackage);
    
        FopFactoryBuilder fopFactoryBuilder = FORendererApacheFOP.getFopFactoryBuilder(foSettings);
        FORendererApacheFOP.getFOUserAgent(foSettings, fopFactoryBuilder.build());
    
        FileOutputStream fos = new FileOutputStream(pngPath);
        Docx4J.toFO(foSettings, fos, Docx4J.FLAG_EXPORT_PREFER_XSL);
        fos.flush();
        fos.close();
        fis.close();
    }
    

    【讨论】:

    • 无法解析 IFontHandler。要添加任何依赖项吗?
    • 您有 3 个 docx4j-JAXB-* 依赖项;你应该有一个而且只有一个!
    • 我写了 IFontHandler 来避免一些字体不工作的问题。你可能会评论它。
    【解决方案2】:

    docx4j 11.4.5 是第一个使用 jakarta.xml.bind 的版本(与之前的 javax.xml.bind 相对)。

    因此,如果您使用的是 docx4j-export-fo 版本 11.4.5,请不要添加 jaxb-api v2.4;你需要 jakarta.xml.bind:jakarta.xml.bind-api:jar:3.0.1

    并且不要添加 docx4j v6.1.2!

    【讨论】:

    • 嗨,Jason,我们实际上是您的 Plutext-Enterprise 库的付费客户。我们正在将“docx4j-JAXB-ReferenceImpl”和“docx4j-export-fo”升级到版本 11.4.9,我们遇到了同样的错误“Docx4JException:您必须调用 FORendererApacheFOP.getFOUserAgent”。我们肯定已经升级到使用 jakarta.xml.bind-api。有什么建议吗?
    【解决方案3】:

    我们实际上是您的 Plutext-Enterprise 库的付费客户。

    我们正在升级两者docx4j-JAXB-ReferenceImpldocx4j-export-fo到版本 11.4.9,我们遇到了同样的错误(见下面的堆栈跟踪)。我们已经升级为使用 JAXB 3(下面也包含 Maven 依赖项)。

    我们在这里碰壁了。非常感谢任何建议!

    调用时出错Docx4J.toFO:

    org.docx4j.openpackaging.exceptions.Docx4JException: Exception exporting package
    
        at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:108)
        at org.docx4j.Docx4J.toFO(Docx4J.java:711)
        at com.hmsinc.epicenter.docx4j.DocxDocument.savePdf(DocxDocument.java:154)
        at com.hmsinc.epicenter.docx4j.DocxDocument.save(DocxDocument.java:138)
        at com.hmsinc.epicenter.docx4j.DocxDocumentTest.testDataLatencyDoc(DocxDocumentTest.java:258)
    
    Caused by: org.docx4j.openpackaging.exceptions.Docx4JException: You must invoke FORendererApacheFOP.getFOUserAgent
        at org.docx4j.convert.out.fo.renderers.FORendererApacheFOP.render(FORendererApacheFOP.java:124)
        at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:168)
        at org.docx4j.convert.out.fo.AbstractFOExporter.postprocess(AbstractFOExporter.java:47)
        at org.docx4j.convert.out.common.AbstractExporter.export(AbstractExporter.java:83)
        ... 28 more
    

    我们的 Maven 依赖如下:

        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>3.0.1</version>
        </dependency>
    
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>3.0.1</version>
        </dependency>
    
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
            <version>11.4.9</version>
        </dependency>
    
        <dependency>
            <groupId>org.docx4j</groupId>
            <artifactId>docx4j-export-fo</artifactId>
            <version>11.4.9</version>
        </dependency>
    
        <dependency>
            <groupId>com.plutext</groupId>
            <artifactId>Plutext-Enterprise</artifactId>
            <version>3.2.0.10</version>
        </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      相关资源
      最近更新 更多