Author: tilman
Date: Thu Oct 13 17:22:57 2016
New Revision: 1764742

URL: http://svn.apache.org/viewvc?rev=1764742&view=rev
Log:
PDFBOX-3535: improve example to sign existing signature field

Modified:
    
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java

Modified: 
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java?rev=1764742&r1=1764741&r2=1764742&view=diff
==============================================================================
--- 
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java
 (original)
+++ 
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java
 Thu Oct 13 17:22:57 2016
@@ -28,15 +28,20 @@ import java.security.NoSuchAlgorithmExce
 import java.security.UnrecoverableKeyException;
 import java.security.cert.CertificateException;
 import java.util.Calendar;
+import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.io.IOUtils;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
 import 
org.apache.pdfbox.pdmodel.interactive.digitalsignature.ExternalSigningSupport;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 import 
org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureInterface;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions;
 import 
org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigProperties;
 import 
org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSignDesigner;
+import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
 
 /**
  * This is an example for visual signing a pdf.
@@ -63,7 +68,7 @@ public class CreateVisibleSignature exte
     {
         
visibleSignatureProperties.signerName(name).signerLocation(location).signatureReason(reason).
                 
preferredSize(preferredSize).page(page).visualSignEnabled(visualSignEnabled).
-                setPdVisibleSignature(visibleSignDesigner).buildSignature();
+                setPdVisibleSignature(visibleSignDesigner);
     }
 
     /**
@@ -107,8 +112,18 @@ public class CreateVisibleSignature exte
         // load document
         PDDocument doc = PDDocument.load(inputFile);
 
-        // create signature dictionary
-        PDSignature signature = new PDSignature();
+        PDSignature signature;
+
+        // You will usually not need this:
+        // sign a PDF with an existing empty signature, as created by the 
+        // CreateEmptySignatureForm example. Delete this line if you want to 
insert a new signature.
+        signature = findExistingSignature(doc, "Signature1");
+
+        if (signature == null)
+        {
+            // create signature dictionary
+            signature = new PDSignature();
+        }
 
         // default filter
         signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE);
@@ -118,6 +133,9 @@ public class CreateVisibleSignature exte
         
         if (visibleSignatureProperties != null)
         {
+            // this builds the signature structures in a separate document
+            visibleSignatureProperties.buildSignature();
+
             signature.setName(visibleSignatureProperties.getSignerName());
             
signature.setLocation(visibleSignatureProperties.getSignerLocation());
             
signature.setReason(visibleSignatureProperties.getSignatureReason());
@@ -163,6 +181,44 @@ public class CreateVisibleSignature exte
         IOUtils.closeQuietly(signatureOptions);
     }
 
+    // Find an existing signature (assumed to be empty). You will usually not 
need this.
+    private PDSignature findExistingSignature(PDDocument doc, String 
sigFieldName)
+    {
+        PDSignature signature = null;
+        PDSignatureField signatureField;
+        PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
+        if (acroForm != null)
+        {
+            signatureField = (PDSignatureField) 
acroForm.getField(sigFieldName);
+            if (signatureField != null)
+            {
+                // retrieve signature dictionary
+                signature = signatureField.getSignature();
+                if (signature == null)
+                {
+                    signature = new PDSignature();
+                    // after solving PDFBOX-3524
+                    // signatureField.setValue(signature)
+                    // until then:
+                    signatureField.getCOSObject().setItem(COSName.V, 
signature);
+                }
+                else
+                {
+                    //TODO add your error handling here:
+                    // it doesn't make sense to replace an existing signature
+                }
+                // position according to existing field widget
+                PDAnnotationWidget widget = signatureField.getWidgets().get(0);
+                PDRectangle rect = widget.getRectangle();
+                // need to substract from height because this is done later too
+                // see in PDVisibleSigBuilder.createSignatureRectangle()
+                visibleSignDesigner.xAxis(rect.getLowerLeftX())
+                        .yAxis(-rect.getLowerLeftY() + 
visibleSignatureProperties.getPdVisibleSignature().getPageHeight() - 
visibleSignDesigner.getHeight());
+            }
+        }
+        return signature;
+    }
+
     /**
      * Arguments are
      * [0] key store


Reply via email to