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; }