Skip to content

Commit a9e8695

Browse files
Implement tests for special cases of free references handling
1 parent 2d9b063 commit a9e8695

File tree

4 files changed

+215
-0
lines changed

4 files changed

+215
-0
lines changed

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

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.itextpdf.test.ExtendedITextTest;
44
import com.itextpdf.test.annotations.type.IntegrationTest;
55
import java.io.IOException;
6+
import java.nio.charset.StandardCharsets;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
import org.junit.Assert;
610
import org.junit.BeforeClass;
711
import org.junit.Test;
812
import org.junit.experimental.categories.Category;
@@ -17,4 +21,215 @@ public static void beforeClass() {
1721
createOrClearDestinationFolder(destinationFolder);
1822
}
1923

24+
@Test
25+
public void freeReferencesTest01() throws IOException {
26+
String src = "freeRefsGapsAndMaxGen.pdf";
27+
String out = "freeReferencesTest01.pdf";
28+
29+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out));
30+
pdfDocument.close();
31+
32+
String[] xrefString = extractXrefTableAsStrings(out);
33+
String[] expected = new String[] {
34+
"xref\n" +
35+
"0 4\n" +
36+
"0000000000 65535 f \n" +
37+
"0000000269 00000 n \n" +
38+
"0000000561 00000 n \n" +
39+
"0000000314 00000 n \n" +
40+
"12 3\n" +
41+
"0000000133 00000 n \n" + // TODO first xref shall have no subsections
42+
"0000000015 00000 n \n" +
43+
"0000000613 00000 n \n" };
44+
Assert.assertArrayEquals(expected, xrefString);
45+
}
46+
47+
@Test
48+
public void freeReferencesTest02() throws IOException {
49+
String src = "freeRefsGapsAndMaxGen.pdf";
50+
String out = "freeReferencesTest02.pdf";
51+
52+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out),
53+
new StampingProperties().useAppendMode());
54+
pdfDocument.close();
55+
56+
String[] xrefString = extractXrefTableAsStrings(out);
57+
String[] expected = new String[] {
58+
"xref\n" +
59+
"0 5\n" +
60+
"0000000010 65535 f \n" +
61+
"0000000269 00000 n \n" +
62+
"0000000569 00000 n \n" +
63+
"0000000314 00000 n \n" +
64+
"0000000000 65535 f \n" +
65+
"10 5\n" +
66+
"0000000011 00000 f \n" + // Append mode, no possibility to fix subsections in first xref
67+
"0000000000 00001 f \n" +
68+
"0000000133 00000 n \n" +
69+
"0000000015 00000 n \n" +
70+
"0000000480 00000 n \n",
71+
72+
"xref\n" +
73+
"3 1\n" +
74+
"0000000995 00000 n \n"};
75+
Assert.assertArrayEquals(expected, xrefString);
76+
}
77+
78+
@Test
79+
public void freeReferencesTest03() throws IOException {
80+
String src = "freeRefsDeletedObj.pdf";
81+
String out = "freeReferencesTest03.pdf";
82+
83+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out),
84+
new StampingProperties().useAppendMode());
85+
pdfDocument.addNewPage();
86+
pdfDocument.close();
87+
88+
String[] xrefString = extractXrefTableAsStrings(out);
89+
String[] expected = new String[] {
90+
"xref\n" +
91+
"0 7\n" +
92+
"0000000000 65535 f \n" +
93+
"0000000265 00000 n \n" +
94+
"0000000564 00000 n \n" +
95+
"0000000310 00000 n \n" +
96+
"0000000132 00000 n \n" +
97+
"0000000015 00001 n \n" +
98+
"0000000476 00000 n \n",
99+
100+
"xref\n" +
101+
"0 1\n" +
102+
"0000000005 65535 n \n" +
103+
"3 3\n" +
104+
"0000000923 00000 n \n" +
105+
"0000001170 00000 n \n" +
106+
"0000000000 00002 f \n" +
107+
"7 1\n" +
108+
"0000001303 00000 n \n",
109+
110+
"xref\n" +
111+
"1 3\n" +
112+
"0000001706 00000 n \n" +
113+
"0000001998 00000 n \n" +
114+
"0000001751 00000 n \n" +
115+
"5 1\n" +
116+
"0000002055 00002 n \n" + // TODO fifth object is no longer free, however zero obj not updated
117+
"8 1\n" +
118+
"0000002156 00000 n \n"};
119+
Assert.assertArrayEquals(expected, xrefString);
120+
}
121+
122+
@Test
123+
public void freeReferencesTest04() throws IOException {
124+
String src = "simpleDoc.pdf";
125+
String out = "freeReferencesTest04.pdf";
126+
127+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out));
128+
PdfObject contentsObj = pdfDocument.getPage(1).getPdfObject().remove(PdfName.Contents);
129+
Assert.assertTrue(contentsObj instanceof PdfIndirectReference);
130+
131+
PdfIndirectReference contentsRef = (PdfIndirectReference) contentsObj;
132+
contentsRef.setFree();
133+
PdfObject freedContentsRefRefersTo = contentsRef.getRefersTo();
134+
Assert.assertNull(freedContentsRefRefersTo);
135+
pdfDocument.close();
136+
137+
}
138+
139+
@Test
140+
public void freeReferencesTest05() throws IOException {
141+
String src = "simpleDocWithSubsections.pdf";
142+
String out = "freeReferencesTest05.pdf";
143+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out));
144+
pdfDocument.close();
145+
146+
String[] xrefString = extractXrefTableAsStrings(out);
147+
String[] expected = new String[] {
148+
"xref\n" +
149+
"0 4\n" +
150+
"0000000000 65535 f \n" +
151+
"0000000269 00000 n \n" +
152+
"0000000561 00000 n \n" +
153+
"0000000314 00000 n \n" +
154+
"11 3\n" +
155+
"0000000133 00000 n \n" + // TODO first xref shall have no subsections
156+
"0000000015 00000 n \n" +
157+
"0000000613 00000 n \n"
158+
};
159+
Assert.assertArrayEquals(expected, xrefString);
160+
161+
}
162+
163+
@Test
164+
public void freeReferencesTest06() throws IOException {
165+
String src = "simpleDocWithSubsections.pdf";
166+
String out = "freeReferencesTest06.pdf";
167+
PdfDocument pdfDocument = new PdfDocument(new PdfReader(sourceFolder + src), new PdfWriter(destinationFolder + out),
168+
new StampingProperties().useAppendMode());
169+
pdfDocument.close();
170+
171+
String[] xrefString = extractXrefTableAsStrings(out);
172+
String[] expected = new String[] {
173+
"xref\n" +
174+
"0 4\n" +
175+
"0000000000 65535 f \n" +
176+
"0000000269 00000 n \n" +
177+
"0000000569 00000 n \n" +
178+
"0000000314 00000 n \n" +
179+
"11 3\n" +
180+
"0000000133 00000 n \n" + // Append mode, no possibility to fix subsections in first xref
181+
"0000000015 00000 n \n" +
182+
"0000000480 00000 n \n",
183+
184+
"xref\n" +
185+
"3 1\n" +
186+
"0000000935 00000 n \n"
187+
};
188+
Assert.assertArrayEquals(expected, xrefString);
189+
}
190+
191+
@Test
192+
public void freeReferencesTest07() throws IOException {
193+
String out = "freeReferencesTest07.pdf";
194+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(destinationFolder + out));
195+
196+
pdfDocument.createNextIndirectReference();
197+
198+
pdfDocument.addNewPage();
199+
pdfDocument.close();
200+
201+
String[] xrefString = extractXrefTableAsStrings(out);
202+
String[] expected = new String[] {
203+
"xref\n" +
204+
"0 4\n" +
205+
"0000000000 65535 f \n" +
206+
"0000000203 00000 n \n" +
207+
"0000000414 00000 n \n" +
208+
"0000000248 00000 n \n" +
209+
"5 2\n" +
210+
"0000000088 00000 n \n" + // TODO first xref shall have no subsections
211+
"0000000015 00000 n \n"
212+
};
213+
Assert.assertArrayEquals(expected, xrefString);
214+
}
215+
216+
private String[] extractXrefTableAsStrings(String out) throws IOException {
217+
byte[] outPdfBytes = readFile(destinationFolder + out);
218+
String outPdfContent = new String(outPdfBytes, StandardCharsets.US_ASCII);
219+
String xrefStr = "\nxref";
220+
String trailerStr = "trailer";
221+
int xrefInd = outPdfContent.indexOf(xrefStr);
222+
int trailerInd = outPdfContent.indexOf(trailerStr);
223+
int lastXrefInd = outPdfContent.lastIndexOf(xrefStr);
224+
List<String> xrefs = new ArrayList<>();
225+
while (true) {
226+
xrefs.add(outPdfContent.substring(xrefInd + 1, trailerInd));
227+
if (xrefInd == lastXrefInd) {
228+
break;
229+
}
230+
xrefInd = outPdfContent.indexOf(xrefStr, xrefInd + 1);
231+
trailerInd = outPdfContent.indexOf(trailerStr, trailerInd + 1);
232+
}
233+
return xrefs.toArray(new String[xrefs.size()]);
234+
}
20235
}

0 commit comments

Comments
 (0)