Я написал валидатор, используя 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, это тоже приветствуется.