function SaveAsDeduplicated(Stream: TStream; out Report: TPdfDedupReport; AllowSignedDocument: Boolean = False): Boolean;
function SaveAsDeduplicated(const FileName: string; out Report: TPdfDedupReport; AllowSignedDocument: Boolean = False): Boolean;
PDFium 先寫出目前記憶體中文件的非增量副本,接著包裝層執行全文件的可連通性走訪,並如同 SaveAsReachable 一般捨棄每個無法連通的物件
接著對字型、影像與 form XObject 建立指紋:每個候選字典、其完整可連通子圖與原始串流承載都會被遞迴雜湊,因此只有整體內容完全相同時重複項目才會合併
每個指向被合併重複項目的交叉參考都會改寫為存留的代表,而物件編號與世代保持穩定,因此每個存留的交叉參考仍然有效
輸出是不含物件串流與交叉參考串流的單一傳統修訂版本,而重建的 trailer 會延續 /Root、/Info 與 /ID
TPdfDedupReport 回報保留與修剪的物件數量,以及各類別合併的字型、影像與 form XObject 數量,並附上來源與輸出位元組大小及結構化的失敗訊息AllowSignedDocument,因為完整重寫會使既有的簽章位元組範圍失效
Pdf.SaveAsDeduplicated('deduplicated.pdf', Report);
WriteLn('merged ', Report.MergedImageCount, ' images');