Create Image Appearance for Digital Signature
This guide will explain how to create appearance fields for a digital signature following the example code provided in the unipdf-examples repository.
Sample Input

Before you begin
You should get your API key from your UniCloud account.
If this is your first time using UniPDF SDK, follow this guide to set up a local development environment.
Project setup
Clone the project repository
In your terminal, clone examples repository. It contains the Go code we will be using for this guide.
git clone https://github.com/unidoc/unipdf-examples.git
Navigate to the signatures folder in the unipdf-examples directory.
cd unipdf-examples/signatures
Configure environment variables
Replace the UNIDOC_LICENSE_API_KEY with your API credentials from your UniCloud account.
Linux/Mac
export UNIDOC_LICENSE_API_KEY=PUT_YOUR_API_KEY_HERE
Windows
set UNIDOC_LICENSE_API_KEY=PUT_YOUR_API_KEY_HERE
How it works
The necessary UniPDF packages are imported in the import section.
The init function loads the metered license key from the system environment and authenticates your library request.
In the main function, the document is signed and written to a file. First, the inputPath, imageFile, watermarkImageFile and outputPath are read from the command line argument in lines 47-50. The private/public key pair are generated by calling the generateKeys() function in line 53. A new PdfReader object is instantiated from the input file in lines 59-68. The signature image and the watermarkImage are created in lines 71-87.
In lines 95-98, a new model.PdfAppender is instantiated from the reader. The signature handler which is used to create a PdfSignature model is created using the private and public key pair in lines 101 using sighandler.NewAdobePKCS7Detached(priv, cert).
In lines 107-108, the PdfSignature is created and its name, reason and date fields are set. Then the Initialize() method is called on PdfSignature to initialize the object. The for loop in lines 122-240, iterates through each page and applies the signing process. In this section, in lines 126-131, a new annotator.SignatureFieldOpts is created, and the necessary fields are set with the configuration values to create the appearance widget dictionary. Then the model.PdfFieldSignature object is instantiated from the annotator.SignatureFieldOpts, model.PdfSignature and a new annotator.SignatureLine object, as can be seen in the following piece of code.
sigField, err := annotator.NewSignatureField(
signature,
[]*annotator.SignatureLine{
annotator.NewSignatureLine("Name", "Jane Doe"),
annotator.NewSignatureLine("Date", "2019.01.03"),
annotator.NewSignatureLine("Reason", "Image on right"),
annotator.NewSignatureLine("Location", "New York"),
annotator.NewSignatureLine("DN", "authority1:name1"),
},
opts,
)
The T field of the sigField object is set using sigField.T = core.MakeString(fmt.Sprintf("Signature %d", pageNum)) in line 144. Then the current page is signed using appender.Sign(pageNum, sigField) in line 223. A new annotator.SignatureFieldOpts is instantiated and the Rect, Image, and WatermarkImage fields are set in lines 228-231. A model.PdfFieldSignature is created and its T filed is set in lines 231-233. Then the page is signed with the image using appender.Sign(pageNum, sigField) in line 237. Finally, in line 243 the document is written to file using appender.WriteToFile method.
In lines 251-284, the generateKeys function which generates public and private pair of keys is defined.
Run the code
Use the following command to run the code.
go run pdf_image_sign_appearance <INPUT_PDF_PATH> <IMAGE_FILE> <WATERMARK_IMAGE_FILE> <OUTPUT_PDF_PATH>
Sample output
Signature appearance field for image added at bottom.
