我正在使用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
我的代码没错。我已经三次检查了它。
不,我无法发布代码,因为它很大(> 500行)并且在我的公司系统中。
我想知道我们是否可以创建PDF页面,然后在遇到要插入的图像很大时动态更改其大小。
答案 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中找到。我在本书中捆绑了数百个答案,以便在回答新问题时能够轻松搜索已回答的问题。