Skip to content

Commit f7a0ca8

Browse files
Kate IvanovaiText-CI
authored andcommitted
Add new PdfStreamTest class, new PdfStructTreeRootTest#severalSameElementsInStructTreeRootTest
DEVSIX-3518
1 parent 0751f3f commit f7a0ca8

File tree

5 files changed

+121
-4
lines changed

5 files changed

+121
-4
lines changed

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfStreamTest.java

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,31 @@ This file is part of the iText (R) project.
4545
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
4646
import com.itextpdf.kernel.utils.CompareTool;
4747
import com.itextpdf.test.ExtendedITextTest;
48+
4849
import java.io.IOException;
4950
import java.nio.charset.StandardCharsets;
5051

5152
import com.itextpdf.test.annotations.type.IntegrationTest;
53+
54+
import java.util.Collections;
5255
import org.junit.Assert;
53-
import org.junit.Before;
56+
import org.junit.BeforeClass;
57+
import org.junit.Rule;
5458
import org.junit.Test;
5559
import org.junit.experimental.categories.Category;
60+
import org.junit.rules.ExpectedException;
5661

5762
@Category(IntegrationTest.class)
5863
public class PdfStreamTest extends ExtendedITextTest {
5964

6065
public static final String sourceFolder = "./src/test/resources/com/itextpdf/kernel/pdf/PdfStreamTest/";
6166
public static final String destinationFolder = "./target/test/com/itextpdf/kernel/pdf/PdfStreamTest/";
6267

63-
@Before
64-
public void before() {
68+
@Rule
69+
public ExpectedException junitExpectedException = ExpectedException.none();
70+
71+
@BeforeClass
72+
public static void before() {
6573
createOrClearDestinationFolder(destinationFolder);
6674
}
6775

@@ -108,4 +116,83 @@ public void runLengthEncodingTest01() throws IOException {
108116
Assert.assertArrayEquals(imgBytes1, cmpImgBytes1);
109117
Assert.assertArrayEquals(imgBytes2, cmpImgBytes2);
110118
}
119+
120+
@Test
121+
public void indirectRefInFilterAndNoTaggedPdfTest() throws IOException {
122+
String inFile = sourceFolder + "indirectRefInFilterAndNoTaggedPdf.pdf";
123+
String outFile = destinationFolder + "destIndirectRefInFilterAndNoTaggedPdf.pdf";
124+
125+
PdfDocument srcDoc = new PdfDocument(new PdfReader(inFile));
126+
PdfDocument outDoc = new PdfDocument(new PdfReader(inFile), new PdfWriter(outFile));
127+
outDoc.close();
128+
129+
PdfDocument doc = new PdfDocument(new PdfReader(outFile));
130+
131+
PdfStream outStreamIm1 = doc.getFirstPage().getResources().getResource(PdfName.XObject)
132+
.getAsStream(new PdfName("Im1"));
133+
PdfStream outStreamIm2 = doc.getFirstPage().getResources().getResource(PdfName.XObject)
134+
.getAsStream(new PdfName("Im2"));
135+
136+
PdfStream cmpStreamIm1 = srcDoc.getFirstPage().getResources().getResource(PdfName.XObject)
137+
.getAsStream(new PdfName("Im1"));
138+
PdfStream cmpStreamIm2 = srcDoc.getFirstPage().getResources().getResource(PdfName.XObject)
139+
.getAsStream(new PdfName("Im2"));
140+
141+
Assert.assertNull(new CompareTool().compareStreamsStructure(outStreamIm1, cmpStreamIm1));
142+
Assert.assertNull(new CompareTool().compareStreamsStructure(outStreamIm2, cmpStreamIm2));
143+
144+
srcDoc.close();
145+
outDoc.close();
146+
}
147+
148+
@Test
149+
// TODO DEVSIX-1193 remove junitExpectedException and expected NullPointerException after fix
150+
public void indirectFilterInCatalogTest() throws IOException {
151+
String inFile = sourceFolder + "indFilterInCatalog.pdf";
152+
153+
PdfDocument doc = new PdfDocument(new PdfReader(inFile),
154+
new PdfWriter(destinationFolder + "indFilterInCatalog.pdf"));
155+
156+
junitExpectedException.expect(NullPointerException.class);
157+
doc.close();
158+
}
159+
160+
@Test
161+
// TODO DEVSIX-1193 remove junitExpectedException after fix
162+
public void indirectFilterFlushedBeforeStreamTest() throws IOException {
163+
String inFile = sourceFolder + "indFilterInCatalog.pdf";
164+
String out = destinationFolder + "indirectFilterFlushedBeforeStreamTest.pdf";
165+
166+
PdfDocument pdfDoc = new PdfDocument(new PdfReader(inFile), new PdfWriter(out));
167+
168+
// Simulate the case in which filter is somehow already flushed before stream.
169+
// Either directly by user or because of any other reason.
170+
PdfObject filterObject = pdfDoc.getPdfObject(6);
171+
filterObject.flush();
172+
173+
junitExpectedException.expect(NullPointerException.class);
174+
pdfDoc.close();
175+
}
176+
177+
@Test
178+
// TODO DEVSIX-1193 remove junitExpectedException after fix
179+
public void indirectFilterMarkedToBeFlushedBeforeStreamTest() throws IOException {
180+
String inFile = sourceFolder + "indFilterInCatalog.pdf";
181+
String out = destinationFolder + "indirectFilterMarkedToBeFlushedBeforeStreamTest.pdf";
182+
183+
PdfWriter writer = new PdfWriter(out);
184+
PdfDocument pdfDoc = new PdfDocument(new PdfReader(inFile), writer);
185+
186+
// Simulate the case when indirect filter object is marked to be flushed before the stream itself.
187+
PdfObject filterObject = pdfDoc.getPdfObject(6);
188+
filterObject.getIndirectReference().setState(PdfObject.MUST_BE_FLUSHED);
189+
190+
// The image stream will be marked as MUST_BE_FLUSHED after page is flushed.
191+
pdfDoc.getFirstPage().getPdfObject().getIndirectReference().setState(PdfObject.MUST_BE_FLUSHED);
192+
193+
junitExpectedException.expect(NullPointerException.class);
194+
writer.flushWaitingObjects(Collections.<PdfIndirectReference>emptySet());
195+
196+
pdfDoc.close();
197+
}
111198
}

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfStructTreeRootTest.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,21 @@ This file is part of the iText (R) project.
4242
*/
4343
package com.itextpdf.kernel.pdf;
4444

45+
import com.itextpdf.kernel.pdf.tagging.IStructureNode;
46+
import com.itextpdf.kernel.pdf.tagging.PdfStructElem;
47+
import com.itextpdf.kernel.pdf.tagging.PdfStructTreeRoot;
4548
import com.itextpdf.test.ExtendedITextTest;
4649
import com.itextpdf.test.annotations.type.IntegrationTest;
4750

4851
import java.io.ByteArrayOutputStream;
4952
import java.io.IOException;
53+
import java.util.ArrayList;
54+
import java.util.List;
55+
import org.junit.Assert;
5056
import org.junit.BeforeClass;
57+
import org.junit.Ignore;
5158
import org.junit.Test;
5259
import org.junit.experimental.categories.Category;
53-
import static com.itextpdf.test.ITextTest.createOrClearDestinationFolder;
5460
import static org.junit.Assert.assertTrue;
5561

5662
@Category(IntegrationTest.class)
@@ -77,4 +83,28 @@ public void directStructTreeRootStampingModeTest() throws IOException {
7783
assertTrue(document.isTagged());
7884
document.close();
7985
}
86+
87+
@Test
88+
public void severalSameElementsInStructTreeRootTest() throws IOException {
89+
String inFile = sourceFolder + "severalSameElementsInStructTreeRoot.pdf";
90+
91+
PdfDocument doc = new PdfDocument(new PdfReader(inFile), new PdfWriter(new ByteArrayOutputStream()));
92+
93+
PdfStructTreeRoot structTreeRoot = doc.getStructTreeRoot();
94+
95+
List<PdfStructElem> kidsOfStructTreeRootKids = new ArrayList<>();
96+
for (IStructureNode kid : structTreeRoot.getKids()) {
97+
for (IStructureNode kidOfKid : kid.getKids()) {
98+
if (kidOfKid instanceof PdfStructElem) {
99+
kidsOfStructTreeRootKids.add((PdfStructElem) kidOfKid);
100+
}
101+
}
102+
}
103+
104+
structTreeRoot.flush();
105+
106+
for (PdfStructElem kidsOfStructTreeRootKid : kidsOfStructTreeRootKids) {
107+
Assert.assertTrue(kidsOfStructTreeRootKid.isFlushed());
108+
}
109+
}
80110
}

0 commit comments

Comments
 (0)