预检插件与 XML MRR

pfXML 将内置检查、警告、提示、稳定规则 ID、规范引用以及对象、页面或字节位置序列化到版本化的 urn:hotpdf:preflight:mrr:1 词汇表

CreatePreflightMRR 为特征提取和自定义验证规则添加受信任的进程内插件,而 ValidatePDFWithPluginBundle 将这些规则与现有 THPDFValidationPolicy 组合

注册有界插件

function EvaluateVendorRules(
  const Context: THPDFPreflightPluginContext;
  out PluginResult: THPDFPreflightPluginResult;
  out ErrorMessage: AnsiString): Boolean;
begin
  SetLength(PluginResult.Findings, 1);
  PluginResult.Findings[0] := THPDFPreflightPluginFinding.Create(
    'vendor.metadata.required', 'Vendor metadata is present', True, ppsError);
  PluginResult.Findings[0].Scope := 'metadata';
  PluginResult.Findings[0].Path := '/Vendor';
  ErrorMessage := '';
  Result := True;
end;

Limits := THPDFPreflightPluginLimits.Default;
SetLength(Plugins, 1);
Plugins[0] := THPDFPreflightPluginDescriptor.Create(
  'vendor-policy', '1.0', [ppcValidationRules], EvaluateVendorRules);
XML := PDF.CreatePreflightMRR('Input.pdf', '', Plugins, Limits);

确定性与信任边界

HotPDF 验证唯一 ASCII 插件 ID 和 ABI 版本 1,以稳定 ID 顺序执行插件,对返回的特征和发现排序,从报告中省略时序抖动,转义 XML 值,并拒绝未声明能力或无效规则 ID

限制约束插件数、特征数、发现数、聚合字符串字节、XML 输出字节、每插件运行时间和总运行时间;被拒绝的插件贡献确定性执行发现,并且不消费共享的特征、发现或字符串预算

插件在调用方进程内运行并接收源路径、密码、基础文本报告、策略名称、限制和取消令牌,因此只应注册受信任的插件代码

运行时间限制在求值器返回后检查,因为进程内回调无法安全抢占;长时间运行的求值器应轮询 Context.CancellationToken 并及时返回

请参阅 THotPDF.CreatePreflightMRR、THotPDF.ValidatePDFWithPluginBundle、THPDFPreflightPluginDescriptor 和 THPDFPreflightPluginLimits