Я использовал PdfWriter
для объединения PDF-файлов и обнаружил проблему с acroform в моем PDF-файле, они были пусты. Я исправил это с заменой PdfWriter
на PdfCopy
, но затем мое дальнейшее редактирование моего файла было прервано (PdfCopy
не добавляет страницы к Document
), и теперь я застрял с PDF-файлом, содержащим несколько страниц (с заполненной акроформой), но я не могу написать свой PdfPTable
с PdfAction.gotoLocalPage
на нем. Эти примеры работают с itext 2.1.7, и 2 файла PDF, один с формой, можно найти здесь http://foersom.com/net/HowTo/data/OoPdfFormExample.pdf
private byte[] mergePdfsOld(List<byte[]> pdfBytesList) {
Document document = new Document();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
writer.setLinearPageMode();
document.open();
contenByte = writer.getDirectContent();
for (byte[] pdfByteArray : pdfBytesList) {
ByteArrayInputStream readerStream = new ByteArrayInputStream(pdfByteArray);
PdfReader reader = new PdfReader(readerStream);
for (int i = 0; i < reader.getNumberOfPages();) {
document.newPage();
page = writer.getImportedPage(reader, ++i);
contenByte.addTemplate(page, 0, 0);
}
writer.freeReader(reader);
reader.close();
}
document.newPage();
writer.setPageEmpty(false);
document.close();
} catch (DocumentException | IOException ex) {
ex.printStackTrace();
}
return outputStream.toByteArray();
}
private byte[] mergePdfsNew(List<byte[]> pdfBytesList) {
Document document = new Document();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
PdfCopy copy = new PdfCopy(document, outputStream);
document.open();
for (byte[] pdfByteArray : pdfBytesList) {
ByteArrayInputStream readerStream = new ByteArrayInputStream(pdfByteArray);
PdfReader reader = new PdfReader(readerStream);
for (int i = 0; i < reader.getNumberOfPages();) {
copy.addPage(copy.getImportedPage(reader, ++i));
}
copy.freeReader(reader);
reader.close();
}
copy.addPage(PageSize.A4, 0);
document.close();
} catch (DocumentException | IOException ex) {
ex.printStackTrace();
}
return outputStream.toByteArray();
}
public static void main(String[] args) throws Exception {
ItextTest test = new ItextTest();
List<byte[]> pdfBytesList = new ArrayList<>();
pdfBytesList.add(Files.readAllBytes(Paths.get("test.pdf")));
pdfBytesList.add(Files.readAllBytes(Paths.get("OoPdfFormExample.pdf")));
Files.write(Paths.get("mergedNew.pdf"), test.mergePdfsNew(pdfBytesList));
Files.write(Paths.get("mergedOld.pdf"), test.mergePdfsOld(pdfBytesList));
}