FlateDecode przy maksymalnej kompresji, zastępując strumień tylko wtedy, gdy zmierzona oszczędność bajtów przekracza próg podany przez wywołującegofunction 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 najpierw zapisuje nieprzyrostową kopię bieżącego dokumentu w pamięci, a następnie otoczka wykonuje pełne przejście osiągalności po dokumencie dokładnie tak jak SaveAsReachable
Każdy osiągalny strumień FlateDecode jest dekodowany funkcją PdfInflate i ponownie kodowany funkcją DeflateCompress przy maksymalnej kompresji; zastępowane są tylko strumienie, których zmierzona oszczędność przekracza zarówno MinSavingBytes, jak i MinSavingRatio
Numery obiektów i generacje pozostają stabilne, więc zmieniają się tylko ponownie skompresowane ładunki strumieni i ich bezpośrednie wartości /Length; każde zachowane odwołanie krzyżowe pozostaje ważne bez przenumerowania
Wynikiem jest pojedyncza klasyczna rewizja, a przebudowany trailer przenosi dalej /Root, /Info i /ID
TPdfFlateRecompressOptions.MinSavingBytes i MinSavingRatio zapobiegają ponownemu kodowaniu strumieni, które nie dałyby wystarczającej oszczędności, pozostawiając nietknięte strumienie już zoptymalizowaneTPdfFlateRecompressReport raportuje liczby strumieni ponownie skompresowanych, pominiętych i niepomyślnych oraz sumy bajtów strumieni pierwotnych i ponownie skompresowanych/Length pośrednie oraz strumienie, których nie da się zdekodować, są pomijane lub oznaczane jako niepomyślne bez uszkadzania dokumentuAllowSignedDocument zostało jawnie włączone, ponieważ pełne przepisanie unieważnia istniejące zakresy bajtowe podpisów
Options.MinSavingBytes:= 64;
Options.MinSavingRatio:= 0.1;
Pdf.SaveAsFlateRecompressed('recompressed.pdf', Options, Report);
WriteLn('recompressed ', Report.RecompressedCount, ' streams');