iText 7: установить текстовое поле один раз, даже если оно существует несколько раз с тем же именем - PullRequest
0 голосов
/ 09 января 2019

У меня есть документ PDF с несколькими текстовыми полями с одинаковым именем.

Я хотел бы установить значение один раз (field.setValue("text")) и значение, которое будет отображаться для каждого вхождения поля. Поля могут находиться на одной странице или на разных страницах (и, очевидно, в одном и том же документе).

Когда есть только одно такое поле, генерация PDF в порядке. Если их больше одного, все поля отображаются пустыми. Если я отключу выравнивание, я смогу увидеть текст в каждом поле (хотя только после нажатия на поле - странно ...).

Вот тест PDF .


EDIT

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

PdfFont font = PdfFontFactory.createFont("src/main/resources/fonts/Arimo-Regular.ttf", PdfEncodings.IDENTITY_H);
PdfFormField textField = acroForm.getField("test");
textField.setValue("שלום", font, 11.0f);

1 Ответ

0 голосов
/ 10 января 2019

обновленный вопрос

Используя шрифт, предоставленный OP, и перегрузку setValue с дополнительными параметрами шрифта и размера шрифта, я мог бы воспроизвести проблему.

Актуальный выпуск

Проблема не связана с конкретным шрифтом или текстом, который вы использовали, она связана с используемой вами перегрузкой setValue:

  • PdfFormField.setValue(String) (если поле не является полем кнопки) перебирает всю иерархию потомков текущего поля и вызывает еще одну перегрузку setValue для каждого потомка и, в конечном итоге, также текущее поле.
  • С другой стороны, PdfFormField.setValue(String, boolean) и PdfFormField.setValue(String, PdfFont, float) предполагают, что текущее поле фактически является единственным виджетом, к которому добавляется внешний вид.

Таким образом, любое поле формы с несколькими виджетами (или даже поле с одним виджетом, которое просто не объединено с полем) не будет получать надлежащий вид для своих виджетов, если просто перегрузка setValue последнего вида призвал к этому.

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

Учитывая вышесказанное, обходной путь должен заключаться в том, чтобы как-то работать с перегрузкой одного параметра setValue. Это можно сделать, явно установив шрифт и размер шрифта в поле формы, просто заменив

textField.setValue("שלום", font, 11.0f);

от

textField.setFont(font);
textField.setFontSize(11f);
textField.setValue("שלום");

( SetTextField test testSetFontAndTextToFieldWithManyVisualizationsWorkAround)

Теперь поля действительно заполнены, и их содержимое присутствует в сглаженном результате.

К сожалению, здесь появляется еще одна проблема: буквы появляются в неправильном порядке. Языки RTL здесь не поддерживаются с использованием только основных компонентов iText. Возможно использование дополнительного модуля pdfCalligraph добавляет поддержку иврита и т. Д., Но я не знаю.

Оригинальный ответ на оригинальный вопрос

Я не могу воспроизвести проблему с вашим примером документа.

Я изменяю значение поля следующим образом

PdfReader reader = new PdfReader(resource);
PdfDocument pdfDocument = new PdfDocument(reader, new PdfWriter(outputStream));
PdfAcroForm acroForm = PdfAcroForm.getAcroForm(pdfDocument, false);

PdfFormField testField = acroForm.getField("test");
testField.setValue("My test text...");

acroForm.flattenFields();

pdfDocument.close();

( SetTextField test testSetTextToFieldWithManyVisualizations)

но результат ожидаемый:

page 1 page 2

Заполнены все три экземпляра поля. Это работает как с выравниванием, так и без него, и с 7.1.4 и с текущим 7.1.5-SNAPSHOT.

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

enter image description here

Значение V устанавливается как в абстрактном поле, так и в каждом виджете. Это должно быть только в поле.

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