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

标签 java pdf itext pdf-generation itext7

我有一个 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 overflow: hidden 上设置 <div> 来实现。)

最佳答案

您可以考虑为这些 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 文档 你得到

Screenshot

enter image description here

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

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

关于java - iText 7 : How can I allow overflow in a Div?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601728/

相关文章:

java - iText 章节内的新页面

java - NetBeans Matisse 中的表单加载错误

java - 使用 iText 将 TXT 文件转换为 PDF(保留格式)

ios - 使用 Apple 的 PDFKit 框架更改文本和背景颜色

javascript - Hapi.js 文件上传 我如何获取文件以便我可以在其上使用 imageMagick 命令行工具

java - 尝试使用 itext :Exception in thread "main" java. lang.NoClassDefFoundError 签署 pdf 时出错:org/bouncycaSTLe/cert/X509CertificateHolder

java - 在 Java 中分解多项式字符串

java - 如何制作Java插件?

java - 在 Java 中反转给定的句子

java - 将日期和整数写入现有的 .pdf