3
3
import com .itextpdf .test .ExtendedITextTest ;
4
4
import com .itextpdf .test .annotations .type .IntegrationTest ;
5
5
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 ;
6
10
import org .junit .BeforeClass ;
7
11
import org .junit .Test ;
8
12
import org .junit .experimental .categories .Category ;
@@ -17,4 +21,215 @@ public static void beforeClass() {
17
21
createOrClearDestinationFolder (destinationFolder );
18
22
}
19
23
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 = "\n xref" ;
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
+ }
20
235
}
0 commit comments