Skip to content

Commit a3e57f2

Browse files
author
Benoit Lagae
committed
Make Free Refs in xref refer to next Free Ref
DEVSIX-1428
1 parent 31e6078 commit a3e57f2

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

kernel/src/main/java/com/itextpdf/kernel/pdf/PdfXrefTable.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,6 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
172172
for (Integer objNr : freeReferences) {
173173
xref[(int) objNr].genNr++;
174174
}
175-
freeReferences.clear();
176-
177175

178176
for (int i = count; i > 0; --i) {
179177
PdfIndirectReference lastRef = xref[i];
@@ -288,7 +286,17 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
288286
for (int i = first; i < first + len; i++) {
289287
PdfIndirectReference reference = xrefTable.get(i);
290288

291-
StringBuilder off = new StringBuilder("0000000000").append(reference.getOffset());
289+
StringBuilder off = new StringBuilder("0000000000");
290+
if (reference.isFree()) {
291+
if (!freeReferences.isEmpty()) {
292+
off.append(freeReferences.pollFirst());
293+
}
294+
/* if (freeReferences.isEmpty()), then we are at the
295+
last free reference. Its referral value must be object 0.
296+
*/
297+
} else {
298+
off.append(reference.getOffset());
299+
}
292300
StringBuilder gen = new StringBuilder("00000").append(reference.getGenNumber());
293301
writer.writeString(off.substring(off.length() - 10, off.length())).writeSpace().
294302
writeString(gen.substring(gen.length() - 5, gen.length())).writeSpace();
@@ -317,6 +325,7 @@ protected void writeXrefTableAndTrailer(PdfDocument document, PdfObject fileId,
317325
writer.write(document.getTrailer());
318326
writer.write('\n');
319327
}
328+
freeReferences.clear();
320329
writeKeyInfo(writer);
321330
writer.writeString("startxref\n").
322331
writeLong(startxref).

0 commit comments

Comments
 (0)