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 值會改變;所有存活的交互參照無需重新編號即維持有效
輸出是單一傳統修訂版,重建的 trailer 會向前攜帶 /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');