Skip to content

Write a full save's cross-reference table as one subsection - #86

Merged
bobsingor merged 1 commit into
embedpdf/mainfrom
embedpdf/fix/complete-xref
Oct 25, 2026
Merged

bobsingor merged 1 commit into
embedpdf/mainfrom
embedpdf/fix/complete-xref

Conversation

@bobsingor

Copy link
Copy Markdown
Contributor

A full save wrote a subsection per run of written objects and gave the numbers between runs no entry at all. Every engine editing session holds object numbers it may never use, so a rewrite after any edit left holes (64 per local session) under /Size. ISO 32000-1 7.5.4 says a file that was never updated has one subsection, numbered from 0, and Acrobat can't judge a later revision against a table with holes: a signature over a rewritten file read as indeterminate after any edit (HasSparseXref).

  • complete-xref: the table is one subsection from 0 through the last number written. A number no written object holds is a free entry with generation 0; entry 0 heads the free list, each entry links to the next higher one, and the last links back to 0. Object numbers never change. Update sections (incremental saves) are unchanged.
  • check_saved_pdfs.py: a full rewrite's table must be one subsection from 0 through /Size.
  • FPDFSaveEmbedderTest.SaveLinearizedDoc: 26 and 28 are free entries now (+28 bytes).

A full save wrote a subsection per run of written objects and gave the
numbers between runs no entry at all. Every engine editing session holds
object numbers it may never use, so a rewrite after any edit left holes
(64 per local session) under /Size. ISO 32000-1 7.5.4 says a file that was
never updated has one subsection, numbered from 0, and Acrobat can't judge
a later revision against a table with holes: a signature over a rewritten
file read as indeterminate after any edit (HasSparseXref).

- complete-xref: the table is one subsection from 0 through the last number
  written. A number no written object holds is a free entry with generation
  0; entry 0 heads the free list, each entry links to the next higher one,
  and the last links back to 0. Object numbers never change. Update sections
  (incremental saves) are unchanged.
- check_saved_pdfs.py: a full rewrite's table must be one subsection from 0
  through /Size.
- FPDFSaveEmbedderTest.SaveLinearizedDoc: 26 and 28 are free entries now
  (+28 bytes).
@bobsingor
bobsingor merged commit 490cbff into embedpdf/main Oct 25, 2026
1 check passed
@bobsingor
bobsingor deleted the embedpdf/fix/complete-xref branch October 25, 2026 10:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant