【问题标题】:iText 7: How can I allow overflow in a Div?iText 7:如何允许 Div 溢出?
【发布时间】:2018-09-11 02:33:41
【问题描述】:

我有一个有一定高度的Div

Div div = new Div();
div.setHeight(100);

如果我在Div 中添加一个段落,其中包含几行占用的区域高于Div,我会收到以下警告:

WARN com.itextpdf.layout.renderer.BlockRenderer - Element content was clipped because some height properties are set.

除此之外,段落的行被省略了。即使该段落可能会溢出Div 的底部边框,它也会在边框上方结束。

但尽管有警告,我并不在意,我什至需要在Div 的底部边框下方以隐藏的方式溢出段落。

我怎样才能实现这样的行为?

(可以通过在 HTML <div> 上设置 overflow: hidden 来实现我需要的 CSS 等效行为。)

【问题讨论】:

  • “我什至需要段落在 Div 的底部边框下方以隐藏的方式溢出。” - 你所说的“以隐藏的方式溢出”到底是什么意思?该段落是否应该继续以不可见的方式打印? (但可能可以搜索到?)
  • 用户可能希望它是可搜索的。但这还不是最重要的:主要目标是用户可以看到的段落太高。如果段落没有被截断为整数行,他们只能一眼看出这一点。用户必须看到该段落与底部边框相交并在该边框下方继续,即使是不可见的。 Div 应该“裁剪”段落,就像我使用图像编辑器裁剪图像一样。我在我的问题中添加了 CSS (overflow: hidden) 的等效项。这就是我需要的行为。

标签: java pdf itext pdf-generation itext7


【解决方案1】:

您可以考虑为这些 DIV 使用自定义 DivRenderer

概念验证:

public class OverflowHiddenDivRenderer extends DivRenderer {
    public OverflowHiddenDivRenderer(Div modelElement) {
        super(modelElement);
    }

    @Override
    public Rectangle getOccupiedAreaBBox() {
        Rectangle rectangle = super.getOccupiedAreaBBox();
        if (height != null) {
            if (rectangle.getHeight() > height.getValue()) {
                rectangle.moveUp(rectangle.getHeight() - height.getValue()).setHeight(height.getValue());
            }
        }
        return rectangle;
    }

    @Override
    public LayoutResult layout(LayoutContext layoutContext) {
        height = getPropertyAsUnitValue(Property.HEIGHT);
        deleteProperty(Property.HEIGHT);
        LayoutResult layoutResult = super.layout(layoutContext);
        LayoutArea layoutArea = layoutResult.getOccupiedArea();
        if (layoutArea != null) {
            layoutArea.setBBox(getOccupiedAreaBBox());
        }
        return layoutResult;
    }

    UnitValue height;
}

(OverflowHiddenDivRenderer)

像这样使用它:

for (int height = 100; height < 150; height += 5) {
    Div div = new Div();
    div.setProperty(Property.OVERFLOW_Y, OverflowPropertyValue.HIDDEN);
    div.add(new Paragraph(height + " Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."));
    div.setHeight(height);
    div.setNextRenderer(new OverflowHiddenDivRenderer(div));
    document.add(div);
}

(RenderDivOverflowHidden 测试testOverflowHiddenDivRenderer)

Document document 你得到

请注意,尽管我已经使用 iText 7 有一段时间了,但这是我第一次尝试创建自定义 DivRenderer,我很可能已经忘记了一些特殊情况。我特别认为旋转内容(在super.getOccupiedAreaBBox() 中会产生影响)或区域中断(我没有在OverflowHiddenDivRenderer 中设置具有调整高度的下一个渲染器)的上下文中的问题。

一些更精通这些东西的人可能会提出一些改进......

【讨论】:

    【解决方案2】:

    是否可以将带有 alpha 的渐变叠加到 div 的底部?然后,即使文本在整数行处被截断,很明显文本被截断而不仅仅是结束。

    可能有一种方法可以解决此问题,但最简单的方法可能是保存用于此目的的图像并将其对齐到 div 的底部,因为 div 的大小似乎是固定的。像这样的东西(但有 alpha)

    如果它不固定,它应该很容易动态生成。

    【讨论】:

    • 虽然不是技术答案,但我真的很喜欢这个建议。 (是的:技术上可以创建这样的DivRenderer 实现。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2023-01-04
    • 2020-02-17
    • 1970-01-01
    • 2020-03-05
    • 2023-04-06
    相关资源
    最近更新 更多