iText 7:如何允许Div溢出?

7

我有一个高度为特定值的 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底部边界下面以隐藏的方式溢出。

如何实现这样的行为?

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


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

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

(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中设置适应高度的下一个渲染器)。

一些更熟练的人可能会提出一些改进...


3

能否在div底部叠加带有alpha的渐变色?这样即使文本被截断在整数行,也清楚地表明文本被截断而不是结束。enter image description here

可能有一种方法可以实现,但最简单的方法可能是保存一张图片并将其对齐到div底部,因为似乎div的大小是固定的。类似于这样(但具有alpha通道)enter image description here

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


虽然不是技术性的答案,但我真的很喜欢这个建议。(是的:在技术上可以创建这样的“DivRenderer”实现。) - Bruno Lowagie

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