iText 7:段落高度将如何呈现

7

我可以通过以下方式设置新段落的宽度,从而得到一定的高度:

Paragraph p = new Paragraph("some longer text some longer text some longer text");
p.setWidth(100);
System.out.println("height " + p.getHeight());
document.add(p);

当然,p.getHeight()null的,因为渲染高度是在渲染PDF文件时计算的。但是我需要在最终渲染之前得到高度。如何以最有效的方式获取它?

1
我会说Alexey既可靠又正式。毕竟,他是iText 7的开发者之一。此外,您必须布局段落以确定其最终高度。我可能曾建议将其渲染到一些临时画布上,但他的解决方案更好。因此,您可能可以描述一下您希望在另一个答案中得到什么。 - mkl
由于我不确定什么是最佳实践,所以我不知道应该期望哪个答案。通常社区会提出多种解决方案。因此我通常需要等待几天。 - ideaboxer
不要屏住呼吸等待更好的解决方案 ;) - mkl
我只是不喜欢过于匆忙。缓慢而稳定才能赢得比赛。 - ideaboxer
1个回答

20

为了获得段落的有效宽度,就好像它已经在页面上绘制一样,您需要从模型元素树创建呈现器树,然后布局最顶层的呈现器。以下是代码实现:

Paragraph p = new Paragraph("some longer text some longer text some longer text");
p.setWidth(100);

// Create renderer tree
IRenderer paragraphRenderer = p.createRendererSubTree();
// Do not forget setParent(). Set the dimensions of the viewport as needed
LayoutResult result = paragraphRenderer.setParent(document.getRenderer()).
                        layout(new LayoutContext(new LayoutArea(1, new Rectangle(100, 1000))));

// LayoutResult#getOccupiedArea() contains the information you need
System.out.println("height " + result.getOccupiedArea().getBBox().getHeight());
请注意,计算出的尺寸将包括默认情况下段落中存在的边距,因此如果您想获得不带边距的高度,您应该先将段落边距设置为0:
p.setMargin(0);

1
@ideaboxer 太好了!请接受答案,这样其他访问者就可以轻松地看到答案解决了问题。 - Alexey Subach
我想给其他用户一个发表他们想法的机会。但最终我不会忘记接受一个答案! - ideaboxer
你怎么做才能获取宽度而不是高度?使用这种方法,我总是得到LayoutArea中指定的矩形的宽度。 - MHogge
@MHogge 这是因为在代码的第二行中,宽度已经被固定(p.setWidth(100);)。 - Jules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接