PDF数字签名信息获取(Java)

发布时间 2024-01-11 09:06:39作者: 糖醋小灰

利用Java代码,读取PDF内的签名信息,包括签发单位、Thumbprint、签发时间等信息。

此处使用了Spire.PDF的相关依赖,Maven项目可使用以下方式引入,或者直接导入相关jar包即可。

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>10.1.3</version>
    </dependency>
</dependencies>

以下为代码,基本上官方文档内容(https://www.e-iceblue.cn/pdf_java_security/get-signature-info-of-pdf-document-using-java.html),增加了签名信息部分:

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 GetSignature {
    public static void main(String[] args) {
        //创建PdfDocument实例
        PdfDocument pdf = new PdfDocument();
        //加载含有签名的PDF文件
        pdf.loadFromFile("D://1.pdf");

        //获取域集合
        PdfFormWidget pdfFormWidget = (PdfFormWidget) pdf.getForm();
        PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.getFieldsWidget();

        //遍历域
        for (int i = 0; i < pdfFormFieldWidgetCollection.getCount(); i++) {
            //判定是否为签名域
            if (pdfFormFieldWidgetCollection.get(i) instanceof PdfSignatureFieldWidget) {
                //获取签名域
                PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget) pdfFormFieldWidgetCollection.get(i);
                //获取签名
                PdfSignature signature = signatureFieldWidget.getSignature();
                String location = signature.getLocationInfo();
                String reason = signature.getReason();
                String data = signature.getDate().toString();
                String name = signature.getSignatureName();
                String certificateInfo = signature.getCertificate().toString();

                // 签名的基础信息
                System.out.println("签名位置信息:" + location + "\n" +
                        "签名原因:" + reason + "\n" +
                        "签名日期:" + data + "\n" +
                        "签名人:" + name + "\n" +
                        "文档中的签名坐标:X = " + signatureFieldWidget.getLocation().getX() + "  Y = " + signatureFieldWidget.getLocation().getY());
                // 签名证书的相关内容
                System.out.println(certificateInfo);
            }
        }
    }
}