Skip to content

Commit b08821e

Browse files
author
Dmitry Radchuk
committed
Fix for UnsupportedOperationException if AreaBreak is inside inline-block
DEVSIX-9001
1 parent 1ef4132 commit b08821e

File tree

7 files changed

+49
-2
lines changed

7 files changed

+49
-2
lines changed

layout/src/main/java/com/itextpdf/layout/renderer/LineRenderer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,11 @@ && hasChildRendererInHtmlMode()) {
672672
result = new LineLayoutResult(LayoutResult.PARTIAL, occupiedArea, split[0],
673673
split[1], causeOfNothing);
674674
} else {
675-
result = new LineLayoutResult(LayoutResult.NOTHING, null, null, split[1], null);
675+
//Passing any cause of nothing here breaks RootRenderer#tryDisableKeepTogether logic, since it
676+
//traverses over causeOfNothing parents and those are invalidated at ParagraphRenderer level, so
677+
//in such a case we want ParagraphRenderer to be set as a causeOfNothing
678+
result = new LineLayoutResult(LayoutResult.NOTHING, null, null, split[1],
679+
causeOfNothing instanceof AreaBreakRenderer ? causeOfNothing : null);
676680
}
677681
result.setFloatsOverflowedToNextPage(floatsToNextPageOverflowRenderers);
678682
if (newLineOccurred) {

layout/src/main/java/com/itextpdf/layout/renderer/ParagraphRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ protected LayoutResult directLayout(LayoutContext layoutContext) {
416416
}
417417
} else {
418418
floatRendererAreas.retainAll(nonChildFloatingRendererAreas);
419-
return new MinMaxWidthLayoutResult(LayoutResult.NOTHING, null, null, this, null == result.getCauseOfNothing() ? this : result.getCauseOfNothing());
419+
IRenderer overflowRenderer = result.getCauseOfNothing() instanceof AreaBreakRenderer ? split[1] : this;
420+
return new MinMaxWidthLayoutResult(LayoutResult.NOTHING, null, null, overflowRenderer, null == result.getCauseOfNothing() ? this : result.getCauseOfNothing());
420421
}
421422
}
422423
}

layout/src/main/java/com/itextpdf/layout/tagging/ProhibitedTagRelationsResolver.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ This file is part of the iText (R) project.
2828
import com.itextpdf.kernel.pdf.tagutils.IRoleMappingResolver;
2929
import com.itextpdf.kernel.pdf.tagutils.PdfAllowedTagRelations;
3030
import com.itextpdf.kernel.pdf.tagutils.TagStructureContext;
31+
import com.itextpdf.layout.renderer.AreaBreakRenderer;
3132
import com.itextpdf.layout.renderer.IRenderer;
3233

3334
import java.util.Arrays;
@@ -112,6 +113,9 @@ public void repairTagStructure(LayoutTaggingHelper taggingHelper, IRenderer topR
112113
}
113114
final String normalizedParentRole = resolveToFinalRole(taggingHelper, currentThk, false);
114115
for (IRenderer childRenderer : topRender.getChildRenderers()) {
116+
if (childRenderer instanceof AreaBreakRenderer) {
117+
continue;
118+
}
115119
final TaggingHintKey kid = LayoutTaggingHelper.getOrCreateHintKey(childRenderer);
116120
if (!kid.isAccessible()) {
117121
continue;

layout/src/test/java/com/itextpdf/layout/AreaBreakTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ This file is part of the iText (R) project.
3535
import com.itextpdf.layout.properties.AreaBreakType;
3636
import com.itextpdf.layout.renderer.DivRenderer;
3737
import com.itextpdf.layout.renderer.IRenderer;
38+
import com.itextpdf.layout.tagging.ProhibitedTagRelationsResolver;
3839
import com.itextpdf.test.ExtendedITextTest;
3940
import com.itextpdf.test.TestUtil;
4041

@@ -239,6 +240,20 @@ public void areaBreakInsideDiv04Test() throws IOException, InterruptedException
239240
Assertions.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
240241
}
241242

243+
@Test
244+
public void areaBreakInsideDivInTaggedDocumentTest() throws IOException, InterruptedException {
245+
String outFileName = destinationFolder + "areaBreakInsideDivInTaggedDocument.pdf";
246+
String cmpFileName = sourceFolder + "cmp_areaBreakInsideDivInTaggedDocument.pdf";
247+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
248+
pdfDocument.setTagged();
249+
pdfDocument.getDiContainer().register(ProhibitedTagRelationsResolver.class, new ProhibitedTagRelationsResolver(pdfDocument));
250+
Document document = new Document(pdfDocument);
251+
Div div = new Div().add(new AreaBreak()).add(new Div().add(new Paragraph("test")));
252+
document.add(div);
253+
document.close();
254+
Assertions.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, "diff"));
255+
}
256+
242257
private static class DivRendererWithAreas extends DivRenderer {
243258

244259
public DivRendererWithAreas(Div modelElement) {

layout/src/test/java/com/itextpdf/layout/InlineBlockTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ This file is part of the iText (R) project.
3131
import com.itextpdf.kernel.utils.CompareTool;
3232
import com.itextpdf.layout.borders.DashedBorder;
3333
import com.itextpdf.layout.borders.SolidBorder;
34+
import com.itextpdf.layout.element.AnonymousInlineBox;
35+
import com.itextpdf.layout.element.AreaBreak;
3436
import com.itextpdf.layout.element.Cell;
3537
import com.itextpdf.layout.element.Div;
3638
import com.itextpdf.layout.element.Paragraph;
3739
import com.itextpdf.layout.element.Table;
40+
import com.itextpdf.layout.logs.LayoutLogMessageConstant;
3841
import com.itextpdf.layout.properties.FloatPropertyValue;
3942
import com.itextpdf.layout.properties.OverflowPropertyValue;
4043
import com.itextpdf.layout.properties.Property;
@@ -43,6 +46,9 @@ This file is part of the iText (R) project.
4346
import com.itextpdf.test.TestUtil;
4447

4548
import java.io.IOException;
49+
50+
import com.itextpdf.test.annotations.LogMessage;
51+
import com.itextpdf.test.annotations.LogMessages;
4652
import org.junit.jupiter.api.Assertions;
4753
import org.junit.jupiter.api.BeforeAll;
4854
import org.junit.jupiter.api.Tag;
@@ -173,4 +179,21 @@ public void wrappingAfter100PercentWidthFloatTest() throws IOException, Interrup
173179

174180
Assertions.assertNull(new CompareTool().compareByContent(output, cmp, destinationFolder));
175181
}
182+
183+
@LogMessages(messages = {@LogMessage(messageTemplate = LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA)})
184+
@Test
185+
public void areaBreakWithinInlineBlockTest() throws IOException, InterruptedException {
186+
String name = "areaBreakWithinInlineBlockTest.pdf";
187+
String output = destinationFolder + name;
188+
String cmp = sourceFolder + "cmp_" + name;
189+
try (Document doc = new Document(new PdfDocument(new PdfWriter(output)))) {
190+
AnonymousInlineBox root = new AnonymousInlineBox();
191+
Div container = new Div();
192+
container.add(new AreaBreak());
193+
container.add(new Paragraph("test"));
194+
root.add(container);
195+
doc.add(root);
196+
}
197+
Assertions.assertNull(new CompareTool().compareByContent(output, cmp, destinationFolder));
198+
}
176199
}

0 commit comments

Comments
 (0)