iTextPDF : 根据要插入的图片大小设置PDF的页面大小

iTextPDF : Set page size of PDF according to the size of the image to be inserted

我正在使用 iTextPDF 为在 TestNG 中开发的 Selenium WebDriver 脚本生成 PDF 报告。

报告将包含文本块(字符串)和图像。图像之前总是包含一个文本块。

我面临的问题是,在创建文档时,文本块和图像块在测试用例中的显示顺序错误。我认为这是因为要插入的图像尺寸大于 PDF 页面。

考虑一个场景,测试中出现的顺序如下

Text Block1

Image1

Text Block2

Text Block3

Image2

'Text Block4'

但是PDF显示为

Text Block1

Image1

Text Block2

Text Block3

Text Block4

Image2

  1. 我的代码没有错。我已经三重检查了它。

  2. 不,我不能 post 代码,因为它很大(>500 行)并且在我公司的系统中。

我想知道是否可以创建一个PDF页面,然后在遇到要插入的图片很大时动态改变它的大小。

你的代码没有错。当图像不适合并且图像后面有文本时,将推迟添加图像。您可以使用以下行更改此行为:

writer.setStrictImageSequence(true);

在这种情况下 writer 是您的 PdfWriter 实例。

这解决了一个问题:文本和图像的顺序现在是正确的。但是,由于图像大小,您最终会在文档中出现大量白色 space,因为不适合的图像会触发新页面。

您可以尝试通过更改页面大小来解决此问题。这涉及使用 setPageSize() 方法,如我对这个问题的回答所述:iText create document with unequal page sizes

如果您想将页面大小与图像大小相匹配,请查看我对这个问题的回答:

Image class 扩展了 Rectangle 并且我们可以在创建 Document 实例时使用 Image 对象作为参数,或者我们可以当我们更改页面大小时使用 Image 对象:

document.setPageSize(img);
document.newPage();

重要提示:当您更改页面大小时,新的大小只会在下一页生效。您不能更改当前页面的大小(它已经被初始化,初始化后更改它可能会搞砸已经添加的内容)。

另外:将页面大小更改为图像大小是不够的,因为您还要添加文本。您可以在模拟模式下使用 ColumnText 来找出文本需要多少 space,然后在创建页面后再次使用 ColumnText 真正添加文本具有适合文本和图像的大小。

参见 Can I tell iText how to clip text to fit in a cell 并寻找 getYLine() 方法。

我想知道您是否可以更轻松地缩小图像以使其适合页面...当然:如果图像的大小可以变化,您将面临很大的风险图片会变得难以辨认。

P.S。我提到的所有答案也可以在免费电子书中找到 The Best iText Questions on Whosebug。我在本书中捆绑了数百个答案,以便在回答新问题时可以轻松搜索已回答的问题。