OverflowHiddenDivRenderer

OverflowHiddenDivRenderer

我有一个特定高度的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 overflow: hidden上设置 <div> 来实现我所需的CSS等效行为。)

最佳答案

您可以考虑为这些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,您会得到

java - iText 7 : How can I allow overflow in a Div?-LMLPHP

java - iText 7 : How can I allow overflow in a Div?-LMLPHP

请注意,即使我已经接触iText 7相当一段时间了,但这也是我第一次尝试创建自定义DivRenderer,并且我很可能已经忘记了一些特殊情况。我特别认为与旋转内容(在super.getOccupiedAreaBBox()中有影响)或区域中断(我没有在OverflowHiddenDivRenderer中设置具有合适高度的下一个渲染器)相关的问题。

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

09-11 18:50