Мне понадобилось время, чтобы понять это.Это не самый эффективный способ кодирования, но, по сути, это то, что он делает:
- создать документ
- для каждой страницы с акрополем:
- скопируйте ваш шаблон
- заполните форму
- выровняйте форму
- добавьте страницу
Вот моя реализация, которую вы можете попробовать и изменить, чтобы соответствоватьВаши потребности:
private void createPdf() throws Exception {
Document doc = new Document();
PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
doc.open();
PdfReader reader;
PdfStamper stamper;
AcroFields form;
ByteArrayOutputStream baos;
for(int i = 0; i < getTotalPages(); i++) {
copyPdf(i);
reader = new PdfReader(String.format("%d%s", i, "template.pdf"));
baos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, baos);
form = stamper.getAcroFields();
//methods to fill forms
stamper.setFormFlattening(true);
stamper.close();
reader = new PdfReader(baos.toByteArray());
copy.addPage(copy.getImportedPage(reader, 1));
}
doc.close();
}
private void copyPdf(int currentPage) throws Exception {
PdfReader reader = new PdfReader("timesheet.pdf");
Document doc = new Document();
File file = new File(String.format("%d%s", currentPage, "template.pdf"));
file.deleteOnExit();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file));
stamper.close();
}
Метод copyPdf()
создает временные файлы, которые позволяют заполнять формы, не затрагивая весь документ.Если вы найдете более эффективный способ сделать это, дайте мне знать.
Кроме того, я обнаружил, что на Mac на базе Intel против Windows Computer, Mac выполняет это намного быстрее.
Если вы не против получить справочник по iText, я бы порекомендовал «iText in Action, Second Edition» Бруно Лоуаги.Это отличная книга и очень полезная.