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