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

时间:2015-08-04 18:31:46

标签: java itextpdf

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

报告将包含文本块(String)和图像。图像前面总是包含一个文本块。

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

考虑测试中出现顺序如下的情况

Text Block1

Image1

Text Block2

Text Block3

Image2

' Text Block4'

但PDF显示为

Text Block1

Image1

Text Block2

Text Block3

Text Block4

Image2

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

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

  3. 我想知道我们是否可以创建PDF页面,然后在遇到要插入的图像很大时动态更改其大小。

1 个答案:

答案 0 :(得分:3)

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

writer.setStrictImageSequence(true);

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

这解决了一个问题:文本和图像的顺序现在是正确的。但是,由于图像尺寸的原因,文档中会有足够的空白区域,因为不适合的图像会触发新页面。

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

如果您想将页面尺寸与图片尺寸相匹配,请查看我对此问题的回答:Add multiple images into a single pdf file with iText using java

Image类扩展Rectangle,我们可以在创建Image实例时使用Document对象作为参数,或者我们可以使用Image我们改变页面大小时的对象:

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

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

另外:您还不足以将页面大小更改为图像大小,因为您还要添加文本。您可以在模拟模式下使用ColumnText来查找文本所需的空间,然后再次使用ColumnText在创建尺寸为的页面后添加真实文本适应文字和图像。

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

我想知道你是否缩小图像以使它们适合页面是不容易的......当然:如果图像的大小可能不同,你会有大图像的风险变得难以辨认。

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