#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);
Ответ №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);
Комментарии:
1. Спасибо, не могли бы вы ознакомиться с обновленным разделом вопроса?
2. «не могли бы вы ознакомиться с обновленным разделом вопроса» — Да. Поля подписи в этом PDF-файле помечены как скрытые, поэтому визуализация подписи, которую вы создаете во время подписи, не видна. Смотрите мою правку «Проблема С ФОРМОЙ FDA 1571».