可编辑诊断文档与修复
SaveLoadedDocumentDiagnostic 产生确定性、未打包的输出供检查和受控文本编辑,而 RepairDiagnosticDocument 将编辑后的文件转回结构有效的 PDF
往返工作流
- 加载文档并调用
SaveLoadedDocumentDiagnostic - 编辑对象字典或未压缩流字节,而无需手动维护
/Length、xref 行或startxref - 使用有界选项调用
RepairDiagnosticDocument - 检查
THPDFDiagnosticRepairReport,仅当方法返回True时使用修复后的目标
修复契约
- 源必须以 PDF 头开始并携带 HotPDF 发出的
%QDF-1.0标记 - 验证后的间接对象按物理顺序复制,而不重新编码字符串、字典或流负载
- 直接、间接、缺失和过期的流
/Length值替换为测量的负载长度 - 经典 xref 表、规范 trailer 和精确
startxref偏移从测量的输出位置重建 - trailer 保留有效的
/Info、/ID和/Encrypt值,并将/Root绑定到单个验证后的 Catalog - 目标通过同级临时文件写入,并且仅在所有检查成功后替换请求的路径
严格拒绝
对于重复对象编号、多个或缺失 Catalog 对象、损坏的 trailer 引用、对象之间的非注释字节、无效对象语法、对象或输入限制、超过十位数字的经典 xref 偏移以及严格重新加载验证失败,修复会失败关闭
验证对象内的标记会被跳过,因此字符串和编码流负载中的类对象文本不会成为 xref 条目
有界性能
扫描器读取带短进位的 1 MiB 窗口,直接在文件流之间复制对象范围,并仅保留验证后的对象元数据加上有界字典探测
MaxInputBytes、MaxObjectCount 和 MaxObjectNumber 在输出发布前限制扫描、保留元数据和发出的 xref 行
Pascal 示例
var
Options: THPDFDiagnosticRepairOptions;
Report: THPDFDiagnosticRepairReport;
begin
Options := THPDFDiagnosticRepairOptions.Default;
Options.MaxInputBytes := Int64(16) * 1024 * 1024 * 1024;
if not THotPDF.RepairDiagnosticDocument(
'edited-diagnostic.pdf',
'repaired.pdf',
Options,
Report
) then
raise Exception.Create(string(Report.Diagnostic));
end;