iText 7:如何在 Div 中允许溢出?
iText 7: How can I allow overflow in a Div?
我有一个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 的底部叠加带有 alpha 的渐变?然后即使文本在整数行被截断,很明显文本被截断而不仅仅是结束。
可能有一种方法可以做到这一点,但最简单的方法可能是仅保存用于此目的的图像并将其与 div 的底部对齐,因为它看起来像div 已修复。像这样(但有 alpha)
如果它不是固定的,动态生成应该很容易。
您可以考虑为这些 DIV 使用自定义 DivRenderer
。
一个proof-of-concept:
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;
}
这样使用:
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
中设置具有自适应高度的下一个渲染器)的上下文中的问题。
一些更精通这些东西的人可能会想出一些改进...
我有一个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 的底部叠加带有 alpha 的渐变?然后即使文本在整数行被截断,很明显文本被截断而不仅仅是结束。
可能有一种方法可以做到这一点,但最简单的方法可能是仅保存用于此目的的图像并将其与 div 的底部对齐,因为它看起来像div 已修复。像这样(但有 alpha)
如果它不是固定的,动态生成应该很容易。
您可以考虑为这些 DIV 使用自定义 DivRenderer
。
一个proof-of-concept:
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;
}
这样使用:
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
中设置具有自适应高度的下一个渲染器)的上下文中的问题。
一些更精通这些东西的人可能会想出一些改进...