Поле подписи остается неподписанным после подписания

#digital-signature #itext7

Вопрос:

Я выполнял подписание с помощью библиотеки iText7. Я попытался подписать одно из полей подписи, доступных в документе, но после подписания оно по-прежнему показывает, что поле не подписано. Ниже приведен фрагмент кода, который я использую для подписи.

 String fieldName = "signature1";
PdfAcroForm pdfAcroForm = PdfAcroForm.getAcroForm(pdfDocument, false);
PdfArray pdfArray = pdfAcroForm.getField(fieldName).getWidgets().get(0).getRectangle();
Rectangle rect = pdfArray.toRectangle();
PdfSignatureAppearance appearance = pdfSigner.getSignatureAppearance().setReason("Test")
    .setLocation("Test").setReuseAppearance(false);
appearance.setPageRect(rect).setPageNumber(1);
IExternalSignature pks =
     new PrivateKeySignature(pk, DigestAlgorithms.SHA256, provider.getName());
pdfSigner.signDetached(new BouncyCastleDigest(), pks, chain, null, null, null, 0, CryptoStandard.CMS);
 

оригинальный pdf-файл
amp; подписанный pdf

Обновленный

Для следующего pdf-файла я не получаю видимость подписи в документе, несмотря на то, что подписываю поле, как указано в ответе; однако я работаю с вышеуказанным ранее общим pdf-файлом.

 pdfSigner.setFieldName(fieldName);
 

оригинальный pdf-файл
amp; подписанный pdf

Ответ №1:

Первоначальный Выпуск

Вы забыли указать PdfSigner , чтобы подписать одно из существующих полей формы, поэтому оно создает новое поле и подписывает его.

Чтобы указать iText использовать определенное поле, используйте PdfSigner.setFieldName :

 pdfSigner.setFieldName(fieldName);
 

В соответствии с его JavaDocs этот метод

Задает имя, указывающее поле, которое должно быть подписано. Поле уже может быть представлено в документе, но не должно быть подписано. Если поле не представлено в документе, оно будет создано.

(«представлен» должно было быть «присутствует», я думаю…)

Как только вы это сделаете, отпадет необходимость в

 appearance.setPageRect(rect).setPageNumber(1);
 

больше, поскольку используются прямоугольник и номер страницы существующего поля формы.

Проблема С ФОРМОЙ FDA 1571

В обновлении вы предоставили общий доступ к файлу, для которого внешний вид подписи не отображался, несмотря на исправление, упомянутое выше, форма FDA 1571.

Причина этого проста: поля подписи в этом документе невидимы до и после подписания!

перед подписанием после подписания
перед подписанием после подписания

Таким образом, совершенно правильно, что вы не видите внешний вид подписи.

Если вы хотите, чтобы подпись выглядела видимой, вы должны убедиться, что поле подписи видно.

Существует ряд ситуаций, в которых внешний вид подписи невидим, в частности:

  • На виджет подписи нет ссылок ни с одной страницы.
  • Прямая запись виджета подписи находится за пределами страницы (за пределами поля обрезки страницы).
  • Прямая запись виджета подписи имеет ширину или высоту 0.
  • Виджет подписи принадлежит к дополнительной группе содержимого (он же слой), которая отключена.
  • Установлен один из флагов виджета подписи Невидимый, Скрытый или Новый.

В случае вашей формы FDA 1571 установлен Скрытый флаг.

Вы можете снять этот флаг следующим образом:

 PdfAcroForm.getAcroForm(pdfSigner.getDocument(), false)
    .getField(fieldName)
    .setVisibility(PdfFormField.VISIBLE);
 

(Из теста testFda1571 SignWithAdaptions )

Если вам интересно, почему после ручной подписи документа подпись видна: кнопка «Подписать» в форме выполняет немного JavaScript, который, помимо прочего, также удаляет этот скрытый флаг.

Комментарии:

1. Спасибо, не могли бы вы ознакомиться с обновленным разделом вопроса?

2. «не могли бы вы ознакомиться с обновленным разделом вопроса» — Да. Поля подписи в этом PDF-файле помечены как скрытые, поэтому визуализация подписи, которую вы создаете во время подписи, не видна. Смотрите мою правку «Проблема С ФОРМОЙ FDA 1571».