Skip to content

Commit cd1e2d2

Browse files
committed
Fix SO exception by adjusting causeOfNothing field provided by paragraph renderer
DEVSIX-7293
1 parent 53b67d9 commit cd1e2d2

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,9 @@ protected LayoutResult directLayout(LayoutContext layoutContext) {
323323
boolean keepTogether = isKeepTogether(result.getCauseOfNothing());
324324
if (keepTogether) {
325325
floatRendererAreas.retainAll(nonChildFloatingRendererAreas);
326-
return new MinMaxWidthLayoutResult(LayoutResult.NOTHING, null, null, this, null == result.getCauseOfNothing() ? this : result.getCauseOfNothing());
326+
// Use paragraph as a cause of nothing because parent relationship between TextRenderer
327+
// and ParagraphRenderer can be broken by ParagraphRenderer#updateParentLines method.
328+
return new MinMaxWidthLayoutResult(LayoutResult.NOTHING, null, null, this, this);
327329
} else {
328330
if (marginsCollapsingEnabled) {
329331
if (anythingPlaced && notAllKidsAreFloats) {

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ This file is part of the iText (R) project.
5757
import com.itextpdf.layout.properties.VerticalAlignment;
5858
import com.itextpdf.layout.renderer.DocumentRenderer;
5959
import com.itextpdf.layout.renderer.TableRenderer;
60+
import com.itextpdf.test.LogLevelConstants;
6061
import com.itextpdf.test.annotations.LogMessage;
6162
import com.itextpdf.test.annotations.LogMessages;
6263
import com.itextpdf.test.annotations.type.IntegrationTest;
@@ -3521,6 +3522,41 @@ public void tableRelayoutTest() {
35213522
}
35223523
}
35233524

3525+
@Test
3526+
@LogMessages(messages = {
3527+
@LogMessage(messageTemplate = LayoutLogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, logLevel = LogLevelConstants.WARN)
3528+
})
3529+
public void infiniteLoopKeepTogetherTest() throws IOException, InterruptedException {
3530+
String fileName = "infiniteLoopKeepTogether.pdf";
3531+
float fontSize = 8;
3532+
3533+
try (PdfDocument pdfDoc = new PdfDocument(new PdfWriter(destinationFolder + fileName));
3534+
Document doc = new Document(pdfDoc)) {
3535+
doc.setMargins(138, 20, 75, 20);
3536+
3537+
Table table = new Table(5);
3538+
table.setKeepTogether(true);
3539+
3540+
for (int i = 0; i < 37; i++) {
3541+
table.addCell(new Cell(1, 5).add(new Paragraph(new Text("Cell"))).setFontSize(fontSize));
3542+
table.startNewRow();
3543+
}
3544+
3545+
Table commentsTable = new Table(1);
3546+
Cell commentsCell = new Cell().add(new Paragraph(new Text("First line\nSecond line")));
3547+
commentsTable.addCell(commentsCell);
3548+
3549+
Cell outerCommentsCell = new Cell(1, 5).setFontSize(fontSize);
3550+
outerCommentsCell.add(commentsTable);
3551+
table.addCell(outerCommentsCell);
3552+
3553+
doc.add(table);
3554+
}
3555+
3556+
Assert.assertNull(new CompareTool().compareByContent(destinationFolder + fileName,
3557+
sourceFolder + "cmp_" + fileName, destinationFolder));
3558+
}
3559+
35243560
private static class RotatedDocumentRenderer extends DocumentRenderer {
35253561
private final PdfDocument pdfDoc;
35263562

0 commit comments

Comments
 (0)