Как редактировать PDF с акрополями (добавить PdfPTable) с IText 2.1.7 PdfCopy - PullRequest
0 голосов
/ 08 апреля 2020

Я использовал 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...