function SaveAsReproducible(Stream: TStream; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsReproducible(const FileName: string; out Report: TPdfReproducibleReport; AllowSignedDocument: Boolean = False): Boolean;
A ordem dos objetos já é estável (número de objeto ascendente) e a derivação do /ID por hash de conteúdo é determinística, pelo que o não determinismo restante está no /CreationDate e no /ModDate de relógio de parede que o PDFium escreve no /Info
StripDictionaryEntries remove essas chaves de carimbo temporal do corpo do /Info e o trailer reconstruído omite o /ID de origem (que deriva de bytes com carimbo temporal)
Os objetos inalcançáveis também são varridos exatamente como em SaveAsReachable, e os números e gerações de objeto mantêm-se estáveis
TPdfReproducibleReport reporta as contagens de objetos mantidos e podados, além do número de entradas de carimbo temporal removidasAllowSignedDocument for ativado explicitamente, porque uma reescrita completa invalida os intervalos de bytes das assinaturas existentes/ID por completo; os chamadores que precisem de um identificador estável podem derivá-lo dos bytes de saída
Pdf.SaveAsReproducible('stable.pdf', Report);
WriteLn('stripped ', Report.StrippedTimestampCount, ' timestamps');