itext7 PdfButtonFormField setImage метод не работает на подписанном PDF - PullRequest
0 голосов
/ 31 октября 2018

Я использую Java-библиотеку itext7, как показано ниже, чтобы добавить PdfButtonFormField в существующий файл PDF:

String src = "sample.pdf";
String dest = "acro_sample_empty_fields.pdf";


PdfDocument pdf = new PdfDocument(new PdfReader(src), new     PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfButtonFormField button = PdfFormField.createPushButton(pdf, new Rectangle(Integer.parseInt(control.xCord), Integer.parseInt(control.yCord),Integer.parseInt(control.width), Integer.parseInt(control.height)), control.name, control.value);

form.addField(button, page);

String resource = "sample.png";
button.setImage(resource);

После этого я использую следующий код, чтобы заполнить форму, как показано ниже:

String src = "1540982441_313554925_acro_sample_empty_fields_signedFinal.pdf";
String dest = "acro_sample_filled_fields.pdf";

PdfReader reader = new PdfReader(src);
File output = new File(dest);

OutputStream outputStream = new FileOutputStream(output);
PdfDocument document = new PdfDocument(reader,
                    new PdfWriter(outputStream),
                    new StampingProperties().useAppendMode());
PdfAcroForm form = PdfAcroForm.getAcroForm(document, true);
Map<String, PdfFormField> fields = form.getFormFields();

String resource = "sample_test.png";
((PdfButtonFormField)fields.get(control.name)).setImage(resource);

Все нормально работает для нормального PDF. Но если я цифровой подписью созданного PDF, а затем попытаться заполнить его. тогда изображение не установлено должным образом. Для нормального PDF изображение на кнопке изменяется, как и ожидалось. Но на pdf с цифровой подписью изображение не установлено.

Я пытался найти это в Google, но пока не повезло. Любая помощь будет оценена. Заранее спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Я проверил код в этом ответе с подписанным, но незаполненным PDF, которым вы поделились . Поскольку вы не предоставили образец изображения, я использовал одно из своих.

Более точное наблюдение

Вы говорите

Все нормально работает для обычного pdf. Но если я цифровой подписью созданного PDF, а затем попытаться заполнить его. тогда изображение не установлено должным образом. Для нормального PDF изображение на кнопке изменяется, как и ожидалось. Но на pdf с цифровой подписью изображение не установлено.

Это не совсем так, изображение установлено , но не все программы просмотра PDF показывают it.

Подробно: если вы устанавливаете изображение в подписанном PDF-файле с помощью своего кода, Adobe Reader действительно отображает просто серое поле

Adobe Reader Screen shot

но другие программы просмотра PDF, например Встроенный просмотрщик Foxit или Chrome, показывает заменяющее изображение

Foxit screen shot

Таким образом, изображение также устанавливается для PDF с цифровой подписью. Фактическая проблема заключается в том, что Adobe Reader не отображает его!

причина

После некоторого анализа и следования за некоторыми красными сельдями причина проблемы заключается в том, что если Adobe Reader отображает PDF-файл с измененным внешним видом кнопки AcroForm и

  • PDF не подписан, тогда Adobe Reader просто использует обновленный поток оформления; но если
  • PDF подписывается, затем Adobe Reader пытается игнорировать обновленный поток внешнего вида и создать новый внешний вид на основе информации о характеристиках внешнего вида.

(Однако другие программы просмотра PDF, похоже, всегда используют обновленный поток оформления.)

iText действительно создает словарь характеристик внешнего вида для кнопки (поэтому Adobe Reader предполагает, что он может игнорировать обновленный внешний вид и может создать новый на основе этого словаря), но, к сожалению, не добавляет к ней некоторую информацию, специфичную для кнопки, ни при создании кнопка, ни при смене кнопки. В частности, это касается следующих двух записей:

I поток (Необязательно; только поля кнопок; должна быть косвенной ссылкой) Форма XObject, определяющая обычный значок аннотации виджета, который отображается, когда он не взаимодействует с пользователем.

TP целое число (Необязательно; только для полей с кнопками) Код, указывающий, где расположить текст заголовка аннотации виджета относительно его значка:

0 Нет значка; только подпись

1 Без заголовка; только значок

2 Подпись под значком

3 Надпись над значком

4 Надпись справа от значка

5 Подпись слева от значка

6 Надпись накладывается прямо на иконку

Значение по умолчанию: 0 .

(ISO 32000-2, Таблица 192 - Записи в словаре характеристик внешнего вида)

Поскольку iText не предоставляет значение TP , включается значение по умолчанию , и Adobe Reader создает вид кнопки с надписью «Нет значка; только заголовок». Поскольку заголовок не определен, результатом будет серое поле.

Обходной путь

Самый простой способ - удалить словарь характеристик внешнего вида во время обновления изображения, т. Е. Заменить

((PdfButtonFormField)fields.get(control.name)).setImage(resource);

от

PdfButtonFormField button = (PdfButtonFormField)fields.get(control.name);
button.setImage(resource);
if (button.getPdfObject().containsKey(PdfName.MK)) {
    button.setModified();
    button.getPdfObject().remove(PdfName.MK);
}

( SetButtonImage вспомогательный метод setLikeGautamAnandImproved)

Теперь Adobe Reader не находит никаких характеристик внешнего вида и, следовательно, не может игнорировать обновленный поток внешнего вида.

Исправление

В качестве альтернативы мы можем добавить отсутствующие записи характеристик внешнего вида, например, как это:

PdfButtonFormField button = (PdfButtonFormField)fields.get(control.name);
button.setImage(resource);
PdfWidgetAnnotation widget = button.getWidgets().get(0);
PdfDictionary characteristics = widget.getAppearanceCharacteristics();
if (characteristics != null) {
    characteristics.setModified();
    characteristics.put(PdfName.I, widget.getNormalAppearanceObject());
    characteristics.put(PdfName.TP, new PdfNumber(1));
}

( SetButtonImage вспомогательный метод setLikeGautamAnandImproved2)

Результат выглядит немного иначе, хотя:

Adobe Reader Screen shot

Как видите, вокруг изображения есть небольшая рамка. Скорее всего, вы можете заставить его исчезнуть, задав соответствующие характеристики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...