你可以考虑使用自定义的
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
,您将获得以下结果:
![截图](https://istack.dev59.com/8y1W5.webp)
![输入图像描述](https://istack.dev59.com/0PsPI.webp)
请注意,尽管我已经使用iText 7相当长的时间了,但这是我第一次尝试创建自定义的DivRenderer
,我可能会忘记一些特殊情况。我特别考虑旋转内容(在super.getOccupiedAreaBBox()
中受影响)或区域断点的问题(我没有在OverflowHiddenDivRenderer
中设置适应高度的下一个渲染器)。
一些更熟练的人可能会提出一些改进...
Div
应该像我用图像编辑器裁剪图像一样“裁剪”段落。我在问题中添加了CSS的等效项(overflow: hidden
)。这就是我需要的行为。 - ideaboxer