function SaveAsReproducible(Stream: TStream; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsReproducible(const FileName: string; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
Порядок объектов уже стабилен (по возрастанию номера объекта), а вычисление /ID из хеша содержимого детерминировано, поэтому оставшаяся недетерминированность - это /CreationDate и /ModDate от реальных часов, которые PDFium записывает в /Info
StripDictionaryEntries удаляет эти ключи меток времени из тела /Info, а перестроенный трейлер опускает исходный /ID (который вычисляется из байтов с метками времени)
Недостижимые объекты также выметаются в точности как SaveAsReachable, а номера объектов и поколения остаются стабильными
TPdfReproducibleReport сообщает количества сохранённых и удалённых объектов, а также количество удалённых записей меток времениAllowSignedDocument, поскольку полная перезапись аннулирует существующие байтовые диапазоны подписей/ID; вызывающий код, которому нужен стабильный идентификатор, может вычислить его из байтов результата
Pdf.SaveAsReproducible('stable.pdf', Report);
WriteLn('stripped ', Report.StrippedTimestampCount, ' timestamps');