Author: lehmi
Date: Tue Apr 14 05:57:06 2026
New Revision: 1933042
Log:
PDFBOX-6176: fix the calculation of the highest object number as proposed by
Daniel Persson
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
Modified:
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
==============================================================================
---
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
Tue Apr 14 05:54:10 2026 (r1933041)
+++
pdfbox/branches/3.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
Tue Apr 14 05:57:06 2026 (r1933042)
@@ -745,13 +745,18 @@ public class COSWriter implements ICOSVi
trailer.removeItem(COSName.PREV);
}
pdfxRefStream.addTrailerInfo(trailer);
- // the size is the highest object number+1. we add one more
- // for the xref stream object we are going to write
- pdfxRefStream.setSize(number + 2);
+ // Pre-assign the object key for the xref stream so it can be
+ // included in its own cross-reference data. Per PDF Reference
+ // ยง7.5.8, the /Size value must be one greater than the highest
+ // object number in the file, including the xref stream itself.
+ COSObjectKey xrefStreamKey = new COSObjectKey(++number, 0);
+ long xrefStreamOffset = getStandardOutput().getPos();
+ setStartxref(xrefStreamOffset);
+ pdfxRefStream.addEntry(new NormalXReference(xrefStreamOffset,
xrefStreamKey, null));
+ pdfxRefStream.setSize(number + 1);
- setStartxref(getStandardOutput().getPos());
- COSStream stream2 = pdfxRefStream.getStream();
- doWriteObject(stream2);
+ COSStream xrefStream = pdfxRefStream.getStream();
+ doWriteObject(xrefStreamKey, xrefStream);
}
}