itext5 подписывает PDF, содержащий только изображение

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]) для вашего виджета подписи, которые отображаются на экране.