Author: tilman Date: Fri Oct 19 17:18:23 2018 New Revision: 1844358 URL: http://svn.apache.org/viewvc?rev=1844358&view=rev Log: PDFBOX-4343: Prevent calling addSignature twice, remove misleading method addSignatureField
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1844358&r1=1844357&r2=1844358&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Fri Oct 19 17:18:23 2018 @@ -147,7 +147,10 @@ public class PDDocument implements Close // document-wide cached resources private ResourceCache resourceCache = new DefaultResourceCache(); - + + // to make sure only one signature is added + private boolean signatureAdded = false; + /** * Creates an empty PDF document. * You need to add at least one page for the document to be valid. @@ -215,9 +218,14 @@ public class PDDocument implements Close * Add parameters of signature to be created externally using default signature options. See * {@link #saveIncrementalForExternalSigning(OutputStream)} method description on external * signature creation scenario details. + * <p> + * Only one signature may be added at in a document. To sign several times, + * load document, add signature, save incremental and close again. * * @param sigObject is the PDSignatureField model * @throws IOException if there is an error creating required fields + * @throws IllegalStateException if one attempts to add several signature + * fields. */ public void addSignature(PDSignature sigObject) throws IOException { @@ -228,10 +236,15 @@ public class PDDocument implements Close * Add parameters of signature to be created externally. See * {@link #saveIncrementalForExternalSigning(OutputStream)} method description on external * signature creation scenario details. + * <p> + * Only one signature may be added at in a document. To sign several times, + * load document, add signature, save incremental and close again. * * @param sigObject is the PDSignatureField model * @param options signature options * @throws IOException if there is an error creating required fields + * @throws IllegalStateException if one attempts to add several signature + * fields. */ public void addSignature(PDSignature sigObject, SignatureOptions options) throws IOException { @@ -240,11 +253,16 @@ public class PDDocument implements Close /** * Add a signature to be created using the instance of given interface. + * <p> + * Only one signature may be added at in a document. To sign several times, + * load document, add signature, save incremental and close again. * * @param sigObject is the PDSignatureField model * @param signatureInterface is an interface whose implementation provides * signing capabilities. Can be null if external signing if used. * @throws IOException if there is an error creating required fields + * @throws IllegalStateException if one attempts to add several signature + * fields. */ public void addSignature(PDSignature sigObject, SignatureInterface signatureInterface) throws IOException { @@ -255,16 +273,27 @@ public class PDDocument implements Close * This will add a signature to the document. If the 0-based page number in the options * parameter is smaller than 0 or larger than max, the nearest valid page number will be used * (i.e. 0 or max) and no exception will be thrown. + * <p> + * Only one signature may be added at in a document. To sign several times, + * load document, add signature, save incremental and close again. * * @param sigObject is the PDSignatureField model * @param signatureInterface is an interface whose implementation provides * signing capabilities. Can be null if external signing if used. * @param options signature options * @throws IOException if there is an error creating required fields + * @throws IllegalStateException if one attempts to add several signature + * fields. */ public void addSignature(PDSignature sigObject, SignatureInterface signatureInterface, SignatureOptions options) throws IOException { + if (signatureAdded) + { + throw new IllegalStateException("Only one signature may be added at in a document"); + } + signatureAdded = true; + // Reserve content // We need to reserve some space for the signature. Some signatures including // big certificate chain and we need enough space to store it. @@ -568,67 +597,6 @@ public class PDDocument implements Close } /** - * This will add a list of signature fields to the document. - * - * @param sigFields are the PDSignatureFields that should be added to the - * document - * @param signatureInterface is an interface whose implementation provides - * signing capabilities. Can be null if external signing if used. - * @param options signature options - * @throws IOException if there is an error creating required fields - */ - public void addSignatureField(List<PDSignatureField> sigFields, SignatureInterface signatureInterface, - SignatureOptions options) throws IOException - { - PDDocumentCatalog catalog = getDocumentCatalog(); - catalog.getCOSObject().setNeedToBeUpdated(true); - - PDAcroForm acroForm = catalog.getAcroForm(); - if (acroForm == null) - { - acroForm = new PDAcroForm(this); - catalog.setAcroForm(acroForm); - } - COSDictionary acroFormDict = acroForm.getCOSObject(); - acroFormDict.setDirect(true); - acroFormDict.setNeedToBeUpdated(true); - if (!acroForm.isSignaturesExist()) - { - // 1 if at least one signature field is available - acroForm.setSignaturesExist(true); - } - - List<PDField> acroformFields = acroForm.getFields(); - - for (PDSignatureField sigField : sigFields) - { - sigField.getCOSObject().setNeedToBeUpdated(true); - - // Check if the field already exists - boolean checkSignatureField = checkSignatureField(acroForm.getFieldIterator(), sigField); - if (checkSignatureField) - { - sigField.getCOSObject().setNeedToBeUpdated(true); - } - else - { - acroformFields.add(sigField); - } - - // Check if we need to add a signature - if (sigField.getSignature() != null) - { - sigField.getCOSObject().setNeedToBeUpdated(true); - if (options == null) - { - // TODO ?? - } - addSignature(sigField.getSignature(), signatureInterface, options); - } - } - } - - /** * Remove the page from the document. * * @param page The page to remove from the document.