【问题标题】:itext 7 (java) add image on a new page to the end of an existing pdf documentitext 7(java)将新页面上的图像添加到现有pdf文档的末尾
【发布时间】:2021-09-23 09:17:48
【问题描述】:

我是 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 添加图像,但您通过底层pdfDocument 添加pdf。因此,document 不知道添加的 pdf 并对其进行绘制。
  • 是否可以将图像添加到 pdfDocument 中?我搜索了很多,但没有找到解决方案。
  • 在向document 添加任何内容之前,请尝试添加new AreaBreak(AreaBreakType.LAST_PAGE)

标签: java merge itext itext7


【解决方案1】:

在您的代码中,您通过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;

例如,比较CopyPdfsAndImages 中的测试testMergeLikeAndreasHubertestMergeLikeAndreasHuberImproved 及其输出。

【讨论】:

  • 非常感谢!这对我有帮助:-)
猜你喜欢
  • 2014-06-28
  • 2015-04-19
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多