You can consider using a custom DivRenderer
for those DIVs.
A 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;
}
(OverflowHiddenDivRenderer)
Using it like this:
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 test testOverflowHiddenDivRenderer
)
for Document document
you get


Beware, even though I've had my hands on iText 7 for quite some time now, this is my first attempt to create a custom DivRenderer
and I may well have forgotten some special cases. I think in particular of problems in context with rotated content (which in super.getOccupiedAreaBBox()
is of influence) or area breaks (I don't set a next renderer in OverflowHiddenDivRenderer
with an adapted height).
Some people more proficient in this stuff may come up with some improvements ...