可编辑诊断文档与修复

SaveLoadedDocumentDiagnostic 产生确定性、未打包的输出供检查和受控文本编辑,而 RepairDiagnosticDocument 将编辑后的文件转回结构有效的 PDF

往返工作流

  1. 加载文档并调用 SaveLoadedDocumentDiagnostic
  2. 编辑对象字典或未压缩流字节,而无需手动维护 /Length、xref 行或 startxref
  3. 使用有界选项调用 RepairDiagnosticDocument
  4. 检查 THPDFDiagnosticRepairReport,仅当方法返回 True 时使用修复后的目标

修复契约

严格拒绝

对于重复对象编号、多个或缺失 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;

相关 API