@@ -160,7 +160,7 @@ protected void setCapacity(int capacity) {
160
160
/**
161
161
* Writes cross reference table and trailer to PDF.
162
162
*
163
- * @throws java.io. IOException
163
+ * @throws IOException
164
164
* @throws PdfException
165
165
*/
166
166
protected void writeXrefTableAndTrailer (PdfDocument document , PdfObject fileId , PdfObject crypto ) throws IOException {
@@ -177,6 +177,19 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
177
177
}
178
178
freeReferences .clear ();
179
179
180
+
181
+ for (int i = count ; i > 0 ; --i ) {
182
+ PdfIndirectReference lastRef = xref [i ];
183
+ if (lastRef == null
184
+ || (lastRef .isFree () && lastRef .getGenNumber () == 0 )
185
+ || (!lastRef .checkState (PdfObject .FLUSHED )
186
+ && !(document .properties .appendMode && !lastRef .checkState (PdfObject .MODIFIED )))) {
187
+ --count ;
188
+ } else {
189
+ break ;
190
+ }
191
+ }
192
+
180
193
List <Integer > sections = new ArrayList <>();
181
194
int first = 0 ;
182
195
int len = 1 ;
@@ -218,7 +231,6 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
218
231
return ;
219
232
}
220
233
221
- int size = sections .get (sections .size () - 2 ) + sections .get (sections .size () - 1 );
222
234
long startxref = writer .getCurrentPos ();
223
235
if (writer .isFullCompression ()) {
224
236
PdfStream xrefStream = new PdfStream ().makeIndirect (document );
@@ -227,7 +239,7 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
227
239
xrefStream .put (PdfName .ID , fileId );
228
240
if (crypto != null )
229
241
xrefStream .put (PdfName .Encrypt , crypto );
230
- xrefStream .put (PdfName .Size , new PdfNumber (size ));
242
+ xrefStream .put (PdfName .Size , new PdfNumber (this . size () ));
231
243
xrefStream .put (PdfName .W , new PdfArray (new ArrayList <PdfObject >() {{
232
244
add (new PdfNumber (1 ));
233
245
add (new PdfNumber (4 ));
@@ -295,7 +307,7 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
295
307
trailer .remove (PdfName .Index );
296
308
trailer .remove (PdfName .Type );
297
309
trailer .remove (PdfName .Length );
298
- trailer .put (PdfName .Size , new PdfNumber (size ));
310
+ trailer .put (PdfName .Size , new PdfNumber (this . size () ));
299
311
trailer .put (PdfName .ID , fileId );
300
312
if (crypto != null )
301
313
trailer .put (PdfName .Encrypt , crypto );
0 commit comments