Skip to content

Commit 919bdcb

Browse files
author
dmitry.radchuk
committed
Change effective area obtaining in ListItemRenderer
DEVSIX-7049
1 parent 0a6dd44 commit 919bdcb

File tree

3 files changed

+68
-35
lines changed

3 files changed

+68
-35
lines changed

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

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ This file is part of the iText (R) project.
4646
import com.itextpdf.io.logs.IoLogMessageConstant;
4747
import com.itextpdf.kernel.font.PdfFont;
4848
import com.itextpdf.kernel.geom.Rectangle;
49-
import com.itextpdf.kernel.pdf.PdfDocument;
50-
import com.itextpdf.kernel.pdf.PdfPage;
5149
import com.itextpdf.kernel.pdf.tagging.StandardRoles;
5250
import com.itextpdf.layout.element.ListItem;
5351
import com.itextpdf.layout.element.Paragraph;
@@ -227,7 +225,8 @@ public void draw(DrawContext drawContext) {
227225
}
228226

229227
// consider page area without margins
230-
Rectangle effectiveArea = obtainEffectiveArea(drawContext);
228+
RootRenderer root = getRootRenderer();
229+
Rectangle effectiveArea = root.getCurrentArea().getBBox();
231230

232231
// symbols are not drawn here, because they are in page margins
233232
if (!isRtl && symbolRenderer.getOccupiedArea().getBBox().getRight() > effectiveArea.getLeft()
@@ -347,36 +346,4 @@ private float[] calculateAscenderDescender() {
347346
}
348347
return new float[] {0, 0};
349348
}
350-
351-
private Rectangle obtainEffectiveArea(DrawContext drawContext) {
352-
PdfDocument pdfDocument = drawContext.getDocument();
353-
354-
// for the time being iText creates a single symbol renderer for a list.
355-
// This renderer will be used for all the items across all the pages, which mean that it could
356-
// be layouted at page i and used at page j, j>i.
357-
int pageNumber = parent.getOccupiedArea().getPageNumber();
358-
Rectangle pageSize;
359-
if (pageNumber != 0) {
360-
PdfPage page = pdfDocument.getPage(pageNumber);
361-
pageSize = page.getPageSize();
362-
} else {
363-
pageSize = pdfDocument.getDefaultPageSize();
364-
}
365-
366-
RootRenderer rootRenderer = this.getRootRenderer();
367-
//TODO DEVSIX-6372 Obtaining DocumentRenderer's margins results in a ClassCastException
368-
Float[] margins = new Float[] {rootRenderer.<Float>getProperty(Property.MARGIN_TOP),
369-
rootRenderer.<Float>getProperty(Property.MARGIN_RIGHT),
370-
rootRenderer.<Float>getProperty(Property.MARGIN_BOTTOM),
371-
rootRenderer.<Float>getProperty(Property.MARGIN_LEFT)};
372-
for (int i = 0; i < margins.length; i++) {
373-
margins[i] = replaceIfNull(margins[i], 0f);
374-
}
375-
return new Rectangle(pageSize)
376-
.applyMargins((float) margins[0], (float) margins[1], (float) margins[2], (float) margins[3], false);
377-
}
378-
379-
private static float replaceIfNull(Float value, float defaultValue) {
380-
return (float) (null == value ? defaultValue : value);
381-
}
382349
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.itextpdf.layout;
2+
3+
import com.itextpdf.kernel.geom.Rectangle;
4+
import com.itextpdf.kernel.pdf.PdfDocument;
5+
import com.itextpdf.kernel.pdf.PdfWriter;
6+
import com.itextpdf.kernel.utils.CompareTool;
7+
import com.itextpdf.layout.element.Cell;
8+
import com.itextpdf.layout.element.ListItem;
9+
import com.itextpdf.layout.element.Table;
10+
import com.itextpdf.layout.layout.LayoutArea;
11+
import com.itextpdf.layout.layout.LayoutResult;
12+
import com.itextpdf.layout.layout.RootLayoutArea;
13+
import com.itextpdf.layout.renderer.DocumentRenderer;
14+
import com.itextpdf.test.ExtendedITextTest;
15+
import com.itextpdf.test.annotations.type.IntegrationTest;
16+
17+
import java.io.IOException;
18+
import org.junit.Assert;
19+
import org.junit.BeforeClass;
20+
import org.junit.Test;
21+
import org.junit.experimental.categories.Category;
22+
23+
@Category(IntegrationTest.class)
24+
public class CustomCurrentAreaTest extends ExtendedITextTest {
25+
public static final String DESTINATION_FOLDER = "./target/test/com/itextpdf/layout/CustomCurrentAreaTest/";
26+
public static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/layout/CustomCurrentAreaTest/";
27+
28+
@BeforeClass
29+
public static void beforeClass() {
30+
createDestinationFolder(DESTINATION_FOLDER);
31+
}
32+
33+
@Test
34+
public void longListItemTest() throws IOException, InterruptedException {
35+
String outFileName = DESTINATION_FOLDER + "longListItemTest.pdf";
36+
String cmpFileName = SOURCE_FOLDER + "cmp_longListItemTest.pdf";
37+
Rectangle customArea = new Rectangle(0, 15, 586, 723);
38+
try(PdfDocument pdf = new PdfDocument(new PdfWriter(outFileName));Document document = new Document(pdf)) {
39+
ClauseRenderer renderer = new ClauseRenderer(document, customArea);
40+
document.setRenderer(renderer);
41+
42+
com.itextpdf.layout.element.List list = new com.itextpdf.layout.element.List();
43+
list.setListSymbol("1.");
44+
list.add(new ListItem(
45+
"It is a long established fact that a reader will be distracted by the readable content of a page"
46+
+ " when looking at its layout."));
47+
document.add(new Table(1).addCell(new Cell().add(list)));
48+
}
49+
Assert.assertNull(new CompareTool().compareByContent(outFileName, cmpFileName, DESTINATION_FOLDER, "diff"));
50+
}
51+
52+
private static class ClauseRenderer extends DocumentRenderer {
53+
protected Rectangle column;
54+
55+
public ClauseRenderer(Document document, Rectangle rect) {
56+
super(document, false);
57+
this.column = rect;
58+
}
59+
60+
@Override
61+
protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
62+
super.updateCurrentArea(overflowResult);
63+
return (currentArea = new RootLayoutArea(currentArea.getPageNumber(), column.clone()));
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)