itext 7 在单独页面的顶部添加多个图像
itext 7 add multiple images at top of separate pages
我搜索了多个类似的帖子并尝试了各种配置来实现此目的,但无法使其与最新的 iText 7 库一起使用。
已经回答了多个这样的问题,但这些要求与我的要求不完全相同,因此请阅读所有要求,然后再将其标记为重复。
我的要求是生成一个包含多个图像的 PDF 文档,每个图像都位于单个页面的左上角(默认页边距为 36 个单位)。例如如果有 5 张图片,生成的 pdf 将有 5 页(A4 大小),每页在页面顶部包含一张图片。
我从以下 link 中提供的 iText 7 示例开始生成多个页面。
https://itextpdf.com/en/resources/examples/itext-7/multiple-images
我所做的一些更改是
设置自动缩放为真
Image image = new Image(imageData).setAutoScale(true);
添加默认大小的新页面。
pdfDocument.addNewPage(i+1);
但在上面给出的示例中 link 在每个页面的左下角添加图像。因此,我首先尝试计算底部位置,但使用 getImageScaledHeight()
减去图像的高度。此方法 returns 图像的高度(以像素为单位,而不是以用户单位为单位),因此它仍然在顶部留有一些边距。
我通过设置 pageNumber(i+1)
和 setMarginTop(0)
尝试了另一种方法。但是看起来当你设置页边距时,页码没有任何效果,所有图像都被一个接一个地添加到第一页。
如果有人能提供实现此目的的最佳方法或解决方法,我将不胜感激。
PDF #1-Without auto scale flag #2 Auto scale set true on image
让我们对 MultipleImages
示例进行更多更改:
1)(次要)无需创建具有自定义页面大小的 Document
,这就足够了:Document doc = new Document(pdfDoc);
2) 我们修改setFixedPosition
方法的底部参数,从默认页面高度中提取图片的高度:image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());
生成的 pdf 符合预期:
通过缩放在每个页面顶部将多个图像添加到 PDF 的解决方案。
我找到了解决这个问题的方法。我希望其他可能 运行 遇到类似问题的人能够从我的解决方案中受益,因此我将其作为答案发布而不是评论我的问题。
所以事实证明,如果使用 setAutoScale(true)
打开自动缩放,getImageScaledHeight()
方法将不起作用。自动缩放会发生,但直到图像被添加到文档之后才会发生,但是要将图像的位置设置在页面顶部,我们需要在调用以下方法时图像的缩放高度
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());
为了能够缩放图像以适合页面并将它们放置在页面上的所需位置,您需要
首先使用方法image.scaleToFit(fitWidth, fitHeight)
缩放图像,然后使用缩放
计算底部位置
使用缩放图像高度(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
备注:
- 在附加的 PDF 屏幕截图中,灰色只是 PDF 查看器的背景。
- 图像文件为 test1.jpg 和 test2.jpg 以使此代码示例简单。
我搜索了多个类似的帖子并尝试了各种配置来实现此目的,但无法使其与最新的 iText 7 库一起使用。
已经回答了多个这样的问题,但这些要求与我的要求不完全相同,因此请阅读所有要求,然后再将其标记为重复。
我的要求是生成一个包含多个图像的 PDF 文档,每个图像都位于单个页面的左上角(默认页边距为 36 个单位)。例如如果有 5 张图片,生成的 pdf 将有 5 页(A4 大小),每页在页面顶部包含一张图片。
我从以下 link 中提供的 iText 7 示例开始生成多个页面。
https://itextpdf.com/en/resources/examples/itext-7/multiple-images
我所做的一些更改是
设置自动缩放为真
Image image = new Image(imageData).setAutoScale(true);
添加默认大小的新页面。
pdfDocument.addNewPage(i+1);
但在上面给出的示例中 link 在每个页面的左下角添加图像。因此,我首先尝试计算底部位置,但使用 getImageScaledHeight()
减去图像的高度。此方法 returns 图像的高度(以像素为单位,而不是以用户单位为单位),因此它仍然在顶部留有一些边距。
我通过设置 pageNumber(i+1)
和 setMarginTop(0)
尝试了另一种方法。但是看起来当你设置页边距时,页码没有任何效果,所有图像都被一个接一个地添加到第一页。
如果有人能提供实现此目的的最佳方法或解决方法,我将不胜感激。
PDF #1-Without auto scale flag #2 Auto scale set true on image
让我们对 MultipleImages
示例进行更多更改:
1)(次要)无需创建具有自定义页面大小的 Document
,这就足够了:Document doc = new Document(pdfDoc);
2) 我们修改setFixedPosition
方法的底部参数,从默认页面高度中提取图片的高度:image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());
生成的 pdf 符合预期:
通过缩放在每个页面顶部将多个图像添加到 PDF 的解决方案。
我找到了解决这个问题的方法。我希望其他可能 运行 遇到类似问题的人能够从我的解决方案中受益,因此我将其作为答案发布而不是评论我的问题。
所以事实证明,如果使用 setAutoScale(true)
打开自动缩放,getImageScaledHeight()
方法将不起作用。自动缩放会发生,但直到图像被添加到文档之后才会发生,但是要将图像的位置设置在页面顶部,我们需要在调用以下方法时图像的缩放高度
image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());
为了能够缩放图像以适合页面并将它们放置在页面上的所需位置,您需要
首先使用方法
计算底部位置image.scaleToFit(fitWidth, fitHeight)
缩放图像,然后使用缩放使用缩放图像高度(
计算底部位置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
备注:
- 在附加的 PDF 屏幕截图中,灰色只是 PDF 查看器的背景。
- 图像文件为 test1.jpg 和 test2.jpg 以使此代码示例简单。