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');