Menandatangani dokumen PDF dari Smart Card di Java

Repositori Java saat ini tidak menyertakan contoh penandatanganan kartu pintar berbasis sumber yang berdedikasi di bawah facades/pdffilesignature, tetapi alur kerja berikut menunjukkan pola API khas untuk menandatangani PDF dengan sertifikat yang dipilih dari penyimpanan sertifikat lokal.

Menandatangani dokumen PDF dari kartu pintar

  1. Buka PDF sumber Document.
  2. Buat sebuah fasad PdfFileSignature dan ikat dokumen PDF sumber.
  3. Ambil sertifikat lokal dan buat yang diperlukan ExternalSignature.
  4. Konfigurasikan penampilan tanda tangan visual dan targetnya Rectangle.
  5. Terapkan tanda tangan ke dokumen PDF melalui PdfFileSignature.
  6. Simpan dokumen PDF yang diperbarui.
  7. Hubungkan dokumen yang dimuat ke fasad PdfFileSignature dengan bindPdf(...).
  8. Ambil sertifikat lokal yang mewakili kredensial kartu pintar dengan memanggil getLocalCertificate().
  9. Periksa apakah sertifikat ditemukan. Jika tidak, simpan file output yang tidak diubah dan hentikan alur kerja.
  10. Buat sebuah ExternalSignature dari sertifikat yang dipilih.
  11. Setel gambar tampilan tanda tangan visual dengan setSignatureAppearance(...).
  12. Panggil sign(...) dengan halaman target, alasan, kontak, lokasi, flag visibilitas, tanda tangan Rectangle, dan objek tanda tangan eksternal.
  13. Simpan PDF yang sudah ditandatangani ke jalur output.
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());
    }
}