PDF Compatibility Issue

Hello, I’m using JMIX 2.6 and I’m trying to convert a report with a DOCX template to PDF.
This fails with the following exception:

java.lang.ExceptionInInitializerError: Exception java.lang.AbstractMethodError: Receiver class org.apache.pdfbox.io.RandomAccessReadBuffer does not define or inherit an implementation of the resolved method 'abstract int available()' of interface org.apache.pdfbox.io.RandomAccessRead. [in thread "http-nio-8080-exec-7"]
	at org.apache.pdfbox.io.RandomAccessReadBuffer.read(RandomAccessReadBuffer.java:237)
	at org.apache.fontbox.cff.CFFParser.parse(CFFParser.java:99)
	at org.docx4j.fonts.fop.fonts.truetype.OTFFile.initializeFont(OTFFile.java:109)
	at org.docx4j.fonts.fop.fonts.truetype.OpenFont.readFont(OpenFont.java:823)
	at org.docx4j.fonts.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:121)
	at org.docx4j.fonts.fop.fonts.truetype.OFFontLoader.read(OFFontLoader.java:105)
	at org.docx4j.fonts.fop.fonts.FontLoader.getFont(FontLoader.java:130)
	at org.docx4j.fonts.fop.fonts.FontLoader.loadFont(FontLoader.java:114)
	at org.docx4j.fonts.fop.fonts.autodetect.FontInfoFinder.find(FontInfoFinder.java:268)
	at org.docx4j.fonts.PhysicalFonts.getPhysicalFont(PhysicalFonts.java:307)
	at org.docx4j.fonts.PhysicalFonts.addPhysicalFonts(PhysicalFonts.java:246)
	at org.docx4j.fonts.PhysicalFonts.addPhysicalFont(PhysicalFonts.java:236)
	at org.docx4j.fonts.PhysicalFonts.discoverPhysicalFonts(PhysicalFonts.java:183)
	at org.docx4j.fonts.IdentityPlusMapper.<clinit>(IdentityPlusMapper.java:74)
	at org.docx4j.openpackaging.packages.WordprocessingMLPackage.getFontMapper(WordprocessingMLPackage.java:375)
	at org.docx4j.convert.out.FOSettings.setOpcPackage(FOSettings.java:99)
	at org.docx4j.Docx4J.toPDF(Docx4J.java:738)
	at io.jmix.reports.yarg.formatters.impl.DocxFormatter.saveAndClose(DocxFormatter.java:156)
	at io.jmix.reports.yarg.formatters.impl.DocxFormatter.renderDocument(DocxFormatter.java:94)
	at io.jmix.reports.yarg.reporting.Reporting.generateReport(Reporting.java:132)
	at io.jmix.reports.yarg.reporting.Reporting.runReport(Reporting.java:91)
	at io.jmix.reports.yarg.reporting.Reporting.runReport(Reporting.java:114)
	at io.jmix.reports.runner.impl.ReportRunnerImpl.createReportDocumentInternal(ReportRunnerImpl.java:134)
	at io.jmix.reports.runner.impl.ReportRunnerImpl.run(ReportRunnerImpl.java:82)
	at io.jmix.reportsflowui.runner.impl.UiReportRunnerImpl.runAndShow(UiReportRunnerImpl.java:113)
	at io.jmix.reportsflowui.runner.FluentUiReportRunner.runAndShow(FluentUiReportRunner.java:184)
	at io.jmix.reportsflowui.view.run.InputParametersDialog.onPrintReportButtonClick(InputParametersDialog.java:154)

I checked the dependencies and it looks that it’s a mix between different library versions:

Gradle: org.apache.pdfbox:fontbox:3.0.3
Gradle: org.apache.pdfbox:pdfbox:2.0.24
Gradle: org.apache.pdfbox:pdfbox-io:3.0.3
Gradle: org.apache.pdfbox:xmpbox:2.0.24

With the dependency analyser it looks like this for pdfbox:2.0.24:

io.jmix.reports:jmix-reports-rest-starter:2.6.0
io.jmix.reports:jmix-reports-rest:2.6.0
io.jmix.reports:jmix-reports:2.6.0
com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10
de.rototor.pdfbox:graphics2d:0.32
org.apache.pdfbox:pdfbox:2.0.24
org.apache.pdfbox:pdfbox:2.0.24

and for fontbox:3.0.3:

io.jmix.reports:jmix-reports-rest-starter:2.6.0
io.jmix.reports:jmix-reports-rest:2.6.0
io.jmix.reports:jmix-reports:2.6.0
org.docx4j:docx4j-JAXB-ReferenceImpl:11.5.3
org.docx4j:docx4j-core:11.5.3
org.apache.pdfbox:fontbox:3.0.3
org.apache.xmlgraphics:fop:2.11
org.apache.xmlgraphics:fop-core:2.11
org.apache.pdfbox:fontbox:3.0.3
com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10
org.apache.pdfbox:pdfbox:2.0.24
org.apache.pdfbox:fontbox:3.0.3

The reports shows conflicts on fontbox:3.0.3 vs. 2.0.24

Is this a known problem?

I was able to fix this using

configurations.all {
    resolutionStrategy {
        force 'org.apache.pdfbox:pdfbox:3.0.3'
    }
}

Hi,

Can’t reproduce.

If you can provide reproducible sample project - it will be very helpful.
And also provide the whole dependencies tree for your project.

The reports shows conflicts on fontbox:3.0.3 vs. 2.0.24

Effective version of pdfbox is 2.0.24. It brings fontbox:2.0.24, but it’s overridden by fontbox:3.0.3 brought by fop-core. And fontbox:3.0.3 brings pdfbox-io:3.0.3.
Maybe there is some conflict between pdfbox:2.0.24 and pdfbox-io:3.0.3.

We will check if we can update everything to 3.0.3, but at first I’d like to reproduce it.

Regards,
Ivan

Hi Ivan

Thanks for the feedback. As you stated, the problem is that it’s effectively using org.apache.pdfbox:pdfbox:2.0.24 but should use 3.0.3 to match with fontbox IMO.

This is the output for ./gradlew dependencyInsight --configuration runtimeClasspath --dependency org.apache.pdfbox:pdfbox (without my fix):

> Task :dependencyInsight
org.apache.pdfbox:pdfbox:2.0.24
  Variant runtime:
    | Attribute Name                 | Provided     | Requested    |
    |--------------------------------|--------------|--------------|
    | org.gradle.status              | release      |              |
    | org.gradle.category            | library      | library      |
    | org.gradle.libraryelements     | jar          | jar          |
    | org.gradle.usage               | java-runtime | java-runtime |
    | org.gradle.dependency.bundling |              | external     |
    | org.gradle.jvm.environment     |              | standard-jvm |
    | org.gradle.jvm.version         |              | 21           |

org.apache.pdfbox:pdfbox:2.0.24
+--- com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10
|    +--- io.jmix.bom:jmix-bom:2.6.0
|    |    \--- runtimeClasspath
|    +--- io.jmix.reports:jmix-reports:2.6.0
|    |    +--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    |    +--- io.jmix.reports:jmix-reports-flowui:2.6.0
|    |    |    +--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    |    |    \--- io.jmix.reports:jmix-reports-flowui-starter:2.6.0
|    |    |         +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-flowui-starter)
|    |    |         \--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    |    +--- io.jmix.reports:jmix-reports-starter:2.6.0
|    |    |    +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-starter)
|    |    |    \--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    |    \--- io.jmix.reports:jmix-reports-rest:2.6.0
|    |         +--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    |         \--- io.jmix.reports:jmix-reports-rest-starter:2.6.0
|    |              +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-rest-starter)
|    |              \--- io.jmix.bom:jmix-bom:2.6.0 (*)
|    \--- org.docx4j:docx4j-ImportXHTML:11.4.8
|         +--- io.jmix.bom:jmix-bom:2.6.0 (*)
|         \--- io.jmix.reports:jmix-reports:2.6.0 (*)
\--- de.rototor.pdfbox:graphics2d:0.32
     \--- com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10 (*)

org.apache.pdfbox:pdfbox-io:3.0.3
  Variant runtime:
    | Attribute Name                 | Provided     | Requested    |
    |--------------------------------|--------------|--------------|
    | org.gradle.status              | release      |              |
    | org.gradle.category            | library      | library      |
    | org.gradle.libraryelements     | jar          | jar          |
    | org.gradle.usage               | java-runtime | java-runtime |
    | org.gradle.dependency.bundling |              | external     |
    | org.gradle.jvm.environment     |              | standard-jvm |
    | org.gradle.jvm.version         |              | 21           |

org.apache.pdfbox:pdfbox-io:3.0.3
\--- org.apache.pdfbox:fontbox:3.0.3
     +--- org.docx4j:docx4j-core:11.5.3
     |    +--- org.docx4j:docx4j-JAXB-ReferenceImpl:11.5.3
     |    |    +--- io.jmix.bom:jmix-bom:2.6.0
     |    |    |    \--- runtimeClasspath
     |    |    \--- io.jmix.reports:jmix-reports:2.6.0
     |    |         +--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |         +--- io.jmix.reports:jmix-reports-flowui:2.6.0
     |    |         |    +--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |         |    \--- io.jmix.reports:jmix-reports-flowui-starter:2.6.0
     |    |         |         +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-flowui-starter)
     |    |         |         \--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |         +--- io.jmix.reports:jmix-reports-starter:2.6.0
     |    |         |    +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-starter)
     |    |         |    \--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |         \--- io.jmix.reports:jmix-reports-rest:2.6.0
     |    |              +--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |              \--- io.jmix.reports:jmix-reports-rest-starter:2.6.0
     |    |                   +--- runtimeClasspath (requested io.jmix.reports:jmix-reports-rest-starter)
     |    |                   \--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    +--- org.docx4j:docx4j-ImportXHTML:11.4.8 (requested org.docx4j:docx4j-core:11.4.8)
     |    |    +--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |    |    \--- io.jmix.reports:jmix-reports:2.6.0 (*)
     |    \--- org.docx4j:docx4j-export-fo:11.5.3
     |         +--- io.jmix.bom:jmix-bom:2.6.0 (*)
     |         \--- io.jmix.reports:jmix-reports:2.6.0 (*)
     +--- org.apache.xmlgraphics:fop-core:2.11
     |    \--- org.apache.xmlgraphics:fop:2.11
     |         +--- io.jmix.bom:jmix-bom:2.6.0 (requested org.apache.xmlgraphics:fop:2.10) (*)
     |         +--- io.jmix.reports:jmix-reports:2.6.0 (requested org.apache.xmlgraphics:fop:2.10) (*)
     |         \--- org.docx4j:docx4j-export-fo:11.5.3 (*)
     \--- org.apache.pdfbox:pdfbox:2.0.24 (requested org.apache.pdfbox:fontbox:2.0.24)
          +--- com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10
          |    +--- io.jmix.bom:jmix-bom:2.6.0 (*)
          |    +--- io.jmix.reports:jmix-reports:2.6.0 (*)
          |    \--- org.docx4j:docx4j-ImportXHTML:11.4.8 (*)
          \--- de.rototor.pdfbox:graphics2d:0.32
               \--- com.openhtmltopdf:openhtmltopdf-pdfbox:1.0.10 (*)

Forcing 3.0.3 is required to fix this as far as I can see.

Best regards, Andi

Hi,

Additional notes (according to exception java.lang.ExceptionInInitializerError: Exception java.lang.AbstractMethodError: Receiver class org.apache.pdfbox.io.RandomAccessReadBuffer does not define or inherit an implementation of the resolved method 'abstract int available()' of interface org.apache.pdfbox.io.RandomAccessRead.):

  • RandomAccessReadBuffer (from pdfbox:3.0.3) doesn’t have implementation of available() method.
  • Before 3.0.0 there was no pdfbox-io module, so RandomAccessRead interface was in pdfbox.
  • After pdfbox-io module is introduced in 3.0.0 RandomAccessRead was moved to it and now has default implementation of this method so it will not cause this issue.

That explains why I couldn’t reproduce it - it looks like my project loads RandomAccessRead from pdfbox-io, and your - from pdfbox.

However - created a task Update pdfbox to 3.0.x · Issue #4596 · jmix-framework/jmix · GitHub

Regards,
Ivan

1 Like