[Java adds and verifies PDF digital signature]

Among the methods for setting up document content protection, in addition to encrypting documents and adding watermarks, applying digital signatures is also an effective means of document anti-counterfeiting and protection. Digitally signed documents are easy to verify and have high authority and credibility. In Adobe PDF documents, there are functions and methods to directly add or verify digital signatures. In the following article, we will use a Java program to introduce adding digital signatures to PDF documents and verify whether the signature is valid.

Tools used: Spire.PDF for Java

Jar file acquisition and import methods: various files

 <dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>

    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>5.1.0</version>
    </dependency>


\t
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
    </dependency>

    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.presentation.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
\t
<dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.office.free</artifactId>
        <version>5.3.1</version>
    </dependency>

Java code example
【Example 1】Add digital signature to PDF

import com.spire.pdf.*;
import com.spire.pdf.graphics.PdfImage;
import com.spire.pdf.graphics.PdfTrueTypeFont;
import com.spire.pdf.security.GraphicMode;
import com.spire.pdf.security.PdfCertificate;
import com.spire.pdf.security.PdfCertificationFlags;
import com.spire.pdf.security.PdfSignature;

import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

public class AddCertificate {<!-- -->
 public static void main(String[]args){<!-- -->
        //Load PDF document
        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("test.pdf");

        //Load the pfx certificate and certificate key
        PdfCertificate cert = new PdfCertificate("Cermia.pfx","123654yes!");

        //Add a digital signature to the specified page and set its position and size
        PdfSignature signature = new PdfSignature(doc, doc.getPages().get(2), cert, "MySignature");
        Rectangle2D rect = new Rectangle2D.Float();
        rect.setFrame(new Point2D.Float((float) doc.getPages().get(0).getActualSize().getWidth() - 340, (float) doc.getPages().get(0).getActualSize() .getHeight() - 230), new Dimension(280, 150));
        signature.setBounds(rect);

        //Set signature to image plus text mode
        signature.setGraphicMode(GraphicMode.Sign_Image_And_Sign_Detail);

        //Set signature content
        signature.setNameLabel("Signed by:");
        signature.setName("Mia");
        signature.setContactInfoLabel("Contact number:");
        signature.setContactInfo("02881705109");
        signature.setDateLabel("Date:");
        signature.setDate(new java.util.Date());
        signature.setLocationInfoLabel("Location:");
        signature.setLocationInfo("Chengdu");
        signature.setReasonLabel("Reason:");
        signature.setReason("Document Owner");
        signature.setDistinguishedNameLabel("DN: ");
        signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
        signature.setSignImageSource(PdfImage.fromFile("sign.png"));

        //Set signature font
        signature.setSignDetailsFont(new PdfTrueTypeFont(new Font("Arial Unicode MS", Font.PLAIN, 9)));

        //Set document permissions to prohibit changes
        signature.setDocumentPermissions(PdfCertificationFlags.Forbid_Changes);
        signature.setCertificated(true);

        //save document
        doc.saveToFile("AddSignature.pdf");
        doc.close();
    }
}

Digital signature adding effects:

[Example 2] Verify the validity of digital signature

import com.spire.pdf.*;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormFieldWidgetCollection;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;

import javax.swing.*;

public class ValidateSignature {<!-- -->
 public static void main(String[]args){<!-- -->
       //Create PdfDocument instance
       PdfDocument doc = new PdfDocument();
       //Load the PDF file containing the signature
       doc.loadFromFile("SignedFile.pdf");

       //Get the domain collection
       PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();
       PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();

       //Traverse the fields
       for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i + + ) {<!-- -->
            //Determine whether it is a signature domain
            if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {<!-- -->
            //Get signature domain
                PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
                //Get signature
                PdfSignature signature = signatureFieldWidget.getSignature();

                //Determine whether the signature is valid
                boolean result = signature.verifySignature();
                   if (result) {<!-- -->
                    String str1 ="valid signature";
                    JOptionPane.showMessageDialog(null,str1);
                      } else {<!-- -->
                      String str2 ="Invalid signature";
                    JOptionPane.showMessageDialog(null,str2);
                }
            }
        }

    }
}

Verification results:

Example 3: Alibaba oss address translation example

import com.cnmyhr.base.exception.BaseBusinessException;
import com.cnmyhr.base.util.FileUtil;
import com.cnmyhr.base.vo.contract.PDFContractValidateSignatureVO;
import com.cnmyhr.contract.service.HandleContractService;
import com.cnmyhr.contract.service.ValidateSignatureService;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormFieldWidgetCollection;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public boolean validatePDFContract(String signUrl){<!-- -->
        File file = null;
        try {<!-- -->
            int indexOf = signUrl.lastIndexOf(".");
            String substring = signUrl.substring(indexOf);
            if(!".pdf".equals(substring)){<!-- -->
                throw new BaseBusinessException("Not a PDF contract document!");
            }
            long currentTimeMillis = System.currentTimeMillis();
            String temporaryDirectory = FileUtil.getTemporaryDirectory();
            String filePath = temporaryDirectory + currentTimeMillis + substring;
            URL url = new URL(signUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {<!-- -->
                InputStream is = conn.getInputStream();
                file = new File(filePath); //Specify the path and name of the saved file
                if(!file.exists()){<!-- -->
                    File temporaryDirectoryFile = new File(temporaryDirectory);
                    temporaryDirectoryFile.mkdirs();
                    file.createNewFile();
                }
                FileOutputStream fos = new FileOutputStream(file);
                byte[] buffer = new byte[4096];
                int len;
                while ((len = is.read(buffer)) > 0) {<!-- -->
                    fos.write(buffer, 0, len);
                }
                fos.close();
                is.close();
            } else {<!-- -->
                throw new BaseBusinessException("The file address is incorrect!");
            }
            //Create PdfDocument instance
            PdfDocument doc = new PdfDocument();
            //Load the PDF file containing the signature
            doc.loadFromFile(filePath);
            //Get the domain collection
            PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();
            //Traverse the fields
            for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i + + ) {<!-- -->
                //Determine whether it is a signature domain
                if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {<!-- -->
                    //Get signature domain
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
                    //Get signature
                    PdfSignature signature = signatureFieldWidget.getSignature();
                    //Determine whether the signature is valid
                    try {<!-- -->
                        boolean result = signature.verifySignature();
                        if (result) {<!-- -->
                            return true;
                        } else {<!-- -->
                            return false;
                        }
                    }catch (Exception e){<!-- -->
                        return false;
                    }
                }
            }
        } catch (Exception e) {<!-- -->
            e.printStackTrace();
            throw new BaseBusinessException("File verification failed, please try again!");
        }finally {<!-- -->
            file.delete();
        }
        return false;
   }