在 Java 中使用智能卡签署 PDF 文档

当前的 Java 仓库未在下面包含专用的基于源的智能卡签名示例 facades/pdffilesignature,但下面的工作流展示了使用从本地证书存储中选择的证书对 PDF 进行签名的典型 API 模式。

使用智能卡签署 PDF 文档

  1. 打开源 PDF Document。
  2. 创建一个 PdfFileSignature 对象并绑定源 PDF 文档。
  3. 检索本地证书并创建所需的 ExternalSignature。
  4. 配置可视签名外观和目标 Rectangle。
  5. 通过以下方式将签名应用于 PDF 文档 PdfFileSignature。
  6. 保存更新后的 PDF 文档。
  7. 调用 PdfFileSignature 的 bindPdf(...) 方法,绑定已加载的文档。
  8. 通过调用检索表示智能卡凭据的本地证书 getLocalCertificate()。
  9. 检查是否找到证书。如果没有,保存未更改的输出文件并停止工作流。
  10. 创建一个 ExternalSignature 从选定的证书中。
  11. 调用 setSignatureAppearance(...) 设置可视签名外观图像。
  12. 调用 sign(...) 带有目标页面、原因、联系人、位置、可见性标志、签名 Rectangle,以及外部签名对象。
  13. 将已签名的 PDF 保存到输出路径。
public static void signWithSmartCard(Path inputFile, Path outputFile, Path pngFile) {
    try (Document document = new Document(inputFile.toString());
            PdfFileSignature pdfSignature = new PdfFileSignature()) {
        pdfSignature.bindPdf(document);
        X509Certificate2 selectedCertificate = getLocalCertificate();
        if (selectedCertificate == null) {
            System.out.println("Local certificate was not found.");
            document.save(outputFile.toString());
            return;
        }

        ExternalSignature externalSignature = new ExternalSignature(selectedCertificate, null);
        pdfSignature.setSignatureAppearance(pngFile.toString());
        pdfSignature.sign(1, "Reason", "Contact", "Location", true,
                new java.awt.Rectangle(100, 100, 200, 200), externalSignature);
        pdfSignature.save(outputFile.toString());
    }
}