itext7 - itext 7 在单独页面的顶部添加多个图像

标签 itext7

我搜索了多个类似的帖子并尝试了各种配置来实现这一点,但无法让它与最新的 iText 7 库一起使用。

已经回答了多个这样的问题,但这些要求与我的不完全一样,因此请在将其标记为重复之前阅读所有要求。

我的要求是生成一个包含多个图像的 PDF 文档,每个图像位于单个页面的左上角(默认页边距为 36 个单位)。例如如果有 5 张图片,生成的 pdf 将有 5 页(A4 大小),每页在页面顶部包含一张图片。

我从以下链接提供的 iText 7 示例开始生成多个页面。

https://itextpdf.com/en/resources/examples/itext-7/multiple-images

我做的一些改变是

  1. 设置自动缩放为真

    Image image = new Image(imageData).setAutoScale(true);

  2. 添加具有默认大小的新页面。

    pdfDocument.addNewPage(i+1);

但是在上面给出的示例中,链接在每个页面的左下角添加了图像。因此,我首先尝试计算底部位置,但使用 getImageScaledHeight() 减去图像的高度。此方法以像素而不是用户单位返回图像的高度,因此它仍然在顶部留有一些边距。

我通过设置 pageNumber(i+1)setMarginTop(0) 尝试了另一种方法。但是看起来当您设置页边距时,页码没有任何效果,所有图像都被一个接一个地添加到第一页。

如果有人能提供实现此目标的最佳方法或解决方法,我将不胜感激。

PDF #1-Without auto scale flag #2 Auto scale set true on image

最佳答案

在每个页面顶部通过缩放将多个图像添加到 PDF 的解决方案。

我找到了解决这个问题的方法。我希望其他可能遇到类似问题的人能从我的解决方案中受益,因此我将其作为答案发布,而不是对我的问题发表评论。

事实证明,如果使用 setAutoScale(true) 打开自动缩放,则 getImageScaledHeight() 方法不起作用。自动缩放会发生,但直到图像被添加到文档之后才会发生,但是要将图像的位置设置在页面顶部,我们需要在调用以下方法时图像的缩放高度

image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

为了能够缩放图像以适合页面并将它们放置在页面上的所需位置,您需要

  1. 首先使用 image.scaleToFit(fitWidth, fitHeight) 方法缩放图像,然后使用缩放后计算底部位置

  2. 使用缩放后的图像高度 (image.getImageScaledHeight()) 和页面高度计算底部位置。

现在,如果您想在 pdf 中留有边距,则必须更改用于缩放图像并相应地设置固定位置的代码。以下是两种场景的解决方案代码示例。

解决方案#1。在顶部的单独页面上将多个图像转换为 PDF,没有边距

image.scaleToFit(pdfA4usableWidth, pdfA4usableHeight);
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Click here to see code sample with console output

解决方案#2。多个图像在顶部的单独页面上以 PDF 格式显示

float leftMargin = document.getLeftMargin(), rightMargin = document.getRightMargin();
float topMargin = document.getTopMargin(), bottomMargin = document.getBottomMargin();
float pdfA4usableWidth = PageSize.A4.getWidth() - leftMargin - rightMargin;
float pdfA4usableHeight = PageSize.A4.getHeight() - topMargin - bottomMargin;

System.out.println("A4 usable width: "+pdfA4usableWidth+", usable height: "+pdfA4usableHeight);

image.scaleToFit(pdfA4usableWidth, pdfA4usableHeight);
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

Click here to see code sample with console output

生成的 PDF...

Image added to PDF with no margins

Image added to PDF with default margins

Measurement of margins on PDF

注意事项:

  1. 在附加的 PDF 屏幕截图中,灰色只是 PDF 查看器的背景。
  2. 图像文件为 test1.jpg 和 test2.jpg 以简化此代码示例。

关于itext7 - itext 7 在单独页面的顶部添加多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54993003/

相关文章:

c# - 将现有 PdfDocument 保存到文件

java - iText 7 : Paragraph height as it would be rendered

java - 如何合并多个pdf

java - 将背景图像设置到标题单元格

java - 如何在 iText 7 中查找文本位置和边界

java - Itext7 - 嵌套表未在单元格内对齐

java - iText 7 - 设置单元格宽度

iText7 - 如果/DA 使用十进制字体大小,PdfFormField.setValue() 会失败

itext - iText 7 页眉页脚中的 HTML 支持

java - 如何创建我自己的 PageSize 变量以使用 iTextpdf 创建 PDF 文档