简体   繁体   中英

veraPDF PDF/A validation java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List

I wrote validator using veraPDF to recognize PDF/A (archive) formats. It working well for not too much complicated PDF, but if I can check more complex PDF, for example formulars, it issues java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List; .

I try to solve this issue to add any libraries into the .pom file, but without success. Actual configuration is very simple:

    <dependency>
        <groupId>org.verapdf</groupId>
        <artifactId>pdfbox-validation-model</artifactId>
        <version>1.4.5</version>
    </dependency>

Stack trace:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/fontbox/type1/DamagedFontException
    at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62)
    at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:109)
    at org.verapdf.model.tools.resources.PDInheritableResources.getFont(PDInheritableResources.java:80)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.getFontFromResources(PBOpTextShow.java:299)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.parseFont(PBOpTextShow.java:127)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.getVeraModelFont(PBOpTextShow.java:121)
    at org.verapdf.model.factory.operator.OperatorParser.addFontAndColorSpace(OperatorParser.java:589)
    at org.verapdf.model.factory.operator.OperatorParser.parseOperator(OperatorParser.java:261)
    at org.verapdf.model.factory.operator.OperatorFactory.operatorsFromTokens(OperatorFactory.java:124)
    at org.verapdf.model.impl.pb.pd.PBoxPDContentStream.parseOperators(PBoxPDContentStream.java:100)
    at org.verapdf.model.impl.pb.pd.PBoxPDContentStream.isContainsTransparency(PBoxPDContentStream.java:87)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.parseContentStream(PBoxPDPage.java:205)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.getContentStream(PBoxPDPage.java:192)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.getLinkedObjects(PBoxPDPage.java:134)
    at org.verapdf.pdfa.validation.validators.BaseValidator.addAllLinkedObjects(BaseValidator.java:240)
    at org.verapdf.pdfa.validation.validators.BaseValidator.checkNext(BaseValidator.java:185)
    at org.verapdf.pdfa.validation.validators.BaseValidator.validate(BaseValidator.java:136)
    at org.verapdf.pdfa.validation.validators.BaseValidator.validate(BaseValidator.java:107)
    at cz.vums.deepam.ValidationTestOpt.isCompliant(ValidationTestOpt.java:53)
    at cz.vums.deepam.ValidationTestOpt.main(ValidationTestOpt.java:92)
Caused by: java.lang.ClassNotFoundException: org.apache.fontbox.type1.DamagedFontException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 20 more

If I add PdfBox into dependencies, even if apache PdfBox is not used, the issue is different:

<dependency>
    <groupId>org.verapdf</groupId>
    <artifactId>pdfbox-validation-model</artifactId>
    <version>1.4.5</version>
</dependency>

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.12</version>
</dependency>

Stack trace:

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List;
    at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.addTrueTypeCollection(FileSystemFontProvider.java:174)
    at org.apache.pdfbox.pdmodel.font.FileSystemFontProvider.<init>(FileSystemFontProvider.java:151)
    at org.apache.pdfbox.pdmodel.font.FontMapper$DefaultFontProvider.<clinit>(FontMapper.java:73)
    at org.apache.pdfbox.pdmodel.font.FontMapper.getProvider(FontMapper.java:92)
    at org.apache.pdfbox.pdmodel.font.FontMapper.findFont(FontMapper.java:407)
    at org.apache.pdfbox.pdmodel.font.FontMapper.findFontBoxFont(FontMapper.java:376)
    at org.apache.pdfbox.pdmodel.font.FontMapper.getFontBoxFont(FontMapper.java:349)
    at org.apache.pdfbox.pdmodel.font.PDType1Font.<init>(PDType1Font.java:112)
    at org.apache.pdfbox.pdmodel.font.PDType1Font.<clinit>(PDType1Font.java:73)
    at org.apache.pdfbox.pdmodel.font.PDFontFactory.createFont(PDFontFactory.java:62)
    at org.apache.pdfbox.pdmodel.PDResources.getFont(PDResources.java:109)
    at org.verapdf.model.tools.resources.PDInheritableResources.getFont(PDInheritableResources.java:80)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.getFontFromResources(PBOpTextShow.java:299)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.parseFont(PBOpTextShow.java:127)
    at org.verapdf.model.impl.pb.operator.textshow.PBOpTextShow.getVeraModelFont(PBOpTextShow.java:121)
    at org.verapdf.model.factory.operator.OperatorParser.addFontAndColorSpace(OperatorParser.java:589)
    at org.verapdf.model.factory.operator.OperatorParser.parseOperator(OperatorParser.java:261)
    at org.verapdf.model.factory.operator.OperatorFactory.operatorsFromTokens(OperatorFactory.java:124)
    at org.verapdf.model.impl.pb.pd.PBoxPDContentStream.parseOperators(PBoxPDContentStream.java:100)
    at org.verapdf.model.impl.pb.pd.PBoxPDContentStream.isContainsTransparency(PBoxPDContentStream.java:87)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.parseContentStream(PBoxPDPage.java:205)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.getContentStream(PBoxPDPage.java:192)
    at org.verapdf.model.impl.pb.pd.PBoxPDPage.getLinkedObjects(PBoxPDPage.java:134)
    at org.verapdf.pdfa.validation.validators.BaseValidator.addAllLinkedObjects(BaseValidator.java:240)
    at org.verapdf.pdfa.validation.validators.BaseValidator.checkNext(BaseValidator.java:185)
    at org.verapdf.pdfa.validation.validators.BaseValidator.validate(BaseValidator.java:136)
    at org.verapdf.pdfa.validation.validators.BaseValidator.validate(BaseValidator.java:107)
    at cz.vums.deepam.ValidationTestOpt.isCompliant(ValidationTestOpt.java:53)
    at cz.vums.deepam.ValidationTestOpt.main(ValidationTestOpt.java:92)

As proofable in the testing code imports, PdfBox is not used:

...
import org.verapdf.core.EncryptedPdfException;
import org.verapdf.core.ModelParsingException;
import org.verapdf.pdfa.Foundries;
import org.verapdf.pdfa.PDFAParser;
import org.verapdf.pdfa.PDFAValidator;
import org.verapdf.pdfa.PdfBoxFoundryProvider;
import org.verapdf.pdfa.flavours.PDFAFlavour;
import org.verapdf.pdfa.results.ValidationResult;

import com.google.common.base.Stopwatch;

public class ValidationTestOpt {
    private static org.slf4j.Logger logger = LoggerFactory.getLogger(ValidationTestOpt.class);

    static String FILENAME;
    Stopwatch timer;

    public ValidationTestOpt() {
        PdfBoxFoundryProvider.initialise();
        timer = Stopwatch.createUnstarted();
    }

    private void timerStart() {
        timer.reset();
        timer.start();
    }

    private void timerStop() {
        timer.stop();
        System.out.println("Elapsed: " + timer.toString());
    }

    public boolean isCompliant(InputStream stream, PDFAFlavour[] flavours) {

        boolean isComp = false;
        // PDFAFlavour flavour = PDFAFlavour.PDFA_1_B;
        timerStart();
        System.out.println("Initialization...");
        ValidationResult result = null;
        try (PDFAParser parser = Foundries.defaultInstance().createParser(stream)) {
            timerStop();
            for (PDFAFlavour flavour : flavours) {
                timerStart();
                PDFAValidator validator = Foundries.defaultInstance().createValidator(flavour, false);
                result = validator.validate(parser);
                if (isComp = result.isCompliant()) {
                    System.out.println("+++ " + FILENAME + " is compliant with " + flavour.name());
                } else {
                    System.out.println("--- " + FILENAME + " is not compliant with " + flavour.name());
                }
                timerStop();
                // stream.reset();
            }
        } catch (ModelParsingException | EncryptedPdfException | IOException e) {
            System.out.println("Chyba pri parsovani nebo validovani." + e);
            return false;
        } catch (Exception ex) {
            System.out.println(
                    "Obecna chyba pri parsovani nebo validovani, pravdepodobne jde o nestandardni PDF formular." + ex);
            return false;
        }
        return isComp;
    }

    public static void main(String[] args) {
        // FILENAME = "veraPDF test suite 6-1-2-t02-pass-a.pdf"; // pdf 2b
        // FILENAME = "veraPDF test suite 6-1-12-t03-pass-a.pdf"; // pdf 1b
        // FILENAME = "veraPDF test suite 6-8-2-2-t01-fail-a.pdf"; // pdf 1b
        // FILENAME = "veraPDF test suite 6-8-2-2-t01-pass-a.pdf"; // pdf 1a, 1b
        // FILENAME = "veraPDF test suite 6-2-11-7-2-t01-pass-a.pdf"; // pdf 2b, 2u
        // FILENAME = "veraPDF test suite 6-8-t02-pass-g.pdf"; // pdf 3b
        // FILENAME = "SoapUI_101_eBook_PDF.pdf";
        // FILENAME = "ASUS_MB16AC_English_20170519.pdf";
        FILENAME = "6456729-000063330_2015-R_030825.pdf"; // formular damaged

        ValidationTestOpt val = new ValidationTestOpt();
        PDFAFlavour[] flavours = { PDFAFlavour.PDFA_1_A, PDFAFlavour.PDFA_1_B, PDFAFlavour.PDFA_2_A,
                PDFAFlavour.PDFA_2_B, PDFAFlavour.PDFA_2_U, PDFAFlavour.PDFA_3_A, PDFAFlavour.PDFA_3_B,
                PDFAFlavour.PDFA_3_U };

        File file = new File(FILENAME);
        try (InputStream is = new FileInputStream(
                file) /* new ByteArrayInputStream(FileUtils.readFileToByteArray(file)) */) {
            if (val.isCompliant(is, flavours)) {
                System.out.println("+++ " + FILENAME + " is compliant.");
            } else {
                System.out.println("--- " + FILENAME + " is not compliant.");
            }
        } catch (IOException e) {
            System.out.println("IO exception pri pokusu o otevreni streamu, filename " + FILENAME + ".");
            e.printStackTrace();
        } catch (Exception ex) {
            System.out.println(
                    "Obecna chyba pri parsovani nebo validovani, pravdepodobne jde o nestandardni PDF formular." + ex);
        }
        System.out.println("*** " + FILENAME + " finished.");
    }
}

I need to use Java 7, Java 8+ is not applicable, but when somebody have solution for higher version of Java, it is welcome too.

The solution is like workaround. I is needed to use Java 8+ and dependency setup like this:

<!-- https://mvnrepository.com/artifact/org.verapdf/validation-model -->
<dependency>
    <groupId>org.verapdf</groupId>
    <artifactId>pdfbox-validation-model</artifactId>
    <version>1.13.0-SNAPSHOT</version>
</dependency>

Probably it is needed to have locally installed VeraPDF from https://github.com/veraPDF/veraPDF-pdfbox-validation

This is not solution, but it is useful when it is unnecessary to keep older Java version and preserve execution for those results, which does not need the undefined Class or method. To catch error add this piece to the try-catch block:

        } catch (Throwable error) {
        System.out.println(
                "General Error of PDF."
                        + error);
        error.printStackTrace();
        return false;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM