使用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");
    }
}

Add Signature

。 验证数字签名

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

Verify Signature

from: https://dev.to//eiceblue/add-and-verify-digital-signature-in-pdf-with-java-ofg

THE END
< <上一篇
下一篇>>