Проверка veraPDF PDF / A java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts () Ljava / util / List - PullRequest
0 голосов
/ 19 октября 2018

Я написал валидатор, используя veraPDF для распознавания форматов PDF / A (архив).Это работает хорошо для не слишком сложных PDF, но если я могу проверить более сложные PDF, например, формул, это выдает java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List;.

Я пытаюсь решить эту проблему, чтобы добавить любые библиотеки в файл .pom, но безуспешно.Фактическая конфигурация очень проста:

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

Трассировка стека:

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

Если я добавлю PdfBox в зависимости, даже если apache PdfBox не используется, проблема в другом:

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

Трассировка стека:

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)

Как проверяемый при импорте кода тестирования, PdfBox не используется:

...
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.");
    }
}

Мне нужно использовать Java 7, Java 8+неприменимо, но когда у кого-то есть решение для более высокой версии Java, это тоже приветствуется.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Это не решение, но оно полезно, когда нет необходимости сохранять более старую версию Java и сохранять выполнение для тех результатов, для которых не требуется неопределенный класс или метод.Чтобы поймать ошибку, добавьте этот фрагмент в блок try-catch:

        } catch (Throwable error) {
        System.out.println(
                "General Error of PDF."
                        + error);
        error.printStackTrace();
        return false;
    }
0 голосов
/ 20 октября 2018

Решение похоже на обходной путь.Мне нужно использовать Java 8+ и настройку зависимостей следующим образом:

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

Возможно, необходимо иметь локально установленный VeraPDF из https://github.com/veraPDF/veraPDF-pdfbox-validation

...