Skip to content

Commit 1ade83e

Browse files
committed
Fix overflow renderer's height property processing. Add some new tests.
DEVSIX-1817
1 parent 0abc56a commit 1ade83e

File tree

8 files changed

+224
-11
lines changed

8 files changed

+224
-11
lines changed

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,6 +1699,22 @@ protected void overrideHeightProperties() {
16991699

17001700

17011701
protected void updateHeightsOnSplit(boolean wasHeightClipped, AbstractRenderer splitRenderer, AbstractRenderer overflowRenderer) {
1702+
if (wasHeightClipped) {
1703+
//if height was clipped, max height exists and can be resolved
1704+
Float maxHeight = retrieveMaxHeight();
1705+
Logger logger = LoggerFactory.getLogger(BlockRenderer.class);
1706+
logger.warn(LogMessageConstant.CLIP_ELEMENT);
1707+
1708+
splitRenderer.occupiedArea.getBBox()
1709+
.moveDown((float) maxHeight - occupiedArea.getBBox().getHeight())
1710+
.setHeight((float) maxHeight);
1711+
1712+
}
1713+
1714+
if (null == overflowRenderer || isKeepTogether()) {
1715+
return;
1716+
}
1717+
17021718
//Update height related properties on split or overflow
17031719
Float parentResolvedHeightPropertyValue = retrieveResolvedParentDeclaredHeight();//For relative heights, we need the parent's resolved height declaration
17041720
if (hasProperty(Property.MAX_HEIGHT)) {
@@ -1751,17 +1767,7 @@ protected void updateHeightsOnSplit(boolean wasHeightClipped, AbstractRenderer s
17511767
//If parent has no resolved height, relative height declarations can be ignored
17521768
}
17531769

1754-
if (wasHeightClipped) {
1755-
//if height was clipped, max height exists and can be resolved
1756-
Float maxHeight = retrieveMaxHeight();
1757-
Logger logger = LoggerFactory.getLogger(BlockRenderer.class);
1758-
logger.warn(LogMessageConstant.CLIP_ELEMENT);
1759-
1760-
splitRenderer.occupiedArea.getBBox()
1761-
.moveDown((float) maxHeight - occupiedArea.getBBox().getHeight())
1762-
.setHeight((float) maxHeight);
17631770

1764-
}
17651771
}
17661772

17671773
protected MinMaxWidth getMinMaxWidth() {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,13 +298,15 @@ public LayoutResult layout(LayoutContext layoutContext) {
298298
if (isRelativePosition() && positionedRenderers.size() > 0) {
299299
overflowRenderer.positionedRenderers = new ArrayList<>(positionedRenderers);
300300
}
301+
302+
updateHeightsOnSplit(wasHeightClipped, splitRenderer, overflowRenderer);
303+
301304
if (keepTogether) {
302305
splitRenderer = null;
303306
overflowRenderer.childRenderers.clear();
304307
overflowRenderer.childRenderers = new ArrayList<>(childRenderers);
305308
}
306309

307-
updateHeightsOnSplit(wasHeightClipped, splitRenderer, overflowRenderer);
308310
correctPositionedLayout(layoutBox);
309311

310312
applyPaddings(occupiedArea.getBBox(), paddings, true);

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

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,25 @@ This file is part of the iText (R) project.
4444

4545

4646
import com.itextpdf.io.LogMessageConstant;
47+
import com.itextpdf.io.font.FontConstants;
4748
import com.itextpdf.kernel.color.ColorConstants;
49+
import com.itextpdf.kernel.font.PdfFontFactory;
50+
import com.itextpdf.kernel.geom.PageSize;
4851
import com.itextpdf.kernel.geom.Rectangle;
4952
import com.itextpdf.kernel.pdf.PdfDocument;
5053
import com.itextpdf.kernel.pdf.PdfWriter;
5154
import com.itextpdf.kernel.utils.CompareTool;
5255
import com.itextpdf.layout.border.SolidBorder;
56+
import com.itextpdf.layout.element.AreaBreak;
57+
import com.itextpdf.layout.element.Cell;
5358
import com.itextpdf.layout.element.Div;
5459
import com.itextpdf.layout.element.List;
5560
import com.itextpdf.layout.element.Paragraph;
61+
import com.itextpdf.layout.element.Table;
5662
import com.itextpdf.layout.property.ListNumberingType;
63+
import com.itextpdf.layout.property.Property;
64+
import com.itextpdf.layout.property.UnitValue;
65+
import com.itextpdf.layout.renderer.DocumentRenderer;
5766
import com.itextpdf.test.ExtendedITextTest;
5867
import com.itextpdf.test.annotations.LogMessage;
5968
import com.itextpdf.test.annotations.LogMessages;
@@ -229,5 +238,201 @@ public void keepTogetherDivTest02() throws IOException, InterruptedException {
229238
Assert.assertNull(new CompareTool().compareByContent(outFile, cmpFileName, destinationFolder, "diff"));
230239
}
231240

241+
@Test
242+
@LogMessages(messages = {
243+
@LogMessage(messageTemplate = LogMessageConstant.CLIP_ELEMENT, count = 8)
244+
})
245+
public void narrowPageTest01() throws IOException, InterruptedException {
246+
String testName = "narrowPageTest01.pdf";
247+
String outFileName = destinationFolder + testName;
248+
String cmpFileName = sourceFolder + "cmp_" + testName;
249+
250+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
251+
Document doc = new Document(pdfDoc);
252+
253+
Table tbl = new Table(UnitValue.createPointArray(new float[]{30.0F, 30.0F, 30.0F, 30.0F}));
254+
tbl.setWidth(120.0F);
255+
tbl.setFont(PdfFontFactory.createFont(FontConstants.COURIER));
256+
tbl.setFontSize(8.0F);
257+
258+
for (int x = 0; x < 12; x++) {
259+
for (int y = 0; y < 4; y++) {
260+
Cell cell = new Cell();
261+
cell.add(new Paragraph("row " + x));
262+
cell.setHeight(10.5f);
263+
cell.setMaxHeight(10.5f);
264+
cell.setKeepTogether(true);
265+
tbl.addCell(cell);
266+
}
267+
}
268+
269+
doc.add(tbl);
270+
271+
doc.close();
272+
273+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, testName + "_diff"));
274+
}
275+
276+
@Test
277+
@LogMessages(messages = {
278+
@LogMessage(messageTemplate = LogMessageConstant.CLIP_ELEMENT, count = 2)
279+
})
280+
public void narrowPageTest02() throws IOException, InterruptedException {
281+
String testName = "narrowPageTest02.pdf";
282+
String outFileName = destinationFolder + testName;
283+
String cmpFileName = sourceFolder + "cmp_" + testName;
232284

285+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
286+
Document doc = new Document(pdfDoc);
287+
doc.setRenderer(new SpecialOddPagesDocumentRenderer(doc, new PageSize(102.0F, 132.0F)));
288+
289+
Paragraph p = new Paragraph("row 10");
290+
Div div = new Div();
291+
div.add(p);
292+
div.setKeepTogether(true);
293+
294+
doc.add(new Paragraph("a"));
295+
doc.add(div);
296+
doc.add(new AreaBreak());
297+
298+
div.setHeight(30);
299+
doc.add(new Paragraph("a"));
300+
doc.add(div);
301+
doc.add(new AreaBreak());
302+
doc.add(new AreaBreak());
303+
304+
div.deleteOwnProperty(Property.HEIGHT);
305+
doc.add(div);
306+
doc.add(new AreaBreak());
307+
doc.add(new AreaBreak());
308+
309+
div.setHeight(30);
310+
doc.add(div);
311+
312+
doc.close();
313+
314+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, testName + "_diff"));
315+
}
316+
317+
@Test
318+
public void narrowPageTest02A() throws IOException, InterruptedException {
319+
String testName = "narrowPageTest02A.pdf";
320+
String outFileName = destinationFolder + testName;
321+
String cmpFileName = sourceFolder + "cmp_" + testName;
322+
323+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
324+
Document doc = new Document(pdfDoc);
325+
doc.setRenderer(new SpecialOddPagesDocumentRenderer(doc, new PageSize(102.0F, 102.0F)));
326+
327+
Paragraph p = new Paragraph("row 10");
328+
p.setKeepTogether(true);
329+
330+
doc.add(new Paragraph("a"));
331+
doc.add(p);
332+
doc.add(new AreaBreak());
333+
334+
p.setHeight(30);
335+
doc.add(new Paragraph("a"));
336+
doc.add(p);
337+
doc.add(new AreaBreak());
338+
doc.add(new AreaBreak());
339+
340+
p.deleteOwnProperty(Property.HEIGHT);
341+
doc.add(p);
342+
doc.add(new AreaBreak());
343+
doc.add(new AreaBreak());
344+
345+
p.setHeight(30);
346+
doc.add(p);
347+
348+
doc.close();
349+
350+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, testName + "_diff"));
351+
}
352+
353+
private static class SpecialOddPagesDocumentRenderer extends DocumentRenderer {
354+
private PageSize firstPageSize;
355+
356+
public SpecialOddPagesDocumentRenderer(Document document, PageSize firstPageSize) {
357+
super(document);
358+
this.firstPageSize = new PageSize(firstPageSize);
359+
}
360+
361+
@Override
362+
protected PageSize addNewPage(PageSize customPageSize) {
363+
PageSize newPageSize = null;
364+
switch (currentPageNumber % 2) {
365+
case 1:
366+
newPageSize = firstPageSize;
367+
break;
368+
case 0:
369+
default:
370+
newPageSize = PageSize.A4;
371+
break;
372+
}
373+
return super.addNewPage(newPageSize);
374+
}
375+
}
376+
377+
@Test
378+
@LogMessages(messages = {
379+
@LogMessage(messageTemplate = LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, count = 1)
380+
})
381+
public void updateHeightTest01() throws IOException, InterruptedException {
382+
String testName = "updateHeightTest01.pdf";
383+
String outFileName = destinationFolder + testName;
384+
String cmpFileName = sourceFolder + "cmp_" + testName;
385+
386+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
387+
pdfDoc.setDefaultPageSize(new PageSize(102.0F, 102.0F));
388+
Document doc = new Document(pdfDoc);
389+
390+
391+
Div div = new Div();
392+
div.setBackgroundColor(ColorConstants.RED);
393+
div.add(new Paragraph("row"));
394+
div.add(new Paragraph("row 10"));
395+
396+
div.setKeepTogether(true);
397+
div.setHeight(100);
398+
399+
doc.add(new Paragraph("a"));
400+
doc.add(div);
401+
402+
doc.close();
403+
404+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, testName + "_diff"));
405+
}
406+
407+
@Test
408+
@LogMessages(messages = {
409+
@LogMessage(messageTemplate = LogMessageConstant.CLIP_ELEMENT, count = 1),
410+
@LogMessage(messageTemplate = LogMessageConstant.OCCUPIED_AREA_HAS_NOT_BEEN_INITIALIZED, count = 22),
411+
412+
})
413+
//TODO DEVSIX-1977
414+
public void partialTest01() throws IOException, InterruptedException {
415+
String testName = "partialTest01.pdf";
416+
String outFileName = destinationFolder + testName;
417+
String cmpFileName = sourceFolder + "cmp_" + testName;
418+
419+
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
420+
pdfDoc.setDefaultPageSize(PageSize.A7);
421+
Document doc = new Document(pdfDoc);
422+
423+
Div div = new Div();
424+
div.setBackgroundColor(ColorConstants.RED);
425+
div.setKeepTogether(true);
426+
div.setHeight(200);
427+
428+
for (int i = 0; i < 30; i++) {
429+
div.add(new Paragraph("row " + i));
430+
}
431+
432+
doc.add(div);
433+
434+
doc.close();
435+
436+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, destinationFolder, testName + "_diff"));
437+
}
233438
}
Binary file not shown.

0 commit comments

Comments
 (0)