在 Java 中从 PDF 提取签名信息

使用 PdfFileSignature 检查并管理 PDF 文档中已存在的签名。

读取签名信息

  1. 创建 PdfFileSignature 对象并绑定源 PDF 文档。
  2. 访问文档签名名称并配置示例所需的签名检查流程。
  3. 从 PdfFileSignature 对象读取并验证签名信息。
  4. 读取返回的值,或继续进行下一步处理。
public static void getSignatureInformation(Path inputFile) {
    PdfFileSignature pdfSignature = new PdfFileSignature();
    try {
        pdfSignature.bindPdf(inputFile.toString());
        SignatureName signatureName = pdfSignature.getSignatureNames().get_Item(0);
        System.out.println("Signature Names: " + pdfSignature.getSignNames());
        System.out.println("Signer: " + pdfSignature.getSignerName(signatureName));
        System.out.println("Date: " + pdfSignature.getDateTime(signatureName));
        System.out.println("Reason: " + pdfSignature.getReason(signatureName));
        System.out.println("Location: " + pdfSignature.getLocation(signatureName));
    } finally {
        pdfSignature.close();
    }
}

验证签名

  1. 创建 PdfFileSignature 对象并绑定源 PDF 文档。
  2. 访问文档签名名称并配置示例所需的验证流程。
  3. 从 PdfFileSignature 对象读取并验证签名信息。
public static void verifyPdfSignature(Path inputFile) {
    PdfFileSignature pdfSignature = new PdfFileSignature();
    try {
        pdfSignature.bindPdf(inputFile.toString());
        SignatureName signatureName = pdfSignature.getSignatureNames().get_Item(0);
        System.out.println("Signature '" + signatureName + "' is valid: "
                + pdfSignature.verifySignature(signatureName));
        System.out.println("Signature covers whole document: "
                + pdfSignature.coversWholeDocument(signatureName));
    } finally {
        pdfSignature.close();
    }
}

提取签名证书

  1. 创建 PdfFileSignature 对象并绑定源 PDF 文档。
  2. 获取证书提取所需的文档签名名称。
  3. 写入提取的输出或检查返回的值 PdfFileSignature 对象。
public static void extractSignatureCertificate(Path inputFile, Path outputFile) throws Exception {
    PdfFileSignature pdfSignature = new PdfFileSignature();
    try {
        pdfSignature.bindPdf(inputFile.toString());
        SignatureName signatureName = pdfSignature.getSignatureNames().get_Item(0);
        try (InputStream inputStream = pdfSignature.extractCertificate(signatureName);
             OutputStream outputStream = Files.newOutputStream(outputFile)) {
            inputStream.transferTo(outputStream);
        }
    } finally {
        pdfSignature.close();
    }
}