You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/10/13 17:22:58 UTC
svn commit: r1764742 -
/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/CreateVisibleSignature.java
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