Firmar documentos PDF desde una tarjeta inteligente en Java

El repositorio actual de Java no incluye un ejemplo dedicado de firma con tarjeta inteligente respaldado por código fuente bajo facades/pdffilesignature, pero el siguiente flujo de trabajo muestra el patrón típico de API para firmar un PDF con un certificado seleccionado de un almacén de certificados local.

Firmar un documento PDF desde una tarjeta inteligente

  1. Abra el PDF de origen Document.
  2. Cree una fachada PdfFileSignature y enlace el documento PDF de origen.
  3. Recupere el certificado local y cree lo necesario ExternalSignature.
  4. Configure la apariencia visual de la firma y el objetivo Rectangle.
  5. Aplique la firma al documento PDF a través de PdfFileSignature.
  6. Guarde el documento PDF actualizado.
  7. Vincule el documento cargado a la fachada PdfFileSignature con bindPdf(...).
  8. Recupere el certificado local que representa la credencial de tarjeta inteligente llamando getLocalCertificate().
  9. Compruebe si se encontró un certificado. Si no, guarda el archivo de salida sin cambios y deténgase el flujo de trabajo.
  10. Cree un ExternalSignature a partir del certificado seleccionado.
  11. Establezca la imagen de apariencia de la firma visual con setSignatureAppearance(...).
  12. Llame sign(...) con la página de destino, razón, contacto, ubicación, bandera de visibilidad, firma Rectangle, y objeto de firma externo.
  13. Guarde el PDF firmado en la ruta de salida.
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());
    }
}