Author: lehmi
Date: Tue Apr 14 05:54:10 2026
New Revision: 1933041

Log:
PDFBOX-6176: fix the calculation of the highest object number as proposed by 
Daniel Persson

Modified:
   pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java    
    Tue Apr 14 04:20:06 2026        (r1933040)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java    
    Tue Apr 14 05:54:10 2026        (r1933041)
@@ -744,13 +744,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);
         }
     }
 

Reply via email to