使用Java添加和验证PDF中的数字签名
Introduction
Digital signature is an effective and commonly used way to protect PDF files from changing by others without permission. This article is going to illustrate how to add digital signature into a PDF file and verify the digital signature using a free Java PDF API - Free Spire.PdF for Java.
Prerequisites
对于maven项目,通过在pom.xml中添加以下代码,我们可以轻松地将依赖关系添加到Java API的Free Spire.PDF中:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>2.4.4</version>
</dependency>
</dependencies>
(The latest version of Free Spire.PDF for Java in maven repository can be found here)
For common Java projects, download the latest version of Free Spire.PDF for Java (download link), then add Spire.Pdf.jar from the lib folder into your project.
Using the code
。 将数字签名添加到PDF文件
要创建数字签名,我们需要创建PdfSignature类的对象,然后设置签名属性。 下面的代码示例演示如何在指定位置将数字签名添加到PDF页面。
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
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.geom.Rectangle2D;
import java.util.Date;
public class AddDigitalSignature {
public static void main(String[] args) {
//Load the PDF file
PdfDocument doc = new PdfDocument();
doc.loadFromFile("Input.pdf");
//Get the first Page
PdfPageBase page = doc.getPages().get(0);
Rectangle2D.Float rec = new Rectangle2D.Float(100, 450, 310, 100);
//Load the .pfx certificate file
PdfCertificate certificate = new PdfCertificate("gary.pfx", "e-iceblue");
//Add digital signature to the first page at specified location
PdfSignature signature = new PdfSignature(doc, page, certificate, "signature1", rec);
//Set signature details
signature.setNameLabel("Signer: ");
signature.setName("Gary");
signature.setContactInfoLabel("ContactInfo: ");
signature.setContactInfo("010-123456");
signature.setDateLabel("Date: ");
signature.setDate(new Date());
signature.setLocationInfoLabel("Location: ");
signature.setLocationInfo("America");
signature.setReasonLabel("Reason: ");
signature.setReason("The certificate of this document.");
signature.setDistinguishedNameLabel("DL: ");
signature.setDistinguishedName(signature.getCertificate().get_IssuerName().getName());
signature.setGraphicMode(GraphicMode.Sign_Name_And_Sign_Detail);
signature.setDocumentPermissions(PdfCertificationFlags.Allow_Form_Fill);
signature.setCertificated(true);
//Save the file
doc.saveToFile("AddSignature.pdf");
}
}
。 验证数字签名
PdfSignature类中的verifySignature()方法用于验证数字签名是否有效。
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;
public class VerifyDigitalSignature {
public static void main(String[] args) {
//Load the PDF file
PdfDocument doc = new PdfDocument();
doc.loadFromFile("AddSignature.pdf");
//Get the forms collection
PdfFormWidget pdfFormWidget = (PdfFormWidget) doc.getForm();
PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();
//Get the signature field
for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) {
if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {
PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
//Get the signature in the signature field
PdfSignature signature = signatureFieldWidget.getSignature();
//Verify the signature
boolean result = signature.verifySignature();
if(result) {
System.out.println("Signature is valid");
}else {
System.out.println("Signature is invalid");
}
}
}
}
}
from: https://dev.to//eiceblue/add-and-verify-digital-signature-in-pdf-with-java-ofg