function SaveAsReproducible(Stream: TStream; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsReproducible(const FileName: string; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
Object order is already stable (ascending object number), and the content-hash /ID derivation is deterministic, so the remaining non-determinism is the wall-clock /CreationDate and /ModDate that PDFium writes into /Info
StripDictionaryEntries removes those timestamp keys from the /Info body, and the rebuilt trailer omits the source /ID (which derives from time-stamped bytes)
Unreachable objects are also swept exactly like SaveAsReachable, and object numbers and generations stay stable
TPdfReproducibleReport reports kept and pruned object counts plus the number of stripped timestamp entriesAllowSignedDocument is explicitly enabled because a full rewrite invalidates existing signature byte ranges/ID entirely; callers that need a stable identifier can derive one from the output bytes
Pdf.SaveAsReproducible('stable.pdf', Report);
WriteLn('stripped ', Report.StrippedTimestampCount, ' timestamps');