首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List : veraPDF PDF/A验证java.lang.NoSuchMethodError

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

Stack Overflow用户
提问于 2018-10-19 22:44:34
回答 2查看 545关注 0票数 0

我使用veraPDF编写了验证器来识别PDF/A (存档)格式。它工作得很好,不是太复杂的PDF,但如果我可以检查更复杂的PDF,例如公式,它会发出java.lang.NoSuchMethodError: org.apache.fontbox.ttf.TrueTypeCollection.getFonts()Ljava/util/List;

我试图解决这个问题,将任何库添加到.pom文件中,但没有成功。实际配置非常简单:

代码语言:javascript
复制
    <dependency>
        <groupId>org.verapdf</groupId>
        <artifactId>pdfbox-validation-model</artifactId>
        <version>1.4.5</version>
    </dependency>

堆栈跟踪:

代码语言:javascript
复制
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,问题也是不同的:

代码语言:javascript
复制
<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>

堆栈跟踪:

代码语言:javascript
复制
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:

代码语言:javascript
复制
...
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解决方案,它也是受欢迎的。

EN

回答 2

Stack Overflow用户

发布于 2018-10-20 06:07:44

解决方案类似于变通方法。我需要像这样使用Java 8+和依赖项设置:

代码语言:javascript
复制
<!-- 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>

可能需要从https://github.com/veraPDF/veraPDF-pdfbox-validation本地安装VeraPDF

票数 0
EN

Stack Overflow用户

发布于 2018-10-22 21:06:03

这不是解决方案,但当不需要保留旧的Java版本并保留这些结果的执行时,它很有用,因为这些结果不需要未定义的类或方法。要捕获错误,请将以下代码段添加到try-catch块:

代码语言:javascript
复制
        } catch (Throwable error) {
        System.out.println(
                "General Error of PDF."
                        + error);
        error.printStackTrace();
        return false;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52894750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档