user1578872
user1578872

Reputation: 9018

Docx4j - Docx to Image convertion

I am trying to convert docx into png file using doc4x and running into some error.

Gradle entries,

// 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 code,

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();
    }

Error,

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

Upvotes: 0

Views: 1674

Answers (4)

David Kranitz
David Kranitz

Reputation: 41

I had to remove the docx4j dependency

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j</artifactId>
    <version>6.1.2</version>
</dependency>

Now my pom.xml looks like this :

    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
        <version>11.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.docx4j</groupId>
        <artifactId>docx4j-JAXB-MOXy</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>org.apache.xmlgraphics</groupId>
        <artifactId>fop</artifactId>
        <version>2.8</version>
    </dependency>

Upvotes: 1

Matt Wang
Matt Wang

Reputation: 83

Jason, we are actually a paying customer for your Plutext-Enterprise library.

We are upgrading both docx4j-JAXB-ReferenceImpl and docx4j-export-fo to version 11.4.9, and we are hitting the same error (see stack trace below). We have upped to use JAXB 3 instead (Maven dependencies included below too).

We have hit a wall here. Any advice is hugely appreciated!

Error when calling 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

Our Maven dependencies as follows:

    <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>

Upvotes: 0

JasonPlutext
JasonPlutext

Reputation: 15863

docx4j 11.4.5 is the first release to use jakarta.xml.bind (as opposed to the previous javax.xml.bind).

So if you are using docx4j-export-fo version 11.4.5, do not add jaxb-api v2.4; you need jakarta.xml.bind:jakarta.xml.bind-api:jar:3.0.1

And don't add docx4j v6.1.2!

Upvotes: 0

mikoto
mikoto

Reputation: 21

I had a similar error. After I deleted docx4j dependency, it's ok.

I have a example.

pom.xml properties

<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 dependencies

<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 to 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();
}

Upvotes: 1

Related Questions