Skip to content

Commit 4b3e357

Browse files
committed
Fix layout table min width calculation in case of predefined width
DEVSIX-9301
1 parent 3d835c1 commit 4b3e357

10 files changed

+76
-10
lines changed

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,15 +1331,9 @@ public MinMaxWidth getMinMaxWidth() {
13311331
if (isOriginalNonSplitRenderer) {
13321332
initializeTableLayoutBorders();
13331333
}
1334+
13341335
float rightMaxBorder = bordersHandler.getRightBorderMaxWidth();
13351336
float leftMaxBorder = bordersHandler.getLeftBorderMaxWidth();
1336-
TableWidths tableWidths = new TableWidths(this, MinMaxWidthUtils.getInfWidth(), true, rightMaxBorder, leftMaxBorder);
1337-
float maxColTotalWidth = 0;
1338-
float[] columns = isOriginalNonSplitRenderer ? tableWidths.layout() : countedColumnWidth;
1339-
for (float column : columns) {
1340-
maxColTotalWidth += column;
1341-
}
1342-
float minWidth = isOriginalNonSplitRenderer ? tableWidths.getMinWidth() : maxColTotalWidth;
13431337
UnitValue marginRightUV = this.getPropertyAsUnitValue(Property.MARGIN_RIGHT);
13441338
if (!marginRightUV.isPointValue()) {
13451339
LOGGER.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
@@ -1350,8 +1344,25 @@ public MinMaxWidth getMinMaxWidth() {
13501344
LOGGER.error(MessageFormatUtil.format(IoLogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED,
13511345
Property.MARGIN_LEFT));
13521346
}
1353-
float additionalWidth = marginLefttUV.getValue() + marginRightUV.getValue() + rightMaxBorder / 2 + leftMaxBorder / 2;
1354-
return new MinMaxWidth(minWidth, maxColTotalWidth, additionalWidth);
1347+
float additionalWidth =
1348+
marginLefttUV.getValue() + marginRightUV.getValue() + rightMaxBorder / 2 + leftMaxBorder / 2;
1349+
1350+
MinMaxWidth minMaxWidth = new MinMaxWidth(additionalWidth);
1351+
if (!setMinMaxWidthBasedOnFixedWidth(minMaxWidth)) {
1352+
TableWidths tableWidths = new TableWidths(this, MinMaxWidthUtils.getInfWidth(), true, rightMaxBorder,
1353+
leftMaxBorder);
1354+
float maxColTotalWidth = 0;
1355+
float[] columns = isOriginalNonSplitRenderer ? tableWidths.layout() : countedColumnWidth;
1356+
for (float column : columns) {
1357+
maxColTotalWidth += column;
1358+
}
1359+
float minWidth = isOriginalNonSplitRenderer ? tableWidths.getMinWidth() : maxColTotalWidth;
1360+
1361+
minMaxWidth.setChildrenMinWidth(minWidth);
1362+
minMaxWidth.setChildrenMaxWidth(maxColTotalWidth);
1363+
}
1364+
1365+
return minMaxWidth;
13551366
}
13561367

13571368
@Override

layout/src/test/java/com/itextpdf/layout/renderer/TableRendererTest.java

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,43 @@ This file is part of the iText (R) project.
2222
*/
2323
package com.itextpdf.layout.renderer;
2424

25+
import com.itextpdf.io.image.ImageDataFactory;
2526
import com.itextpdf.io.logs.IoLogMessageConstant;
2627
import com.itextpdf.io.source.ByteArrayOutputStream;
28+
import com.itextpdf.kernel.colors.ColorConstants;
2729
import com.itextpdf.kernel.geom.Rectangle;
2830
import com.itextpdf.kernel.pdf.PdfDocument;
2931
import com.itextpdf.kernel.pdf.PdfWriter;
32+
import com.itextpdf.kernel.utils.CompareTool;
3033
import com.itextpdf.layout.Document;
34+
import com.itextpdf.layout.borders.SolidBorder;
3135
import com.itextpdf.layout.element.Cell;
36+
import com.itextpdf.layout.element.Image;
37+
import com.itextpdf.layout.element.Paragraph;
3238
import com.itextpdf.layout.element.Table;
3339
import com.itextpdf.layout.minmaxwidth.MinMaxWidth;
3440
import com.itextpdf.layout.properties.Property;
3541
import com.itextpdf.layout.properties.UnitValue;
3642
import com.itextpdf.test.ExtendedITextTest;
43+
import com.itextpdf.test.TestUtil;
3744
import com.itextpdf.test.annotations.LogMessage;
3845
import com.itextpdf.test.annotations.LogMessages;
3946

47+
import java.io.IOException;
4048
import org.junit.jupiter.api.Assertions;
41-
import org.junit.jupiter.api.Test;
49+
import org.junit.jupiter.api.BeforeAll;
4250
import org.junit.jupiter.api.Tag;
51+
import org.junit.jupiter.api.Test;
4352

4453
@Tag("IntegrationTest")
4554
public class TableRendererTest extends ExtendedITextTest {
55+
private static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/layout/TableRendererTest/";
56+
private static final String DESTINATION_FOLDER = TestUtil.getOutputPath() + "/layout/TableRendererTest/";
57+
58+
@BeforeAll
59+
public static void beforeClass() {
60+
createDestinationFolder(DESTINATION_FOLDER);
61+
}
4662

4763
@Test
4864
@LogMessages(messages = {
@@ -96,4 +112,43 @@ public void testIsOriginalNonSplitRenderer() {
96112

97113
Assertions.assertFalse(grandChildren[0].isOriginalNonSplitRenderer);
98114
}
115+
116+
@Test
117+
@LogMessages(messages = {
118+
@LogMessage(messageTemplate = IoLogMessageConstant.TABLE_WIDTH_IS_MORE_THAN_EXPECTED_DUE_TO_MIN_WIDTH),
119+
})
120+
public void nestedTableWithSpecifiedWidthTest() throws IOException, InterruptedException {
121+
String outFileName = DESTINATION_FOLDER + "nestedTableWithSpecifiedWidth.pdf";
122+
String cmpFileName = SOURCE_FOLDER + "cmp_nestedTableWithSpecifiedWidth.pdf";
123+
124+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
125+
Document doc = new Document(pdfDoc);
126+
127+
Table table = new Table(2);
128+
129+
Cell cell1 = new Cell(1, 1);
130+
cell1.setBorder(new SolidBorder(ColorConstants.GRAY, 1.5f));
131+
132+
Table nestedTable = new Table(1);
133+
nestedTable.setWidth(422.25f);
134+
nestedTable.setHeight(52.5f);
135+
Paragraph paragraph = new Paragraph("Hello");
136+
paragraph.setBorder(new SolidBorder(ColorConstants.GREEN, 1.5f));
137+
nestedTable.addCell(paragraph);
138+
cell1.add(nestedTable);
139+
table.addCell(cell1);
140+
141+
Cell cell2 = new Cell(2, 1);
142+
cell2.setBorder(new SolidBorder(ColorConstants.YELLOW, 1.5f));
143+
Image image = new Image(ImageDataFactory.create(SOURCE_FOLDER + "itis.jpg"));
144+
image.setWidth(406.5f);
145+
image.setHeight(7.5f);
146+
cell2.add(image);
147+
table.addCell(cell2);
148+
149+
doc.add(table);
150+
doc.close();
151+
152+
Assertions.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, DESTINATION_FOLDER));
153+
}
99154
}
12.3 KB
Loading

0 commit comments

Comments
 (0)