mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-10-27 03:27:21 -06:00
When the cross-reference chain is unusable (here: a second, truncated PDF appended after the first, so no startxref is in reach), the index is rebuilt from object headers and the trailer taken from the last `trailer` dictionary with a usable /Root. A file written with cross-reference streams has no `trailer` keyword, so the rebuild fell through to the catalog alone and /Info (and /ID, /Encrypt) were lost: Document Properties showed nothing, and a full save after editing one Info field wrote only that field and /ModDate. reconstruct() now also considers every /Type /XRef stream dictionary with a usable /Root, taking whichever trailer comes last in the file. Regression test: document::tests::reconstruction_takes_the_trailer_from_a_cross_reference_stream. Verified on the issue's fixture (openpreserve PDF-HUL-138/6.2017-0960.pdf): Creator, Producer, CreationDate and ModDate are read and kept by a full save. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011K1peyrh5MdZ6ttHkVq8Gh