/Info 字典觸達的間接物件function SaveAsReachable(Stream: TStream; out Report: TPdfPruneReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsReachable(const FileName: string; out Report: TPdfPruneReport; AllowSignedDocument: Boolean = False): Boolean;
PDFium 會先將目前的記憶體內文件寫成非增量複本,讓重寫從標準位元組開始
接著解析物件圖,從 catalog 執行全文件的可觸達性走訪,收集每個存活的間接物件,包括頁面樹、頁面資源、字型、影像、form XObject、AcroForm、結構樹、大綱、name tree、optional content、中繼資料、output intent 與關聯檔案
因增量更新、頁面合併或修復儲存而變成無法觸達的物件會被捨棄,輸出為單一 classic 修訂版本,不含 object stream 也不含 cross-reference stream
物件編號與世代編號都會保留,因此每個存活的 cross-reference 無需重新編號仍然有效;無法觸達的物件在重建的 classic cross-reference 表中成為 free 項目
重建後的 trailer 只有在被參照的物件於清理後存活時,才會繼續攜帶 /Root、/Info 與 /ID
TPdfPruneReport 會回報保留與修剪的間接物件數量、來源與輸出的位元組大小,以及結構化的失敗訊息AllowSignedDocument,因為完整重寫會使既有的簽章 byte range 失效
Pdf.SaveAsReachable('pruned.pdf', Report);
WriteLn('Kept ', Report.KeptObjectCount, ' pruned ', Report.PrunedObjectCount);