function SaveAsSanitised(Stream: TStream;
const Options: TPdfSanitiseOptions;
out Report: TPdfSanitiseReport): Boolean; overload;
function SaveAsSanitised(const FileName: string;
const Options: TPdfSanitiseOptions;
out Report: TPdfSanitiseReport): Boolean; overload;
SaveAsSanitised 會產生淨化的單一修訂 PDF 複本,先從文件 catalog 移除作用中內容向量,接著可選擇執行可達性修剪,從檔案主體中消除孤立物件
兩階段管線先以遞增式更新透過 StripDictionaryEntries 剝除 catalog 項目(/OpenAction、/AA、/Names、/AF、/AcroForm、/Metadata),然後執行 PruneUnreachablePdfStream,把檔案改寫為單一乾淨的傳統修訂
catalog 與 trailer 更新在一般 xref 路徑上使用稀疏 xref 查找、不超過 1 MiB 的剖析器視窗,以及 64 KiB 的範圍複製,而不會把完整儲存的 PDF 具體化成單一位元組陣列
啟用修剪時,中繼工作區是由 SaveMemoryLimit 與 SaveTemporaryDirectory 管轄的 TPdfRandomAccessStore,其尖峰記憶體與溢流狀態會計入 LastSaveLargestMemoryBuffer 與 LastSaveSpillCount
每個剝除旗標都相互獨立。TPdfSanitiseOptions.Default 啟用完整的安全性設定檔:StripOpenAction、StripCatalogActions、StripNames、StripAssociatedFiles,加上 RemoveUnreachable 修剪。StripAcroForm 與 StripMetadata 預設為 False,因為它們會移除呼叫端可能想保留的表單欄位與中繼資料
當 RemoveUnreachable=True 時,輸出永遠是沒有遞增歷程的單一修訂
Options——TPdfSanitiseOptions 記錄;標準安全性設定檔請使用 DefaultReport——接收已剝除項目數、已修剪物件數、位元組計數與任何錯誤StripNames 會移除整個 /Names 字典,包括 /JavaScript、/EmbeddedFiles、/Dests 與 /AP;為了淨化目的,這是有意的積極作法StripAssociatedFiles 會移除 catalog 層級的 /AF 項目,預設為 TrueStripMetadata 會同時移除 catalog /Metadata(XMP)與 trailer /Info/AA 與 /A 動作;只移除 catalog 層級的作用中內容TryReadTrailerInfo 防護拒絕/AcroForm 會移除簽章欄位並使既有簽章失效
var
Options: TPdfSanitiseOptions;
Report: TPdfSanitiseReport;
begin
Pdf1.FileName := 'C:\Untrusted.pdf';
Pdf1.Active := True;
Options := TPdfSanitiseOptions.Default;
Pdf1.SaveAsSanitised('C:\Sanitised.pdf', Options, Report);
end;