function SaveAsDeduplicated(Stream: TStream; out Report: TPdfDedupReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsDeduplicated(const FileName: string; out Report: TPdfDedupReport; AllowSignedDocument: Boolean = False): Boolean;
PDFium сначала записывает неинкрементальную копию текущего документа в памяти, затем обёртка выполняет обход достижимости по всему документу и отбрасывает каждый недостижимый объект в точности как SaveAsReachable
Затем для шрифтов, изображений и форм XObjects вычисляются отпечатки: словарь-кандидат, его полный достижимый подграф и его необработанные данные потока хешируются рекурсивно, поэтому дубликаты объединяются только при полностью идентичном содержимом
Каждая перекрёстная ссылка, указывавшая на удалённый при слиянии дубликат, переписывается на выжившего представителя, а номера объектов и поколения остаются стабильными, поэтому каждая выжившая перекрёстная ссылка остаётся действительной
Результат - одна классическая ревизия без объектных потоков и без потока перекрёстных ссылок, а перестроенный трейлер переносит /Root, /Info и /ID
TPdfDedupReport сообщает количества сохранённых и удалённых объектов, а также объединённые по категориям количества шрифтов, изображений и форм XObjects, включая байтовые размеры источника и результата и структурированное сообщение о сбоеAllowSignedDocument, поскольку полная перезапись аннулирует существующие байтовые диапазоны подписей
Pdf.SaveAsDeduplicated('deduplicated.pdf', Report);
WriteLn('merged ', Report.MergedImageCount, ' images');