Подходящие классы для использования
Прежде всего, вы говорите, что "хотите добавить несколько текстовых полей на нескольких страницах PDF" .При реализации подобных задач, то есть задач, которые берут один документ и хотят каким-то образом манипулировать им, сохраняя его более или менее структурно, как раньше, обычно следует работать с парой PdfReader
/ PdfStamper
.Это позволяет вам сконцентрироваться на манипуляции и предоставляет копию исходного PDF со всеми его свойствами для работы.
Добавление нескольких полей на страницу существующего PDF
Добавление нескольких полей водна существующая страница тривиальна, например:
PdfReader pdfReader = new PdfReader(resource);
PdfStamper pdfStamper = new PdfStamper(pdfReader, output);
TextField field1 = new TextField(pdfStamper.getWriter(),
new Rectangle(100, 800, 200, 820), "Field1");
field1.setBorderColor(BaseColor.CYAN);
field1.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);
field1.setBorderWidth(BaseField.BORDER_WIDTH_MEDIUM);
field1.setText("Field 1");
pdfStamper.addAnnotation(field1.getTextField(), 1);
TextField field2 = new TextField(pdfStamper.getWriter(),
new Rectangle(300, 800, 400, 820), "Field2");
field2.setBorderColor(BaseColor.RED);
field2.setBorderStyle(PdfBorderDictionary.STYLE_INSET);
field2.setBorderWidth(BaseField.BORDER_WIDTH_THIN);
field2.setText("Field 2");
pdfStamper.addAnnotation(field2.getTextField(), 1);
pdfStamper.close();
( AddField test testAddMultipleFields
)
Применимо к моему примеру документа
код генерирует
Таким образом, нет концептуальной проблемыдобавление нескольких текстовых полей на одну и ту же страницу документа, это работает очень естественным образом.
В вашем случае я бы переключился на использование пары PdfReader
/ PdfStamper
.Если какая-то проблема все еще остается, я проверю ваши данные.Возможно, они просто содержат только один набор данных поля на страницу.Или два текстовых поля имеют одинаковые координаты и, следовательно, выглядят как одно.Или некоторые текстовые поля имеют внеэкранные координаты.Или ... Или ... Или ...
Оригинальный ответ
Изначально код в вопросе выглядел иначе.Этот оригинальный ответ сфокусирован на проблемах этого кода.
Вы утверждаете, что ваш код
может добавлять только одно текстовое поле в каждое ожидаемое, но не добавлять 2 или несколько текстовых полейна одной странице
Я сомневаюсь, что, поскольку
у вас есть два разных объекта, одновременно записывающих в один файл "D:/TemplateFilePDf/" + attachment.getOriginalFilename()
, PdfWriter writer
иPdfStamper stamper
.Если вы получаете что-то разумное в результате вашего кода, то только по счастливой случайности;и
дополнительно stamper
создается для null
экземпляра PdfReader
.Это на самом деле вызовет NullPointerException
в конструкторе, который будет препятствовать тому, чтобы ваше текстовое поле добавляло код от выполнения вообще.
Таким образом, либо код, которым вы поделились, значительно отличается от кода, который вывыполнить или ваш тестовый запуск фактически все выдает это NullPointerException
, и вы, вероятно, найдете результаты предыдущей, менее испорченной версии вашего кода, которая, как оказалось, добавила только одно текстовое поле.
После исправления этих двух проблемнекоторые вопросы все еще остаются (например, какова цель этого cb.fill()
? Эта инструкция разрешена только после определения пути, пути, внутренняя область которого должна быть заполнена, но я не вижу, чтобы вы определяли какой-либо путь).
Кроме того, вы получаете доступ к вашему editPdfDTOList
для множества соответствующих значений, но мы не знаем эти значения.Таким образом, мы не можем запустить ваш код, чтобы попытаться воспроизвести проблему.Возможно, вы создаете только одно текстовое поле, потому что этот объект содержит только значения для одного текстового поля ...