pdf #itext #sign #pdfstamper
#PDF #itext #подписать #pdfstamper
Вопрос:
У меня есть код, который успешно добавляет видимый блок подписи в «обычный» PDF.
<...>
PdfStamper stamper = PdfStamper.createSignature(reader, os, '');
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setVisibleSignature(new Rectangle(c[0], c[1], c[2], c[3]), 1, field);
createVisigbleSignature(stamper, appearance, signFont, signTxt, img);
<...>
public static void createVisigbleSignature(PdfStamper stamper, PdfSignatureAppearance appearance, Font font, String text, byte[] img) throws Exception {
PdfTemplate layer2 = appearance.getLayer(2);
float size = -1;
final float MARGIN = 2;
Rectangle dataRect = new Rectangle(MARGIN, MARGIN, appearance.getRect().getWidth() - MARGIN, appearance.getRect().getHeight() - MARGIN);
Rectangle sr = new Rectangle(dataRect.getWidth(), dataRect.getHeight());
size = ColumnText.fitText(font, text, sr, 12, appearance.getRunDirection());
ColumnText ct = new ColumnText(layer2);
ct.setRunDirection(appearance.getRunDirection());
ct.setSimpleColumn(new Phrase(text, font), dataRect.getLeft(), dataRect.getBottom(), dataRect.getRight(), dataRect.getTop(), size, Element.ALIGN_LEFT);
ct.go();
//image
Image image = Image.getInstance(img);
layer2.addImage(image, appearance.getRect().getWidth(), 0, 0, appearance.getRect().getHeight(), 0, 0);
}
Но если я попытаюсь подписать PDF, содержащий только изображение (в основном это изображение, экспортируемое в формате pdf), мой видимый блок подписи больше не будет виден.
Acrobate Reader видит контейнер подписи, но пользователь не может увидеть или щелкнуть «видимый» блок.
В чем может быть причина этого и как убедиться, что информация подписи видна, несмотря ни на что?
Вот примеры:
https://drive.google.com/drive/folders/1hnROu5UVXECi-hy9FY5ZXJLDK_jdwjch?usp=sharing normal.pdf и photo.pdf — это файлы перед подписанием. normal_pre.pdf и photo.pre.pdf предварительно подписаны.
Знак будет рассматриваться как «сломанный». Это нормально, поскольку PDF-файлы содержат только контейнер, а не саму подпись.
Комментарии:
1. Пожалуйста, поделитесь примером PDF-файла (до и после подписания), который иллюстрирует проблему.
2. @mkl Я добавил ссылку с примерами
Ответ №1:
Проблема с вашим примером PDF-файла только с изображениями заключается в том, что вы разместили подпись вне страницы.
Подробнее: в этом PDF-файле есть одна страница с этим полем обрезки:
/CropBox [ 0.0 0.0 841.5 594.75 ]
Т.е. его нижний левый угол — это начало координат системы координат (0, 0), а его верхний правый угол — (841.5, 594.75).
Однако ваша подпись на этой странице находится по адресу
/Rect[10 810 130 840]
Т.е. между (10, 810) и (130, 840). Эти координаты явно находятся над рамкой обрезки.
Если вы настроите Adobe Reader на непрерывное отображение страниц и немного уменьшите масштаб, вы действительно сможете увидеть аннотацию:
Поэтому, чтобы исправить это, просто используйте координаты new Rectangle(c[0], c[1], c[2], c[3])
для вашего виджета подписи, которые отображаются на экране.