Trying to convert to PDF with Docx4J: No virtual method getModule()Ljava/lang/Module

165 Views Asked by At

I am trying to convert a .docx file to .pdf with Docx4J. I get this error:

FATAL EXCEPTION: main
Process: com.example.docx4jtest, PID: 9798
java.lang.NoSuchMethodError: No virtual method getModule()Ljava/lang/Module; in class Ljava/lang/Class; or its super classes (declaration of 'java.lang.Class' appears in /apex/com.android.art/javalib/core-oj.jar)
    at jakarta.xml.bind.ModuleUtil.delegateAddOpensToImplModule(ModuleUtil.java:111)
    at jakarta.xml.bind.ContextFinder.find(ContextFinder.java:323)
    at jakarta.xml.bind.JAXBContext.newInstance(JAXBContext.java:392)
    at org.docx4j.jaxb.Context.<clinit>(Context.java:121)
    at org.docx4j.openpackaging.contenttype.ContentTypeManager.parseContentTypesFile(ContentTypeManager.java:849)
    at org.docx4j.openpackaging.io3.Load3.get(Load3.java:146)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:572)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:421)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:298)
    at org.docx4j.openpackaging.packages.OpcPackage.load(OpcPackage.java:276)
    at org.docx4j.openpackaging.packages.WordprocessingMLPackage.load(WordprocessingMLPackage.java:170)
    at com.example.docx4jtest.MainActivity.onCreate(MainActivity.java:58)
    at android.app.Activity.performCreate(Activity.java:8290)
    at android.app.Activity.performCreate(Activity.java:8269)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3813)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2308)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7898)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

This exact error message only appeared once on Google Search and there was no sign of Docx4J there.

Code:

String tag = "Docx4J Test";
try {
    WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(getFilesDir().toPath().resolve("template-default.docx").toFile());
    mlPackage.save(getFilesDir().toPath().resolve("result.docx").toFile());
    Log.d(tag, "SAVED");
    FileOutputStream outputStream = new FileOutputStream(getFilesDir().toPath().resolve("result.pdf").toFile());
    Docx4J.toPDF(mlPackage, outputStream);
    Log.d(tag, "SUCCESS");
} catch (Docx4JException | FileNotFoundException e) {
    Log.d(tag, "onCreate: ".concat(e.getMessage()));
}

I added those dependencies to app/build.gradle:

implementation("org.docx4j:docx4j-JAXB-ReferenceImpl:8.3.3") {
    exclude group: "commons-logging"
}
implementation "com.fasterxml:aalto-xml:1.3.2"
implementation "javax.xml.stream:stax-api:1.0-2"
implementation files("libs/awt-bastardised-17v8.jar") // https://github.com/plutext/Docx4j4Android4/blob/master/app/libs/awt-bastardised-17v8.jar
implementation("org.docx4j:docx4j-export-fo:11.4.8") {
    exclude group: "org.apache.xmlgraphics"
}
implementation "org.glassfish.jaxb:jaxb-runtime:4.0.3"

Changing to MOXy didn't work - same error. I tried downgrading jaxb-runtime but got a different error.

Here's the full example so you can run it yourself: https://github.com/Volper212/docx4j-test

Keep in mind that in order to run this you need a template-default.docx file in the files directory of the app (/data/user/0/com.example.docx4jtest/files/template-default.docx). This can be any valid .docx file.

To get to this point, I used, among others, these resources:

0

There are 0 best solutions below