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 及其输出。
我是 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 及其输出。