FlateDecode с максимальным сжатием, заменяя поток только тогда, когда измеренная экономия байтов превышает порог вызывающего кодаfunction SaveAsFlateRecompressed(Stream: TStream; const Options: TPdfFlateRecompressOptions; out Report: TPdfFlateRecompressReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsFlateRecompressed(const FileName: string; const Options: TPdfFlateRecompressOptions; out Report: TPdfFlateRecompressReport; AllowSignedDocument: Boolean = False): Boolean;
PDFium сначала записывает неинкрементальную копию текущего документа в памяти, затем обёртка выполняет обход достижимости по всему документу в точности как SaveAsReachable
Каждый достижимый поток FlateDecode декодируется с помощью PdfInflate и перекодируется с помощью DeflateCompress с максимальным сжатием; заменяются только потоки, измеренная экономия которых превышает одновременно MinSavingBytes и MinSavingRatio
Номера объектов и поколения остаются стабильными, поэтому меняются только перекодированные данные потоков и их прямые значения /Length; каждая выжившая перекрёстная ссылка остаётся действительной без перенумерации
Результат - одна классическая ревизия, в которой перестроенный трейлер переносит /Root, /Info и /ID
TPdfFlateRecompressOptions.MinSavingBytes и MinSavingRatio предотвращают перекодирование потоков, которые не дадут достаточной экономии, оставляя уже оптимальные потоки нетронутымиTPdfFlateRecompressReport сообщает количества перекодированных, пропущенных и неудавшихся потоков, а также суммарные байтовые размеры потоков до и после перекодирования/Length и потоки, которые не удаётся декодировать, пропускаются или помечаются как неудавшиеся без повреждения документаAllowSignedDocument, поскольку полная перезапись аннулирует существующие байтовые диапазоны подписей
Options.MinSavingBytes:= 64;
Options.MinSavingRatio:= 0.1;
Pdf.SaveAsFlateRecompressed('recompressed.pdf', Options, Report);
WriteLn('recompressed ', Report.RecompressedCount, ' streams');