Skip to content

Commit 593e233

Browse files
author
Andrei Stryhelski
committed
Add a test when the image is in the figure tag
DEVSIX-6986
1 parent 6a70083 commit 593e233

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed

src/test/java/com/itextpdf/html2pdf/element/FigureTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ This file is part of the iText (R) project.
2323
package com.itextpdf.html2pdf.element;
2424

2525
import com.itextpdf.html2pdf.HtmlConverter;
26+
import com.itextpdf.html2pdf.utils.ImageSizeMeasuringListener;
27+
import com.itextpdf.kernel.pdf.PdfDocument;
28+
import com.itextpdf.kernel.pdf.PdfName;
29+
import com.itextpdf.kernel.pdf.PdfReader;
30+
import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor;
31+
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
2632
import com.itextpdf.kernel.utils.CompareTool;
2733
import com.itextpdf.test.ExtendedITextTest;
2834
import com.itextpdf.test.annotations.type.IntegrationTest;
@@ -61,4 +67,23 @@ public void figureInSpanTest() throws IOException, InterruptedException {
6167
HtmlConverter.convertToPdf(new File(sourceFolder + "figureInSpan.html"), new File(destinationFolder + "figureInSpan.pdf"));
6268
Assert.assertNull(new CompareTool().compareByContent(destinationFolder + "figureInSpan.pdf", sourceFolder + "cmp_figureInSpan.pdf", destinationFolder, "diff04_"));
6369
}
70+
71+
@Test
72+
//TODO DEVSIX-6985: change 1 to 2 in "PdfImageXObject image = doc.getPage(1).getResources()", change the assert
73+
// from "Assert.assertTrue(isImageCropped)" to assertFalse
74+
public void checkImageRemainsUncutWithFigureTagTest() throws IOException {
75+
File pdfFile = new File(destinationFolder + "imageInFigure.pdf");
76+
HtmlConverter.convertToPdf(new File(sourceFolder + "imageInFigure.html"),
77+
pdfFile);
78+
try (PdfDocument doc = new PdfDocument(new PdfReader(pdfFile))) {
79+
PdfImageXObject image = doc.getPage(1).getResources()
80+
.getImage(new PdfName("Im1"));
81+
Assert.assertNotNull(image);
82+
ImageSizeMeasuringListener listener = new ImageSizeMeasuringListener(1);
83+
PdfCanvasProcessor processor = new PdfCanvasProcessor(listener);
84+
processor.processPageContent(doc.getPage(1));
85+
boolean isImageCropped = listener.bbox.getY() < 0;
86+
Assert.assertTrue(isImageCropped);
87+
}
88+
}
6489
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.itextpdf.html2pdf.utils;
2+
3+
import com.itextpdf.kernel.geom.AffineTransform;
4+
import com.itextpdf.kernel.geom.Matrix;
5+
import com.itextpdf.kernel.geom.NoninvertibleTransformException;
6+
import com.itextpdf.kernel.geom.Point;
7+
import com.itextpdf.kernel.geom.Rectangle;
8+
import com.itextpdf.kernel.pdf.canvas.parser.EventType;
9+
import com.itextpdf.kernel.pdf.canvas.parser.data.IEventData;
10+
import com.itextpdf.kernel.pdf.canvas.parser.data.ImageRenderInfo;
11+
import com.itextpdf.kernel.pdf.canvas.parser.listener.IEventListener;
12+
13+
import java.util.Arrays;
14+
import java.util.Collections;
15+
import java.util.List;
16+
import java.util.Set;
17+
18+
public class ImageSizeMeasuringListener implements IEventListener {
19+
20+
Rectangle cropbox;
21+
public Rectangle bbox;
22+
int page;
23+
24+
public ImageSizeMeasuringListener(int page) {
25+
26+
if (cropbox == null) {
27+
cropbox = new Rectangle(Float.MIN_VALUE, Float.MIN_VALUE, Float.MAX_VALUE, Float.MAX_VALUE);
28+
}
29+
this.page = page;
30+
}
31+
32+
public void eventOccurred(IEventData data, EventType type) {
33+
switch (type) {
34+
case RENDER_IMAGE:
35+
ImageRenderInfo renderInfo = (ImageRenderInfo) data;
36+
final Matrix imageCtm = renderInfo.getImageCtm();
37+
bbox = calcImageRect(imageCtm);
38+
default:
39+
break;
40+
}
41+
}
42+
43+
public Set<EventType> getSupportedEvents() {
44+
return null;
45+
}
46+
47+
private double getWidth(Matrix m) {
48+
return Math.sqrt(Math.pow(m.get(Matrix.I11), 2) + Math.pow(m.get(Matrix.I21), 2));
49+
}
50+
51+
private double getHeight(Matrix m) {
52+
return Math.sqrt(Math.pow(m.get(Matrix.I12), 2) + Math.pow(m.get(Matrix.I22), 2));
53+
}
54+
55+
private Rectangle calcImageRect(Matrix ctm) {
56+
if (ctm == null) {
57+
return null;
58+
}
59+
60+
Point[] points = transformPoints(ctm, false,
61+
new Point(0, 0), new Point(0, 1),
62+
new Point(1, 0), new Point(1, 1));
63+
64+
return getAsRectangle(points[0], points[1], points[2], points[3]);
65+
}
66+
67+
private Rectangle getAsRectangle(Point p1, Point p2, Point p3, Point p4) {
68+
List<Double> xs = Arrays.asList(p1.getX(), p2.getX(), p3.getX(), p4.getX());
69+
List<Double> ys = Arrays.asList(p1.getY(), p2.getY(), p3.getY(), p4.getY());
70+
71+
double left = Collections.min(xs);
72+
double bottom = Collections.min(ys);
73+
double right = Collections.max(xs);
74+
double top = Collections.max(ys);
75+
76+
return new Rectangle((float) left, (float) bottom, (float) right, (float) top);
77+
}
78+
79+
private Point[] transformPoints(Matrix transformationMatrix, boolean inverse, Point... points) {
80+
AffineTransform t = new AffineTransform(transformationMatrix.get(Matrix.I11),
81+
transformationMatrix.get(Matrix.I12),
82+
transformationMatrix.get(Matrix.I21), transformationMatrix.get(Matrix.I22),
83+
transformationMatrix.get(Matrix.I31), transformationMatrix.get(Matrix.I32));
84+
Point[] transformed = new Point[points.length];
85+
86+
if (inverse) {
87+
try {
88+
t = t.createInverse();
89+
} catch (NoninvertibleTransformException e) {
90+
throw new RuntimeException("Exception during effective image rectangle calculation", e);
91+
}
92+
}
93+
94+
t.transform(points, 0, transformed, 0, points.length);
95+
96+
return transformed;
97+
}
98+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<html>
2+
<head>
3+
</head>
4+
<body>
5+
<p>In this test, the picture in figure is checked. The picture should not be cropped</p>
6+
<div style="margin-top: 900;"></div>
7+
<figure>
8+
<img src="imageInFigure.jpg" style="height:300.0pt;width:468pt" />
9+
</figure>
10+
</body>
11+
</html>
12+
13+
7.82 KB
Loading

0 commit comments

Comments
 (0)