Assinar documentos PDF a partir de um Smart Card em Java

O repositório atual de Java não inclui um exemplo dedicado de assinatura com cartão inteligente baseado em fonte sob facades/pdffilesignature, mas o fluxo de trabalho a seguir mostra o padrão típico de API para assinar um PDF com um certificado selecionado de um armazenamento de certificados local.

Assinar um documento PDF a partir de um cartão inteligente

  1. Abra o PDF de origem em um objeto Document.
  2. Crie um PdfFileSignature fachada e vincule o documento PDF de origem.
  3. Recupere o certificado local e crie o necessário ExternalSignature.
  4. Configure a aparência da assinatura visual e o destino Rectangle.
  5. Aplique a assinatura ao documento PDF através de PdfFileSignature.
  6. Salve o documento PDF atualizado.
  7. Vincule o documento carregado à fachada PdfFileSignature com bindPdf(...).
  8. Recupere o certificado local que representa a credencial do cartão inteligente chamando getLocalCertificate().
  9. Verifique se um certificado foi encontrado. Caso contrário, salve o arquivo de saída inalterado e interrompa o fluxo de trabalho.
  10. Crie um ExternalSignature a partir do certificado selecionado.
  11. Defina a imagem de aparência da assinatura visual com setSignatureAppearance(...).
  12. Chame sign(...) com a página de destino, motivo, contato, localização, sinalizador de visibilidade, assinatura Rectangle, e objeto de assinatura externa.
  13. Salve o PDF assinado no caminho de saída.
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());
    }
}