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 一样丢弃每个不可达对象
然后对字体、图像和表单 XObject 进行指纹识别:每个候选字典、其完整可达子图及其原始流负载都被递归哈希,因此仅当内容完全相同时重复项才会合并
每个指向被合并掉的重复项的交叉引用都会被重写到存活代表上,对象号和代次保持稳定,因此每个存活的交叉引用仍然有效
输出是单个经典修订,无对象流和交叉引用流,重建的 trailer 将 /Root、/Info 和 /ID 向前携带
TPdfDedupReport 报告保留和裁剪的对象数,以及按类别合并的字体、图像和表单 XObject 数,并附带源和输出字节大小和结构化失败消息AllowSignedDocument,否则拒绝签名文档,因为完整重写会使现有签名字节范围失效
Pdf.SaveAsDeduplicated('deduplicated.pdf', Report);
WriteLn('merged ', Report.MergedImageCount, ' images');