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
我的代码没有错。我已经三重检查了它。
不,我不能 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。我在本书中捆绑了数百个答案,以便在回答新问题时可以轻松搜索已回答的问题。
我正在使用 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
我的代码没有错。我已经三重检查了它。
不,我不能 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。我在本书中捆绑了数百个答案,以便在回答新问题时可以轻松搜索已回答的问题。