@@ -158,7 +158,6 @@ protected internal virtual void WriteXrefTableAndTrailer(PdfDocument document, P
158158 foreach ( int ? objNr in freeReferences ) {
159159 xref [ ( int ) objNr ] . genNr ++ ;
160160 }
161- freeReferences . Clear ( ) ;
162161 for ( int i = count ; i > 0 ; -- i ) {
163162 PdfIndirectReference lastRef = xref [ i ] ;
164163 if ( lastRef == null || ( lastRef . IsFree ( ) && lastRef . GetGenNumber ( ) == 0 ) || ( ! lastRef . CheckState ( PdfObject
@@ -276,7 +275,18 @@ protected internal virtual void WriteXrefTableAndTrailer(PdfDocument document, P
276275 writer . WriteInteger ( first ) . WriteSpace ( ) . WriteInteger ( len ) . WriteByte ( ( byte ) '\n ' ) ;
277276 for ( int i = first ; i < first + len ; i ++ ) {
278277 PdfIndirectReference reference = xrefTable . Get ( i ) ;
279- StringBuilder off = new StringBuilder ( "0000000000" ) . Append ( reference . GetOffset ( ) ) ;
278+ StringBuilder off = new StringBuilder ( "0000000000" ) ;
279+ if ( reference . IsFree ( ) ) {
280+ if ( ! freeReferences . IsEmpty ( ) ) {
281+ off . Append ( freeReferences . PollFirst ( ) ) ;
282+ }
283+ }
284+ else {
285+ /* if (freeReferences.isEmpty()), then we are at the
286+ last free reference. Its referral value must be object 0.
287+ */
288+ off . Append ( reference . GetOffset ( ) ) ;
289+ }
280290 StringBuilder gen = new StringBuilder ( "00000" ) . Append ( reference . GetGenNumber ( ) ) ;
281291 writer . WriteString ( off . JSubstring ( off . Length - 10 , off . Length ) ) . WriteSpace ( ) . WriteString ( gen . JSubstring ( gen
282292 . Length - 5 , gen . Length ) ) . WriteSpace ( ) ;
@@ -307,6 +317,7 @@ protected internal virtual void WriteXrefTableAndTrailer(PdfDocument document, P
307317 writer . Write ( document . GetTrailer ( ) ) ;
308318 writer . Write ( '\n ' ) ;
309319 }
320+ freeReferences . Clear ( ) ;
310321 WriteKeyInfo ( writer ) ;
311322 writer . WriteString ( "startxref\n " ) . WriteLong ( startxref ) . WriteString ( "\n %%EOF\n " ) ;
312323 xref = null ;
0 commit comments