opensagres / xdocreport

XDocReport means XML Document reporting. It's Java API to merge XML document created with MS Office (docx) or OpenOffice (odt), LibreOffice (odt) with a Java model to generate report and convert it if you need to another format (PDF, XHTML...).
https://github.com/opensagres/xdocreport
1.19k stars 368 forks source link

OpenPDF converter fails with java.lang.NoSuchFieldError: list #671

Open andreldm opened 1 month ago

andreldm commented 1 month ago

Documents with lists are not properly converted by either PDF converters. The iText-based one will not render bullet points, even the characters as plain text are missing, I think this has been reported in the past. The one based on OpenPDF fails with java.lang.NoSuchFieldError: list, I can workaround this by replacing lists with bullet point characters but it's very annoying.

Sample document: sample.odt

angelozerr commented 1 month ago

Any contribution are welcome!

andreasrosdal commented 1 month ago

Do you have a full stack trace for this error? Which version of OpenPDF?

andreldm commented 1 month ago

Do you have a full stack trace for this error?

Caused by: java.lang.NoSuchFieldError: list
    at fr.opensagres.odfdom.converter.pdf.internal.stylable.StylableList.addElement(StylableList.java:185)
    at fr.opensagres.odfdom.converter.pdf.internal.stylable.StylableList.addElement(StylableList.java:93)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.addITextContainer(ElementVisitorForIText.java:848)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.addITextContainer(ElementVisitorForIText.java:836)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.visit(ElementVisitorForIText.java:606)
    at org.odftoolkit.odfdom.dom.element.text.TextListItemElement.accept(TextListItemElement.java:198)
    at fr.opensagres.odfdom.converter.core.ElementVisitorConverter.visit(ElementVisitorConverter.java:83)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.addITextContainer(ElementVisitorForIText.java:845)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.addITextContainer(ElementVisitorForIText.java:836)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.visit(ElementVisitorForIText.java:595)
    at org.odftoolkit.odfdom.dom.element.text.TextListElement.accept(TextListElement.java:188)
    at fr.opensagres.odfdom.converter.core.ElementVisitorConverter.visit(ElementVisitorConverter.java:83)
    at org.odftoolkit.odfdom.dom.DefaultElementVisitor.visit(DefaultElementVisitor.java:2605)
    at fr.opensagres.odfdom.converter.pdf.internal.ElementVisitorForIText.visit(ElementVisitorForIText.java:258)
    at org.odftoolkit.odfdom.dom.element.office.OfficeTextElement.accept(OfficeTextElement.java:805)
    at fr.opensagres.odfdom.converter.pdf.PdfConverter.processBody(PdfConverter.java:138)
    at fr.opensagres.odfdom.converter.pdf.PdfConverter.doConvert(PdfConverter.java:66)
    at fr.opensagres.odfdom.converter.pdf.PdfConverter.doConvert(PdfConverter.java:44)
    at fr.opensagres.odfdom.converter.core.AbstractODFConverter.convert(AbstractODFConverter.java:42)
    at fr.opensagres.xdocreport.converter.odt.odfdom.itext.ODF2PDFViaITextConverter.convert(ODF2PDFViaITextConverter.java:62)

Which version of OpenPDF?

I'm using XDocReport 2.0.6 which I believe transitively brings in OpenPDF 1.3.18. The latest release which is compatible with XDocReport is 1.3.36, same error happens, the latest Java 8-compatible release is 1.3.43 but there are breaking changes.

andreasrosdal commented 1 month ago

https://github.com/opensagres/xdocreport/blob/master/thirdparties-extension/fr.opensagres.odfdom.converter.pdf/src/main/java/fr/opensagres/odfdom/converter/pdf/internal/stylable/StylableList.java#L185

https://github.com/LibrePDF/OpenPDF/blob/master/openpdf/src/main/java/com/lowagie/text/List.java#L135C5-L135C15

andreldm commented 1 month ago

That's really odd, while debugging it seems like the field exists and is accessible: image

I have created an empty maven project in Intellij, the only dependencies are:

<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>xdocreport</artifactId>
  <version>2.0.6</version>
</dependency>

<dependency>
  <groupId>fr.opensagres.xdocreport</groupId>
  <artifactId>fr.opensagres.odfdom.converter.pdf.openpdf</artifactId>
  <version>2.0.6</version>
</dependency>

And the code is:

public class Main {
    public static void main(String[] args) throws Exception {
        InputStream in = Files.newInputStream(Paths.get("sample.odt"));
        OutputStream out = Files.newOutputStream(Paths.get("sample.pdf"));
        Options options = Options.getFrom(ODT).to(PDF);
        ConverterRegistry.getRegistry().getConverter(options).convert(in, out, options);
    }
}

I executed the application passing -verbose:class, there is only one com.lowagie.text.List class loaded and it comes from openpdf-1.3.18.jar.

asolntsev commented 3 weeks ago

@angelozerr @andreldm

I created a simple reproducible example for this problem: https://github.com/asolntsev/xdocreport-openpdf-demo

@andreasrosdal It doesn't depend on OpenPDF version.

andreasrosdal commented 1 day ago

Thank you for reporting and making the test case. How can we solve this? Is the bug in OpenPDF or xdocreport?

andreldm commented 11 hours ago

@andreasrosdal I don't know, judging by the stack trace, it's more likely a xdocreport bug