itext 7, как объединить PDF-файлы? - PullRequest
0 голосов
/ 11 мая 2018

У меня проблема, и мне нужна ваша помощь. Я использую itext 7.0.2. Я и я пытаюсь объединить список ArrayList типа PdfDocument в один PDF.

Я попробовал следующее:

        ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
        PdfWriter writerGes = new PdfWriter(bosGes);
        PdfDocument docGes = new PdfDocument(writerGes);
        ArrayList<PdfDocument> pdfs = AListOfSomePreviousCreatedPdfDocuments;

        for (int i=0; i < pdfs.size(); i++) {
            PdfDocument d = pdfs.get(i);
            PdfPage p = d.getFirstPage().copyTo(docGes);
            docGes.addPage(p);
            d.close();
        }

В результате этой ошибки:

com.itextpdf.kernel.PdfException: Невозможно скопировать косвенный объект из записываемого документа.

Тогда я попробовал следующее:

        ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
        PdfWriter writerGes = new PdfWriter(bosGes);
        PdfDocument docGes = new PdfDocument(writerGes);

        for (int i=0; i < pdfs.size(); i++) {
            PdfDocument d = pdfs.get(i);
            docGes.addPage(d.getFirstPage());
            d.close();
        }

com.itextpdf.kernel.PdfException: Страница com.itextpdf.kernel.pdf.PdfPage@1d85315f не может быть добавлена ​​в документ com.itextpdf.kernel.pdf.PdfDocument@32ae81bb, поскольку она принадлежит документу com. itextpdf.kernel.pdf.PdfDocument@4b8d06af.

Что мне нужно сделать, чтобы объединить этот документ PDF (у каждого по одной странице) в один файл PDF?


ОК, я схожу с ума. Объясняя это с самого начала.

Я создаю pdf-формы, подобные этой

        ArrayList<PdfDocument> pdfs = new ArrayList<PdfDocument>();
        while (rs.next()) {
            URL fullPath = context.getResource("/formulare/kontrollbogen.pdf");
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            PdfWriter writer = new PdfWriter(bos);
            PdfReader reader = new PdfReader(fullPath.getFile());
            PdfDocument doc = new PdfDocument(reader, writer);
            PdfAcroForm form = PdfAcroForm.getAcroForm(doc, true);

            String firma = rs.getString("firma");
            if (firma != null && !firma.equals("")) {
                form.getField("firma").setValue(firma);
            }
                .
                .
                .
            pdfs.add(doc);
       }

Затем я хочу объединить эти PDF-документы в моем ArrayList следующим образом:

        ByteArrayOutputStream bosGes = new ByteArrayOutputStream();
        PdfWriter writerGes = new PdfWriter(bosGes);
        PdfDocument resultDoc = new PdfDocument(writerGes);

        for (int i=0; i < pdfs.size(); i++) {
            PdfReader r = pdfs.get(i).getReader();
            PdfDocument sourceDoc1 = new PdfDocument(r);
            int n1 = sourceDoc1.getNumberOfPages();             

            for (int j = 1; j <= n1; j++) {
                PdfPage page = sourceDoc1.getPage(j).copyTo(resultDoc);
                resultDoc.addPage(page);
            }
            sourceDoc1.close();
        }

        resultDoc.close();

не работает. Результатом является PDF с большим количеством страниц, но формы не заполнены.

Итак, я попробовал RTFM и попробовал пример Бруно со слиянием сплющенных форм, но результатом всегда является pdf с пустыми формами.

Может ли кто-нибудь помочь преобразовать pdf-формы (все те же формы) в моем ArrayList в один PDF-файл?


Я попробовал совет Бруно, но он не работает. Что я сделал:

        //Initialize PDF document with output intent
        PdfDocument pdf = new PdfDocument(writerGes);
        PdfMerger merger = new PdfMerger(pdf);
        //Add pages from the first document
        PdfDocument firstSourcePdf = pdfs.get(0);
        merger.merge(firstSourcePdf, 1, firstSourcePdf.getNumberOfPages());
        //Add pages from the second pdf document
        PdfDocument secondSourcePdf = pdfs.get(1);
        merger.merge(secondSourcePdf, 1, secondSourcePdf.getNumberOfPages());
        firstSourcePdf.close();
        secondSourcePdf.close();
        pdf.close();

но это снова заканчивается этой ошибкой:

com.itextpdf.kernel.PdfException: невозможно скопировать косвенный объект из документа, который пишется.

Возможно, это из-за того, что мои pdf являются формами, и мне нужно сбросить значения при слиянии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...