在iText5中,当我们需要"public float calculateHeights(boolean firsttime)"时,我们可以获得PdfPTable的高度.
但是在iText7中,我们如何获得当前表高度值(特别是在将表添加到其父元素之前)?
我已经测试了"table.getHeight()"方法,但它返回null.而且我还发现在表渲染对象中我可以得到这个值,但是限制是当表添加到其父元素时需要触发渲染,所以时间不是我需要的.
因为有时我们需要这个值来计算来决定"y轴"值.
在iText5,元件和关于他们的位置/大小信息是一个位混合在一起,允许你打电话calculateWidths
一个上PdfPTable
元件.
在iText7中,此功能是分开的,这为渲染/布局元素提供了不同的灵活性.
因此,模型元素(Table
实例是其示例)对其位置或大小一无所知.并且调用table.getHeight
结果null
因为table
没有HEIGHT
先前设置的属性.
要计算表高度,必须使用渲染功能.
对于模型元素,您可以获取表示此模型元素及其所有子元素的渲染器子树,以及layout
它在任何给定区域中的子树.要真正了解表的高度,您需要创建一个有意放置元素的全部内容的区域.
PdfDocument pdfDoc = ... Document doc = ... Table table = new Table(2) .addCell(new Cell().add(new Paragraph("cell 1, 1"))) .addCell(new Cell().add(new Paragraph("cell 1, 2"))); LayoutResult result = table.createRendererSubTree().setParent(doc.getRenderer()).layout( new LayoutContext(new LayoutArea(1, new Rectangle(0, 0, 400, 1e4f)))); System.out.println(result.getOccupiedArea().getBBox().getHeight());
上面的代码22.982422O
为我打印,但结果可能会有所不同,具体取决于元素的配置和属性.
我想指出代码的两个重要部分:
考虑到这将足以放置整个桌子,我们1e4f
作为高度传递LayoutArea
.请注意,如果表格无法放入该高度,结果将永远不会超过此给定高度,因此对于您的用例来说不正确(知道表格的总高度).因此,请务必通过足以放置整个桌子的高度.
.setParent(doc.getRenderer())
部分在这里很重要,用于检索继承属性.请注意,我们没有为table
元素甚至字体设置很多属性,但是这些信息对于了解此元素占用的区域至关重要.所以这些信息将在期间从父链继承layout
.您可以通过更改文档的字体:document.setFont(newFont);
或字体大小来测试这一点:document.setFontSize(24);
并观察结果的高度变化