【问题标题】:iText 7: Paragraph height as it would be renderediText 7:将呈现的段落高度
【发布时间】:2018-09-10 21:44:25
【问题描述】:

我可以如下设置一个新段落的宽度,从而产生一定的高度:

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 文件时计算的。但我需要最终渲染之前的高度。我怎样才能最有效地获得它?

【问题讨论】:

  • 我会说 Alexey 既可信又官方。毕竟,他是 iText 7 的开发者之一。此外,您必须对段落进行布局以确定其最终高度。我可能会建议对一些一次性的 Canvas 进行渲染,但他的解决方案更好。因此,您可能会在替代答案中描述您希望的内容。
  • 由于我不确定最佳实践是什么,我不知道我应该期待哪个答案。通常社区会提出不止一种解决方案。因此我通常要等几天。
  • 不要屏住呼吸等待更好的解决方案;)
  • 我只是不喜欢操之过急。缓慢而稳定地赢得比赛。

标签: java pdf itext pdf-generation itext7


【解决方案1】:

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

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);

【讨论】:

  • @ideaboxer 太棒了!然后请接受答案,以便其他访问者可以轻松看到答案解决了问题。
  • 我想让其他用户有机会发表他们的想法。但我不会忘记最终接受答案!
  • 你将如何获得宽度而不是高度?使用这种方法,我总是得到 LayoutArea 中指定的 Rectangle 的宽度。
  • @MHogge 那是因为在第二行代码中宽度已经固定好了(p.setWidth(100);)。
猜你喜欢
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多