2013-08-05 5 views
1

У меня есть следующий фрагмент кода, который откроет шаблон PDF, заполните AcroFields данными из объекта Receipt и выведите их в браузер. Он отлично работает с одним экземпляром моего квитанции, но теперь я один, чтобы повторить процесс со списком квитанций, чтобы я мог создать один файл PDF, объединяющий экземпляры pdf-штампа.Создание одного PDF-файла из нескольких шаблонов с помощью iText

Это мой код прямо сейчас:

response.setContentType("application/pdf"); 

PdfReader pdfTemplate = new PdfReader ("/receipt-template.pdf"); 
PdfStamper stamper = new PdfStamper(pdfTemplate, response.getOutputStream()); 
stamper.setFormFlattening(true); 
AcroFields form = stamper.getAcroFields(); 

// fill the fields as 
form.setField("number", recipt.getNumber().toString()); 

// ... 
stamper.close(); 
pdfTemplate.close(); 

Я хотел бы сделать что-то вроде:

pdf = new pdf 
foreach receipt in receiptsList 
    partial = fillReceiptTemplate (receipt) 
    pdf.append (partial) 
output pdf 

возможно ли это? Я читал в некоторых форумах, что я должен использовать PdfCopy или PdfSmartCopy, но я понятия не имею, как в других местах, говорит, что это не представляется возможным объединить весь документ в формате PDF, так что я должен добавить страницы вместо ..

+0

Привет. У меня есть проблема, которая, я считаю, очень похожа, подробно здесь: http://programmers.stackexchange.com/q/239095/78820. Это похоже на связанную ситуацию? Теперь у вас есть понимание, что вы были успешны? Это очень ценится. –

ответ

2

Позвольте мне подвести итоги в документации написано о вашем запросе:

  1. Если итоговый документ должен быть интерактивным, у вас есть проблема. Если вы прочитали ISO-32000-1, вы обнаружите, что документ PDF может содержать только одну форму. Одно поле может соответствовать нескольким аннотациям виджета, но оно может содержать только значение. Например: если у вас есть форма с полем имя, и вы объединяете одну и ту же форму более одного раза (используя PdfCopyFields), тогда все страницы, содержащие аннотацию виджета, соответствующую полю , имя будут отображаться с одинаковым именем. Вы не можете иметь одну страницу, где имя поле показывает Bruno и другое поле, где имя поле показывает Joaquin. Это объясняется в разделе 6.4.3 из chapter 6 моей книги, где пример ConcatenateForms1 приводит к появлению нескольких виджетов для одного и того же поля, а ConcatenateForms2 переименовывает поля перед конкатенацией форм.
  2. В вашем случае у вас нет этой проблемы. Вы сглаживаете форму, используя строку stamper.setFormFlattening(true);, вы можете объединить результаты, как показано в разделе 6.4.2, из chapter 6 моей книги, где DataSheets1 использует PdfCopy, что приводит к огромному размеру файла, а DataSheets2 использует PdfSmartCopy, приводит к получению PDF-файла с более приемлемым размером ,

Различия между «конечными результатами должны оставаться в форме» и «окончательный результат может быть сплющен», могут объяснить, почему вы получаете смешанную информацию на разных форумах.

Обратите внимание, что примеры DataSheets не сохраняют отдельные файлы на диске. Вместо этого байты хранятся в памяти с использованием ByteArrayOutputStream, из которых toByteArray() используется для создания экземпляра PdfReader.

+0

Отличный ответ, наконец, я использовал PdfSmartCopy, успешно обойдя контент читателю с помощью ByteArrayOutputStream –

Смежные вопросы