diff --git a/layout/src/main/java/com/itextpdf/layout/renderer/BlockRenderer.java b/layout/src/main/java/com/itextpdf/layout/renderer/BlockRenderer.java index f1a77fd502..8bcfa077fe 100644 --- a/layout/src/main/java/com/itextpdf/layout/renderer/BlockRenderer.java +++ b/layout/src/main/java/com/itextpdf/layout/renderer/BlockRenderer.java @@ -422,6 +422,9 @@ public LayoutResult layout(LayoutContext layoutContext) { splitRenderer = createSplitRenderer(layoutResult); splitRenderer.childRenderers = new ArrayList<>(childRenderers); replaceSplitRendererKidFloats(waitingFloatsSplitRenderers, splitRenderer); + if (overflowRenderer != null) { + handlePositionedRenderers(layoutResult, splitRenderer, overflowRenderer); + } float usedHeight = occupiedArea.getBBox().getHeight(); if (!includeFloatsInOccupiedArea) { diff --git a/layout/src/test/java/com/itextpdf/layout/renderer/BlockRendererTest.java b/layout/src/test/java/com/itextpdf/layout/renderer/BlockRendererTest.java index 6a5ea6d089..8e95bb7253 100644 --- a/layout/src/test/java/com/itextpdf/layout/renderer/BlockRendererTest.java +++ b/layout/src/test/java/com/itextpdf/layout/renderer/BlockRendererTest.java @@ -299,6 +299,40 @@ public void absolutePositionedChildIsNotDroppedWhenParentSplitsTest() throws Exc Assertions.assertNull(new CompareTool().compareByContent(outFile, cmpFileName, DESTINATION_FOLDER)); } + @Test + public void absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplitsTest() throws Exception { + String cmpFileName = SOURCE_FOLDER + "cmp_absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplits.pdf"; + String outFile = DESTINATION_FOLDER + "absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplits.pdf"; + + try (PdfDocument pdfDoc = new PdfDocument(CompareTool.createTestPdfWriter(outFile)); + Document doc = new Document(pdfDoc)) { + Div container = new Div(); + container.setProperty(Property.POSITION, LayoutPosition.RELATIVE); + + // Float that is taller than a page, so it is split and its remainder overflows to the next page + StringBuilder floatText = new StringBuilder(); + for (int i = 0; i < 150; ++i) { + floatText.append("Float line ").append(i).append(". "); + } + Div floatingDiv = new Div().add(new Paragraph(floatText.toString())); + floatingDiv.setProperty(Property.FLOAT, FloatPropertyValue.LEFT); + floatingDiv.setWidth(100); + + Div positioned = new Div().add(new Paragraph("PositionedMarker")); + positioned.setProperty(Property.POSITION, LayoutPosition.ABSOLUTE); + positioned.setProperty(Property.RIGHT, 6f); + positioned.setProperty(Property.TOP, 6f); + + container.add(floatingDiv); + container.add(new Paragraph("Short text next to the float")); + container.add(positioned); + + doc.add(container); + } + + Assertions.assertNull(new CompareTool().compareByContent(outFile, cmpFileName, DESTINATION_FOLDER)); + } + public static class WrongParentTreeDivRenderer extends DivRenderer { public WrongParentTreeDivRenderer(Div modelElement) { super(modelElement); diff --git a/layout/src/test/resources/com/itextpdf/layout/BlockRendererTest/cmp_absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplits.pdf b/layout/src/test/resources/com/itextpdf/layout/BlockRendererTest/cmp_absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplits.pdf new file mode 100644 index 0000000000..faf3df3fe4 Binary files /dev/null and b/layout/src/test/resources/com/itextpdf/layout/BlockRendererTest/cmp_absolutePositionedChildIsAnchoredToFirstFragmentWhenFloatSplits.pdf differ