iText 7:如何在Div中允许溢出?

ide*_*xer 7 java pdf pdf-generation itext itext7

我有Div一定的身高:

Div div = new Div();
div.setHeight(100);
Run Code Online (Sandbox Code Playgroud)

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

WARN com.itextpdf.layout.renderer.BlockRenderer - Element content was clipped because some height properties are set.
Run Code Online (Sandbox Code Playgroud)

除此之外,省略了段落的行.即使段落可以溢出Div底部边界,它也会在边界上方结束.

但是尽管有警告我不在乎,我甚至需要段落以隐藏的方式溢出下方的边界Div.

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

(可以通过设置overflow: hiddenHTML 来实现我所需行为的CSS等效<div>.)

mkl*_*mkl 5

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

概念验证:

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;
}
Run Code Online (Sandbox Code Playgroud)

(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);
}
Run Code Online (Sandbox Code Playgroud)

(RenderDivOverflowHidden测试testOverflowHiddenDivRenderer)

Document document你得到

截图

在此输入图像描述

请注意,即使我已经在iText 7上使用了很长时间,这是我第一次尝试创建自定义DivRenderer,我可能已经忘记了一些特殊情况.我特别想到旋转内容(super.getOccupiedAreaBBox()有影响力)或区域中断的背景下的问题(我没有设置OverflowHiddenDivRenderer具有适应高度的下一个渲染器).

有些人对这些东西更精通可能会有一些改进......