Skip to content

Commit 939dd70

Browse files
ar3emiText-CI
authored andcommitted
Separate tiff images testing
DEVSIX-3021
1 parent aa329ab commit 939dd70

File tree

4 files changed

+138
-5
lines changed

4 files changed

+138
-5
lines changed

io/src/main/java/com/itextpdf/io/codec/TIFFField.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ public double[] getAsDoubles() {
293293
return (double[])data;
294294
}
295295

296+
/**
297+
* Returns TIFF_ASCII data as an array of strings.
298+
*
299+
* <p> A ClassCastException will be thrown if the field is not
300+
* of type TIFF_ASCII.
301+
*/
302+
public String[] getAsStrings() {
303+
return (String[]) data;
304+
}
305+
296306
/**
297307
* Returns TIFF_SRATIONAL data as an array of 2-element arrays of ints.
298308
*

io/src/test/java/com/itextpdf/io/image/TiffTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ This file is part of the iText (R) project.
4343
package com.itextpdf.io.image;
4444

4545
import java.io.IOException;
46+
import java.nio.file.Files;
47+
import java.nio.file.Paths;
4648

49+
import com.itextpdf.io.codec.TIFFDirectory;
50+
import com.itextpdf.io.source.RandomAccessFileOrArray;
51+
import com.itextpdf.io.source.RandomAccessSourceFactory;
4752
import com.itextpdf.test.annotations.type.UnitTest;
4853
import org.junit.Assert;
4954
import org.junit.Test;
@@ -101,4 +106,12 @@ public void openTiff6() throws IOException {
101106
Assert.assertEquals(1456, img.getHeight(), 0);
102107
Assert.assertEquals(8, img.getBpc());
103108
}
109+
110+
@Test
111+
public void getStringDataFromTiff() throws IOException {
112+
byte[] bytes = Files.readAllBytes(Paths.get(sourceFolder, "img_cmyk.tif"));
113+
TIFFDirectory dir = new TIFFDirectory(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(bytes)), 0);
114+
String[] stringArray = new String[] {"iText? 7.1.7-SNAPSHOT ?2000-2019 iText Group NV (AGPL-version)\u0000"};
115+
Assert.assertArrayEquals(stringArray, dir.getField(305).getAsStrings());
116+
}
104117
}
Binary file not shown.

kernel/src/test/java/com/itextpdf/kernel/pdf/xobject/GetImageBytesTest.java

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ This file is part of the iText (R) project.
4242
*/
4343
package com.itextpdf.kernel.pdf.xobject;
4444

45+
import com.itextpdf.io.codec.TIFFConstants;
46+
import com.itextpdf.io.codec.TIFFDirectory;
47+
import com.itextpdf.io.codec.TIFFField;
48+
import com.itextpdf.io.source.RandomAccessFileOrArray;
49+
import com.itextpdf.io.source.RandomAccessSourceFactory;
50+
import com.itextpdf.kernel.Version;
4551
import com.itextpdf.kernel.pdf.PdfDictionary;
4652
import com.itextpdf.kernel.pdf.PdfDocument;
4753
import com.itextpdf.kernel.pdf.PdfIndirectReference;
@@ -52,11 +58,15 @@ This file is part of the iText (R) project.
5258
import com.itextpdf.kernel.pdf.PdfStream;
5359
import com.itextpdf.test.ExtendedITextTest;
5460
import com.itextpdf.test.annotations.type.IntegrationTest;
61+
62+
import java.io.IOException;
63+
import java.nio.charset.StandardCharsets;
5564
import java.nio.file.Files;
5665
import java.nio.file.Paths;
66+
import java.util.Arrays;
67+
5768
import org.junit.Assert;
5869
import org.junit.BeforeClass;
59-
import org.junit.Ignore;
6070
import org.junit.Test;
6171
import org.junit.experimental.categories.Category;
6272

@@ -106,13 +116,11 @@ public void testjbig2Filters() throws Exception {
106116
}
107117

108118
@Test
109-
@Ignore("Ignored during the latest release. Please unignore after DEVSIX-3021")
110-
public void testFlateCmyk() throws Exception {
119+
public void testFlateCmyk() throws Exception {
111120
testFile("img_cmyk.pdf", "Im1", "tif");
112121
}
113122

114123
@Test
115-
@Ignore("Ignored during the latest release. Please unignore after DEVSIX-3021")
116124
public void testFlateCmykIcc() throws Exception {
117125
testFile("img_cmyk_icc.pdf", "Im1", "tif");
118126
}
@@ -149,11 +157,113 @@ private void testFile(String filename, String objectid, String expectedImageForm
149157
PdfImageXObject img = new PdfImageXObject((PdfStream) (obj.isIndirectReference() ? ((PdfIndirectReference) obj).getRefersTo() : obj));
150158
Assert.assertEquals(expectedImageFormat, img.identifyImageFileExtension());
151159

160+
152161
byte[] result = img.getImageBytes(true);
153162
byte[] cmpBytes = Files.readAllBytes(Paths.get(sourceFolder, filename.substring(0, filename.length() - 4) + "." + expectedImageFormat));
154-
Assert.assertArrayEquals(cmpBytes, result);
163+
164+
if (img.identifyImageFileExtension().equals("tif")) {
165+
compareTiffImages(cmpBytes, result);
166+
} else {
167+
Assert.assertArrayEquals(cmpBytes, result);
168+
}
155169
} finally {
156170
pdfDocument.close();
157171
}
158172
}
173+
174+
private void compareTiffImages(byte[] cmpBytes, byte[] resultBytes) throws IOException {
175+
int cmpNumDirectories = TIFFDirectory.getNumDirectories(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(cmpBytes)));
176+
int resultNumDirectories = TIFFDirectory.getNumDirectories(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(resultBytes)));
177+
178+
Assert.assertEquals(cmpNumDirectories, resultNumDirectories);
179+
180+
for (int dirNum = 0; dirNum < cmpNumDirectories; ++dirNum) {
181+
TIFFDirectory cmpDir = new TIFFDirectory(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(cmpBytes)), dirNum);
182+
TIFFDirectory resultDir = new TIFFDirectory(new RandomAccessFileOrArray(new RandomAccessSourceFactory().createSource(resultBytes)), dirNum);
183+
184+
Assert.assertEquals(cmpDir.getNumEntries(), resultDir.getNumEntries());
185+
Assert.assertEquals(cmpDir.getIFDOffset(), resultDir.getIFDOffset());
186+
Assert.assertEquals(cmpDir.getNextIFDOffset(), resultDir.getNextIFDOffset());
187+
Assert.assertArrayEquals(cmpDir.getTags(), resultDir.getTags());
188+
189+
for (int tag : cmpDir.getTags()) {
190+
Assert.assertEquals(cmpDir.isTagPresent(tag), resultDir.isTagPresent(tag));
191+
192+
TIFFField cmpField = cmpDir.getField(tag);
193+
TIFFField resultField = resultDir.getField(tag);
194+
195+
if (tag == TIFFConstants.TIFFTAG_SOFTWARE) {
196+
compareSoftwareVersion(cmpField, resultField);
197+
} else {
198+
compareFields(cmpField, resultField);
199+
}
200+
}
201+
202+
compareImageData(cmpDir, resultDir, cmpBytes, resultBytes);
203+
}
204+
}
205+
206+
private void compareSoftwareVersion(TIFFField cmpField, TIFFField resultField) {
207+
byte[] versionBytes = resultField.getAsString(0).getBytes(StandardCharsets.US_ASCII);
208+
byte[] versionToCompare = subArray(versionBytes, 0, versionBytes.length - 2); //drop last always zero byte
209+
210+
Assert.assertArrayEquals(Version.getInstance().getVersion().getBytes(StandardCharsets.US_ASCII), versionToCompare);
211+
}
212+
213+
private void compareFields(TIFFField cmpField, TIFFField resultField) {
214+
if (cmpField.getType() == TIFFField.TIFF_LONG) {
215+
Assert.assertArrayEquals(cmpField.getAsLongs(), resultField.getAsLongs());
216+
} else if (cmpField.getType() == TIFFField.TIFF_BYTE) {
217+
Assert.assertArrayEquals(cmpField.getAsBytes(), resultField.getAsBytes());
218+
} else if (cmpField.getType() == TIFFField.TIFF_SBYTE) {
219+
Assert.assertArrayEquals(cmpField.getAsBytes(), resultField.getAsBytes());
220+
} else if (cmpField.getType() == TIFFField.TIFF_SHORT) {
221+
Assert.assertArrayEquals(cmpField.getAsChars(), resultField.getAsChars());
222+
} else if (cmpField.getType() == TIFFField.TIFF_SLONG) {
223+
Assert.assertArrayEquals(cmpField.getAsInts(), resultField.getAsInts());
224+
} else if (cmpField.getType() == TIFFField.TIFF_SSHORT) {
225+
Assert.assertArrayEquals(cmpField.getAsChars(), resultField.getAsChars());
226+
} else if (cmpField.getType() == TIFFField.TIFF_UNDEFINED) {
227+
Assert.assertArrayEquals(cmpField.getAsBytes(), resultField.getAsBytes());
228+
} else if (cmpField.getType() == TIFFField.TIFF_DOUBLE) {
229+
Assert.assertArrayEquals(cmpField.getAsDoubles(), resultField.getAsDoubles(), 0);
230+
} else if (cmpField.getType() == TIFFField.TIFF_FLOAT) {
231+
Assert.assertArrayEquals(cmpField.getAsFloats(), resultField.getAsFloats(), 0);
232+
} else if (cmpField.getType() == TIFFField.TIFF_RATIONAL) {
233+
Assert.assertArrayEquals(cmpField.getAsRationals(), resultField.getAsRationals());
234+
} else if (cmpField.getType() == TIFFField.TIFF_SRATIONAL) {
235+
Assert.assertArrayEquals(cmpField.getAsSRationals(), resultField.getAsSRationals());
236+
} else if (cmpField.getType() == TIFFField.TIFF_ASCII) {
237+
Assert.assertArrayEquals(cmpField.getAsStrings(), resultField.getAsStrings());
238+
} else {
239+
Assert.assertArrayEquals(cmpField.getAsBytes(), resultField.getAsBytes());
240+
}
241+
}
242+
243+
private void compareImageData(TIFFDirectory cmpDir, TIFFDirectory resultDir, byte[] cmpBytes, byte[] resultBytes) {
244+
Assert.assertTrue(cmpDir.isTagPresent(TIFFConstants.TIFFTAG_STRIPOFFSETS));
245+
Assert.assertTrue(cmpDir.isTagPresent(TIFFConstants.TIFFTAG_STRIPBYTECOUNTS));
246+
Assert.assertTrue(resultDir.isTagPresent(TIFFConstants.TIFFTAG_STRIPOFFSETS));
247+
Assert.assertTrue(resultDir.isTagPresent(TIFFConstants.TIFFTAG_STRIPBYTECOUNTS));
248+
249+
long[] cmpImageOffsets = cmpDir.getField(TIFFConstants.TIFFTAG_STRIPOFFSETS).getAsLongs();
250+
long[] cmpStripByteCountsArray = cmpDir.getField(TIFFConstants.TIFFTAG_STRIPOFFSETS).getAsLongs();
251+
long[] resultImageOffsets = resultDir.getField(TIFFConstants.TIFFTAG_STRIPOFFSETS).getAsLongs();
252+
long[] resultStripByteCountsArray = resultDir.getField(TIFFConstants.TIFFTAG_STRIPOFFSETS).getAsLongs();
253+
254+
Assert.assertEquals(cmpImageOffsets.length, resultImageOffsets.length);
255+
Assert.assertEquals(cmpStripByteCountsArray.length, resultStripByteCountsArray.length);
256+
257+
for (int i = 0; i < cmpImageOffsets.length; ++i) {
258+
int cmpOffset = (int) cmpImageOffsets[i], cmpCounts = (int) cmpStripByteCountsArray[i];
259+
int resultOffset = (int) resultImageOffsets[i], resultCounts = (int) resultStripByteCountsArray[i];
260+
261+
Assert.assertArrayEquals(subArray(cmpBytes, cmpOffset, (cmpOffset + cmpCounts - 1)),
262+
subArray(resultBytes, resultOffset, (resultOffset + resultCounts - 1)));
263+
}
264+
}
265+
266+
private byte[] subArray(byte[] array, int beg, int end) {
267+
return Arrays.copyOfRange(array, beg, end + 1);
268+
}
159269
}

0 commit comments

Comments
 (0)