Skip to content

Commit fff0118

Browse files
author
Vitali Prudnikovich
committed
Improve coverage of ImageRenderInfo class
DEVSIX-7101
1 parent cd6df1a commit fff0118

File tree

4 files changed

+127
-13
lines changed

4 files changed

+127
-13
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/canvas/parser/data/ImageRenderInfo.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,22 +64,22 @@ public class ImageRenderInfo extends AbstractRenderInfo {
6464
/**
6565
* The coordinate transformation matrix that was in effect when the image was rendered.
6666
*/
67-
private Matrix ctm;
68-
private PdfImageXObject image;
67+
private final Matrix ctm;
68+
private final PdfImageXObject image;
6969
/**
7070
* The color space dictionary from resources which are associated with the image.
7171
*/
72-
private PdfDictionary colorSpaceDictionary;
72+
private final PdfDictionary colorSpaceDictionary;
7373
/**
7474
* Defines if the encountered image was inline.
7575
*/
76-
private boolean isInline;
77-
private PdfName resourceName;
76+
private final boolean isInline;
77+
private final PdfName resourceName;
7878

7979
/**
8080
* Hierarchy of nested canvas tags for the text from the most inner (nearest to text) tag to the most outer.
8181
*/
82-
private List<CanvasTag> canvasTagHierarchy;
82+
private final List<CanvasTag> canvasTagHierarchy;
8383

8484
/**
8585
* Creates an ImageRenderInfo.
@@ -93,8 +93,8 @@ public class ImageRenderInfo extends AbstractRenderInfo {
9393
* @param colorSpaceDictionary the color space dictionary from resources which are associated with the image
9494
* @param isInline defines if the encountered image was inline
9595
*/
96-
public ImageRenderInfo(Stack<CanvasTag> canvasTagHierarchy, CanvasGraphicsState gs, Matrix ctm, PdfStream imageStream,
97-
PdfName resourceName, PdfDictionary colorSpaceDictionary, boolean isInline) {
96+
public ImageRenderInfo(Stack<CanvasTag> canvasTagHierarchy, CanvasGraphicsState gs, Matrix ctm,
97+
PdfStream imageStream, PdfName resourceName, PdfDictionary colorSpaceDictionary, boolean isInline) {
9898
super(gs);
9999
this.canvasTagHierarchy = Collections.<CanvasTag>unmodifiableList(new ArrayList<>(canvasTagHierarchy));
100100
this.resourceName = resourceName;
@@ -221,14 +221,14 @@ public boolean hasMcid(int mcid) {
221221
public boolean hasMcid(int mcid, boolean checkTheTopmostLevelOnly) {
222222
if (checkTheTopmostLevelOnly) {
223223
if (canvasTagHierarchy != null) {
224-
int infoMcid = getMcid();
224+
final int infoMcid = getMcid();
225225
return infoMcid != -1 && infoMcid == mcid;
226226
}
227227
} else {
228-
for (CanvasTag tag : canvasTagHierarchy) {
229-
if (tag.hasMcid())
230-
if (tag.getMcid() == mcid)
231-
return true;
228+
for (final CanvasTag tag : canvasTagHierarchy) {
229+
if (tag.hasMcid() && (tag.getMcid() == mcid)) {
230+
return true;
231+
}
232232
}
233233
}
234234
return false;

kernel/src/test/java/com/itextpdf/kernel/pdf/canvas/parser/PdfCanvasProcessorIntegrationTest.java

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

4545
import com.itextpdf.io.logs.IoLogMessageConstant;
4646
import com.itextpdf.io.source.ByteArrayOutputStream;
47+
import com.itextpdf.kernel.geom.Matrix;
4748
import com.itextpdf.kernel.logs.KernelLogMessageConstant;
4849
import com.itextpdf.kernel.exceptions.PdfException;
4950
import com.itextpdf.kernel.colors.Color;
@@ -220,6 +221,36 @@ public void patternColorParsingValidPdfTest() throws IOException {
220221
}
221222
}
222223

224+
@Test
225+
public void checkImageRenderInfoProcessorTest() throws IOException {
226+
PdfDocument document = new PdfDocument(new PdfReader(SOURCE_FOLDER + "tableWithImageAndText.pdf"),
227+
new PdfWriter(new ByteArrayOutputStream()));
228+
229+
PdfPage page = document.getPage(1);
230+
RecordFirstImageEventListener eventListener = new RecordFirstImageEventListener();
231+
PdfCanvasProcessor processor = new PdfCanvasProcessor(eventListener);
232+
processor.processPageContent(page);
233+
234+
// Check caught image's ImageRenderInfo
235+
ImageRenderInfo imageRenderInfo = eventListener.getImageRenderInfo();
236+
final float EPS = 0.001f;
237+
Assert.assertFalse(imageRenderInfo.isInline());
238+
Assert.assertEquals(1024, imageRenderInfo.getImage().getWidth(), EPS);
239+
Assert.assertEquals(768, imageRenderInfo.getImage().getHeight(), EPS);
240+
Assert.assertEquals("/Im1", imageRenderInfo.getImageResourceName().toString());
241+
Assert.assertEquals(new com.itextpdf.kernel.geom.Vector(212.67f, 676.25f, 1),
242+
imageRenderInfo.getStartPoint());
243+
Assert.assertEquals(new Matrix(169.67f, 0, 0, 0, 127.25f, 0, 212.67f, 676.25f, 1),
244+
imageRenderInfo.getImageCtm());
245+
Assert.assertEquals(21590.508, imageRenderInfo.getArea(), EPS);
246+
Assert.assertNull(imageRenderInfo.getColorSpaceDictionary());
247+
Assert.assertEquals(1, imageRenderInfo.getCanvasTagHierarchy().size());
248+
Assert.assertTrue(imageRenderInfo.hasMcid(5, true));
249+
Assert.assertTrue(imageRenderInfo.hasMcid(5));
250+
Assert.assertFalse(imageRenderInfo.hasMcid(1));
251+
Assert.assertEquals(5, imageRenderInfo.getMcid());
252+
}
253+
223254
private static class ColorParsingEventListener implements IEventListener {
224255
private List<IEventData> content = new ArrayList<>();
225256
private static final String pathDataExpected = "Path data expected.";
@@ -267,6 +298,32 @@ public Set<EventType> getSupportedEvents() {
267298
}
268299
}
269300

301+
private static class RecordFirstImageEventListener implements IEventListener {
302+
303+
private ImageRenderInfo imageRenderInfo = null;
304+
305+
RecordFirstImageEventListener() {
306+
}
307+
308+
public void eventOccurred(IEventData data, EventType type) {
309+
switch (type) {
310+
case RENDER_IMAGE:
311+
if (imageRenderInfo == null) {
312+
imageRenderInfo = (ImageRenderInfo) data;
313+
}
314+
break;
315+
}
316+
}
317+
318+
public Set<EventType> getSupportedEvents() {
319+
return null;
320+
}
321+
322+
public ImageRenderInfo getImageRenderInfo() {
323+
return imageRenderInfo;
324+
}
325+
}
326+
270327
private static class RecordEveryHighLevelEventListener implements IEventListener {
271328
private static final String END_EVENT_OCCURRENCE = "------------------------------------";
272329
private StringBuilder sb;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.itextpdf.kernel.pdf.canvas.parser.data;
2+
3+
import com.itextpdf.io.image.ImageDataFactory;
4+
import com.itextpdf.kernel.geom.Matrix;
5+
import com.itextpdf.kernel.pdf.PdfDictionary;
6+
import com.itextpdf.kernel.pdf.PdfName;
7+
import com.itextpdf.kernel.pdf.PdfStream;
8+
import com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState;
9+
import com.itextpdf.kernel.pdf.canvas.CanvasTag;
10+
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
11+
import com.itextpdf.test.ExtendedITextTest;
12+
import com.itextpdf.test.annotations.type.UnitTest;
13+
14+
import java.net.MalformedURLException;
15+
import org.junit.Assert;
16+
import org.junit.Test;
17+
import org.junit.experimental.categories.Category;
18+
19+
import java.util.*;
20+
21+
@Category(UnitTest.class)
22+
public class ImageRenderInfoTest extends ExtendedITextTest {
23+
private static final String SOURCE_FOLDER = "./src/test/resources/com/itextpdf/kernel/parser/data/"
24+
+ "ImageRenderInfoTest/";
25+
private final float EPS = 0.001f;
26+
27+
@Test
28+
public void checkImageRenderInfoTest() throws MalformedURLException {
29+
String source_image = SOURCE_FOLDER + "simple.tif";
30+
31+
PdfImageXObject image = new PdfImageXObject(ImageDataFactory.create(source_image));
32+
PdfStream imageStream = image.getPdfObject();
33+
Matrix matrix = new Matrix(2, 0.5f, 0, 2, 0.5f, 0);
34+
Stack<CanvasTag> tagHierarchy = new Stack<CanvasTag>();
35+
tagHierarchy.push(new CanvasTag(new PdfName("tag"), 2));
36+
ImageRenderInfo imageRenderInfo = new ImageRenderInfo(tagHierarchy, new TestGraphicsState(), matrix,
37+
imageStream, new PdfName("Im1"), new PdfDictionary(), true);
38+
39+
Assert.assertTrue(imageRenderInfo.isInline());
40+
Assert.assertEquals(image.getWidth(), imageRenderInfo.getImage().getWidth(), EPS);
41+
Assert.assertEquals("/Im1", imageRenderInfo.getImageResourceName().toString());
42+
Assert.assertEquals(new com.itextpdf.kernel.geom.Vector(0.5f, 0, 1), imageRenderInfo.getStartPoint());
43+
Assert.assertEquals(matrix, imageRenderInfo.getImageCtm());
44+
Assert.assertEquals(4, imageRenderInfo.getArea(), EPS);
45+
Assert.assertEquals(0, imageRenderInfo.getColorSpaceDictionary().size());
46+
Assert.assertEquals(1, imageRenderInfo.getCanvasTagHierarchy().size());
47+
Assert.assertTrue(imageRenderInfo.hasMcid(2, true));
48+
Assert.assertTrue(imageRenderInfo.hasMcid(2));
49+
Assert.assertFalse(imageRenderInfo.hasMcid(1));
50+
Assert.assertEquals(2, imageRenderInfo.getMcid());
51+
}
52+
53+
private class TestGraphicsState extends CanvasGraphicsState {
54+
protected TestGraphicsState() {
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)