itext 7 (java) 在新页面上将图像添加到现有 pdf 文档的末尾

itext 7 (java) add image on a new page to the end of an existing pdf document

我是 itext 7 的新手。我有一个包含不同内容的文档列表,我想将它们合并到一个 PDF 中。内容类型为 PDF、JPG 和 PNG。 我的问题是,一旦我合并 PDF 和图像,图像就会覆盖目标 PDF 的已插入内容。 如何将每个图像添加到目标 PDF 的新页面?

这是我的代码:

    byte[] mergeInhalt(List<Dokument> dokumentList) throws IOException {
      ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
      PdfWriter pdfWriter = new PdfWriter(byteOut);
      PdfDocument pdfDocument = new PdfDocument(pdfWriter);
      Document completeDocument = new Document(pdfDocument);

      for (Dokument dokument : dokumentList) {
        byte[] inhalt = dokument.getInhalt();
        if (Objects.nonNull(inhalt)) {
            switch (dokument.getFormat().name()) {
                case "PDF":
                    addPdf(pdfDocument, inhalt);
                    break;
                case "JPG":
                case "PNG":
                    ImageData data = ImageDataFactory.create(inhalt);
                    Image image = new Image(data);
                    completeDocument.add(image);
                    break;
            }
        }
    }
    completeDocument.close();
    return byteOut.toByteArray();
}

private void addPdf(PdfDocument pdfDocument, byte[] inhalt) throws IOException {
    PdfReader pdfReader = new PdfReader(new ByteArrayInputStream(inhalt));
    PdfDocument pdfDocumentToMerge = new PdfDocument(pdfReader);
    pdfDocumentToMerge.copyPagesTo(1, pdfDocumentToMerge.getNumberOfPages(), pdfDocument);
}

合并 PDF 效果很好,但每次合并图像时我都会得到这个:

粉红色的图像被放置在上一个 PDF 的文本上

在您的代码中,您通过 Document completeDocument 添加图像,但通过基础 PdfDocument pdfDocument 添加 pdf。因此,completeDocument 不知道添加的 pdf,继续其当前页面,并覆盖导入的页面。

为了确保每张图片都添加到当前最后一张图片之后的新页面上,您必须告诉 completeDocument 移动其当前页面:

case "JPG":
case "PNG":
    ImageData data = ImageDataFactory.create(inhalt);
    Image image = new Image(data);
    completeDocument.add(new AreaBreak(AreaBreakType.LAST_PAGE));
    completeDocument.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
    completeDocument.add(image);
    break;

例如,比较测试 testMergeLikeAndreasHuber and testMergeLikeAndreasHuberImproved in CopyPdfsAndImages 及其输出。