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

时间:2019-03-04 23:07:59

标签: 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

2 个答案:

答案 0 :(得分:1)

一种解决方案,可以在每页顶部按比例缩放多个图像。

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

因此,如果使用getImageScaledHeight()启用了自动缩放功能,那么setAutoScale(true)方法将不起作用。自动缩放将发生,但要等到将图像添加到文档中之后才能进行,但是要设置图像在页面顶部的位置,我们需要在调用以下方法时将图像的缩放高度设置为

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,以使此代码示例保持简单。

答案 1 :(得分:0)

让我们对MultipleImages示例进行更多更改:

1)(较小),无需创建具有自定义页面大小的Document,就足够了:Document doc = new Document(pdfDoc);

2)让我们通过从默认页面高度中提取图像的高度来修改setFixedPosition方法的bottom参数:image.setFixedPosition(i + 1, 0, PageSize.A4.getHeight()-image.getImageScaledHeight());

生成的pdf符合预期:

enter image description here

相关问题