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 副本,先从文档目录移除活动内容载体,然后可选地运行可达性修剪,从文件主体中清除孤立对象
该两阶段管道先通过 StripDictionaryEntries 以增量更新的方式剥离目录条目(/OpenAction、/AA、/Names、/AF、/AcroForm、/Metadata),然后运行 PruneUnreachablePdfStream 将文件重写为一个干净的经典修订版本
目录和 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 移除目录级 /AF 条目,默认为 TrueStripMetadata 同时移除目录 /Metadata(XMP)和 trailer /Info/AA 和 /A 动作;只移除目录级的活动内容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;