Подписание PDF-документов со смарт-карты на Java

В текущем репозитории Java нет отдельного примера подписания с помощью смарт-карты, подкрепленного исходным кодом в разделе facades/pdffilesignature. Однако приведенный ниже рабочий процесс демонстрирует типичную схему использования API для подписания PDF с помощью сертификата, выбранного из локального хранилища сертификатов.

Подписание 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());
    }
}