我有一个问题,需要你的帮助 . 我正在运行itext 7.0.2 . java和我正在尝试将类型为PdfDocument的列表ArrayList合并为一个单独的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: Cannot copy indirect object from the document that is being written.

然后我尝试了以下内容:

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: Page com.itextpdf.kernel.pdf.PdfPage@1d85315f cannot be added to document com.itextpdf.kernel.pdf.PdfDocument@32ae81bb, because it belongs to document com.itextpdf.kernel.pdf.PdfDocument@4b8d06af.

我需要做什么,将这个PdfDocuments(每个只有一页)合并到一个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);
       }

然后我想在我的ArrayList中合并这个PdfDocuments,如下所示:

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并尝试了合并扁平化表格的Bruno示例,但结果始终是带有空表单的pdf .

任何人都可以帮助将我的ArrayList中的pdf格式(所有相同的形式)转换为单个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是表单,我必须在合并时重置值吗?