From 8ed8e4e931c1cb3d3c814a53a07f73b566c3b719 Mon Sep 17 00:00:00 2001 From: Alexander Marsalek Date: Fri, 2 Jul 2021 14:06:44 +0200 Subject: v4.2.0 --- .../impl/signing/pdfbox2/PADESPDFBOXSigner.java | 94 +++++++++++++++++----- 1 file changed, 76 insertions(+), 18 deletions(-) (limited to 'pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java') 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 0a32d7a5..3cf0853f 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 @@ -64,6 +64,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.COSObjectable; import org.apache.pdfbox.pdmodel.common.PDMetadata; import org.apache.pdfbox.pdmodel.common.PDNumberTreeNode; import org.apache.pdfbox.pdmodel.common.PDRectangle; @@ -96,7 +97,10 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { @@ -157,9 +161,11 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { signature.setFilter(COSName.getPDFName(signer.getPDFFilter())); signature.setSubFilter(COSName.getPDFName(signer.getPDFSubFilter())); - SignaturePlaceholderData signaturePlaceholderDataInit = PlaceholderFilter.checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(), placeholder_id); +// SignaturePlaceholderData signaturePlaceholderDataInit = + placeholders =PlaceholderFilter.checkPlaceholderSignatureLocationList(pdfObject.getStatus(), + pdfObject.getStatus().getSettings(), placeholder_id); - placeholders = SignaturePlaceholderExtractor.getPlaceholders(); +// placeholders = SignaturePlaceholderExtractor.getPlaceholders(); availablePlaceholders = listAvailablePlaceholders(placeholders, existingSignatureLocations(doc)); @@ -211,15 +217,16 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } SignatureProfileSettings signatureProfileSettings = TableFactory .createProfile(requestedSignature.getSignatureProfileID(), pdfObject.getStatus().getSettings()); - //Check if input document is PDF-A conform + + //Check if input document is PDF-A conform if (signatureProfileSettings.isPDFA()) { DataSource origDoc = pdfObject.getOriginalDocument(); InputStream stream = origDoc.getInputStream(); //Run PreflightParser for checking conformity// //runPDFAPreflight(origDoc); } - ValueResolver resolver = new ValueResolver(requestedSignature, pdfObject.getStatus()); + String signerName = resolver.resolve("SIG_SUBJECT", signatureProfileSettings.getValue("SIG_SUBJECT"), signatureProfileSettings); @@ -508,12 +515,13 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } } - + PDStructureElement sigBlock = new PDStructureElement("Form", docElement); // create object dictionary and add as child element COSDictionary objectDic = new COSDictionary(); objectDic.setName("Type", "OBJR"); + objectDic.setItem("Pg", signatureField.getWidget().getPage()); objectDic.setItem("Obj", signatureField.getWidget()); @@ -539,7 +547,6 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { // Modify number tree PDNumberTreeNode ntn = structureTreeRoot.getParentTree(); - int parentTreeNextKey = structureTreeRoot.getParentTreeNextKey(); if (ntn == null) { ntn = new PDNumberTreeNode(objectDic, null); logger.info("No number-tree-node found!"); @@ -547,9 +554,10 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { COSArray ntnKids = (COSArray) ntn.getCOSObject().getDictionaryObject(COSName.KIDS); COSArray ntnNumbers = (COSArray) ntn.getCOSObject().getDictionaryObject(COSName.NUMS); - - if(ntnNumbers == null && ntnKids != null){//no number array, so continue with the kids array - + + int parentTreeNextKey = getParentTreeNextKey(structureTreeRoot); + + if(ntnNumbers == null && ntnKids != null){//no number array, so continue with the kids array //create dictionary with limits and nums array COSDictionary pTreeEntry = new COSDictionary(); COSArray limitsArray = new COSArray(); @@ -628,7 +636,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { byte[] outputDocument = bos.toByteArray(); pdfObject.setSignedDocument(outputDocument); } - /* Check if resulting pdf is PDF-A conform */ + /* Check if resulting pdf is PDF-A conform */ if (signatureProfileSettings.isPDFA()) { runPDFAPreflight(new ByteArrayDataSource(pdfObject.getSignedDocument())); } @@ -653,7 +661,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { if (doc != null) { try { doc.close(); - SignaturePlaceholderExtractor.getPlaceholders().clear(); + //SignaturePlaceholderExtractor.getPlaceholders().clear(); } catch (IOException e) { logger.debug("Failed to close COS Doc!", e); // Ignore @@ -663,7 +671,23 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } } - /** + private int getParentTreeNextKey(PDStructureTreeRoot structureTreeRoot) throws IOException { + int nextKey = structureTreeRoot.getParentTreeNextKey(); + if (nextKey < 0) { + Map destNumberTreeAsMap = getNumberTreeAsMap(structureTreeRoot.getParentTree()); + if (destNumberTreeAsMap.isEmpty()) { + nextKey = 0; + + } else { + nextKey = Collections.max(destNumberTreeAsMap.keySet()) + 1; + + } + } + + return nextKey; + } + + /** * Check via PreFlightParser if PDF-Document is a valid PDFA1 * @param signedDocument: signed Document * @throws PdfAsException @@ -914,16 +938,25 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { if(placeholders!=null) { for(int i = 0; i < placeholders.size(); ++i) { //take smallest id - if(!existingPlaceholders.contains(placeholders.get(i).getPlaceholderName())) { + if(!existingPlaceholders.contains(placeholders.get(i).getPlaceholderName())) { SignaturePlaceholderData spd = placeholders.get(i); if (spd.getId() != null) { if(result == null) { result = spd; } else { - String currentID = result.getId(); - String testID = spd.getId(); - if(testID.compareToIgnoreCase(currentID) < 0) { - result = spd; + try{ + int currentID = Integer.parseInt(result.getId()); + int testID = Integer.parseInt(spd.getId()); + if(testID < currentID) { + result = spd; + } + }catch(Exception e){ + //fallback to string compare + String currentID = result.getId(); + String testID = spd.getId(); + if(testID.compareToIgnoreCase(currentID) < 0) { + result = spd; + } } } } @@ -936,7 +969,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { //find first placeholder_id public List listAvailablePlaceholders(List placeholders, List existingPlaceholders) { - List result = null; + List result = new ArrayList<>(); if(placeholders!=null) { for(int i = 0; i < placeholders.size(); ++i) { @@ -948,4 +981,29 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } return result; } + + static Map getNumberTreeAsMap(PDNumberTreeNode tree) + throws IOException + { + Map numbers = tree.getNumbers(); + if (numbers == null) + { + numbers = new LinkedHashMap<>(); + } + else + { + // must copy because the map is read only + numbers = new LinkedHashMap<>(numbers); + } + List kids = tree.getKids(); + if (kids != null) + { + for (PDNumberTreeNode kid : kids) + { + numbers.putAll(getNumberTreeAsMap(kid)); + } + } + return numbers; + } + } \ No newline at end of file -- cgit v1.2.3