From 65eb7054679d63a4f519bd31eb37805666e6fef8 Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Mon, 12 Dec 2016 07:50:25 +0100 Subject: added PDF/A-3b support, and PDF/A version detection --- .../impl/signing/pdfbox2/PADESPDFBOXSigner.java | 40 +++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2') diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java index 8965ce0e..901e47db 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java @@ -48,6 +48,7 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.common.PDMetadata; import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; @@ -68,6 +69,9 @@ import org.apache.pdfbox.preflight.exception.ValidationException; import org.apache.pdfbox.preflight.parser.PreflightParser; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; +import org.apache.xmpbox.XMPMetadata; +import org.apache.xmpbox.schema.PDFAIdentificationSchema; +import org.apache.xmpbox.xml.DomXmpParser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -132,6 +136,8 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { PDFASPDFBOXSignatureInterface signer = (PDFASPDFBOXSignatureInterface) genericSigner; + String pdfaVersion = null; + PDDocument doc = null; SignatureOptions options = new SignatureOptions(); COSDocument visualSignatureDocumentGuard = null; @@ -221,6 +227,11 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } options.setPreferredSignatureSize(signatureSize); + if(signatureProfileSettings.isPDFA() || signatureProfileSettings.isPDFA3()) { + pdfaVersion = getPDFAVersion(doc); + signatureProfileSettings.setPDFAVersion(pdfaVersion); + } + // Is visible Signature if (requestedSignature.isVisual()) { logger.info("Creating visual siganture block"); @@ -352,7 +363,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } - if (signatureProfileSettings.isPDFA()) { + if (signatureProfileSettings.isPDFA() || signatureProfileSettings.isPDFA3()) { PDDocumentCatalog root = doc.getDocumentCatalog(); COSBase base = root.getCOSObject().getItem(COSName.OUTPUT_INTENTS); if (base == null) { @@ -807,4 +818,31 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { throw ErrorExtractor.searchPdfAsError(e, status); } } + + private String getPDFAVersion(PDDocument doc) { + try { + PDDocumentCatalog cat = doc.getDocumentCatalog(); + PDMetadata metadata = cat.getMetadata(); + + if(metadata != null) { + DomXmpParser xmpParser = new DomXmpParser(); + XMPMetadata xmpMetadata = xmpParser.parse(metadata.exportXMPMetadata()); + if(xmpMetadata != null) { + PDFAIdentificationSchema pdfaIdentificationSchema = xmpMetadata.getPDFIdentificationSchema(); + if (pdfaIdentificationSchema != null) { + Integer pdfaversion = pdfaIdentificationSchema.getPart(); + String conformance = pdfaIdentificationSchema.getConformance(); + logger.info("Detected PDF/A Version: {} - {}", pdfaversion, conformance); + + if(pdfaversion != null) { + return String.valueOf(pdfaversion); + } + } + } + } + } catch (Throwable e) { + logger.warn("Failed to determine PDF/A Version!", e); + } + return null; + } } -- cgit v1.2.3