我搜索了多个类似的帖子并尝试了各种配置来实现这一点,但无法让它与最新的 iText 7 库一起使用。
已经回答了多个这样的问题,但这些要求与我的不完全一样,因此请在将其标记为重复之前阅读所有要求。
我的要求是生成一个包含多个图像的 PDF 文档,每个图像位于单个页面的左上角(默认页边距为 36 个单位)。例如如果有 5 张图片,生成的 pdf 将有 5 页(A4 大小),每页在页面顶部包含一张图片。
我从以下链接提供的 iText 7 示例开始生成多个页面。
https://itextpdf.com/en/resources/examples/itext-7/multiple-images
我做的一些改变是
设置自动缩放为真
Image image = new Image(imageData).setAutoScale(true);
添加具有默认大小的新页面。
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());
为了能够缩放图像以适合页面并将它们放置在页面上的所需位置,您需要
首先使用
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
注意事项:
- 在附加的 PDF 屏幕截图中,灰色只是 PDF 查看器的背景。
- 图像文件为 test1.jpg 和 test2.jpg 以简化此代码示例。
关于itext7 - itext 7 在单独页面的顶部添加多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54993003/