在itext5中,我们可以在需要“public float calculateheights(boolean firsttime)”时获得pdfptable的高度。
但是在itext7中,如何获得当前表的高度值(尤其是在将表添加到其父元素之前)?
我已经测试了“table.getheight()”方法,但它返回null。我还发现在一个table render对象中我可以得到这个值,但是限制是当table添加到其父元素时需要触发render,所以时间不是我需要的。
因为有时我们需要这个值来计算来决定“y轴”的值。
2条答案
按热度按时间k97glaaz1#
在itext5中,元素和关于它们的位置/大小的信息混合在一起,这允许您调用
calculateWidths
在PdfPTable
元素。在itext7中,这个功能是分离的,这使得呈现/布局元素具有不同的灵活性。
因此,模型元素
Table
示例就是一个例子,不知道自己的位置或大小。打电话来table.getHeight
结果null
因为table
没有HEIGHT
属性之前设置为。要计算表格高度,必须使用渲染功能。
对于模型元素,可以获取表示此模型元素及其所有子元素的呈现器的子树,以及
layout
它在任何给定的区域。要真正了解一个表的高度,您需要创建一个区域,该区域在有意识的情况下足以放置元素的全部内容。上面的代码打印出来了
22.982422O
对我来说,结果可能会因元素的配置和属性而异。我想指出代码的两个重要部分:
我们通过了
1e4f
因为LayoutArea
,考虑到这足以放置整张table。请注意,如果无法将表格放置到该高度,结果将永远不会超过此给定高度,因此它将不适合您的用例(知道表格的总高度)。因此,一定要通过高度,这将是足够的位置,整个表。.setParent(doc.getRenderer())
部分在这里很重要,用于检索继承属性。请注意,我们没有为table
元素,甚至字体,但此信息对于知道此元素将占据的区域是必不可少的。因此,此信息将在运行期间从父链继承layout
. 您可以通过更改文档的字体来测试这一点:document.setFont(newFont);
,或字体大小:document.setFontSize(24);
观察由此产生的高度变化h7appiyu2#
好吧,由于渲染器框架在itext7中的编写方式,在将布局对象添加到父文档之前,还没有一种方法来计算布局对象的高度,因为实际计算布局对象的高度是在将其添加到父文档时进行的
Document
对象。但是,您可以重新布置
Document
,允许您更改以前添加的元素的内容。使用此功能,可以模拟表的呈现,并在添加新元素时控制表的高度。这个table.getHeight()
仍然不起作用,因为它检索height属性,并且该属性当前未在表呈现过程中的任何位置设置。在下面的示例中,我编写了一个方便的方法,该方法迭代渲染器树并打印出文档中每个表所占的区域,向您展示如何获得计算出的高度。
该示例本身向文档中添加一些表,显示占用区域,向每个表中添加一些单元格,显示占用区域(它们是相同的,因为添加到以前添加的元素不会触发布局),最后手动触发重新布局并显示最终的占用区域。