Plugins de preflight e MRR XML

pfXML serializa verificações integradas, avisos, dicas, IDs de regra estáveis, referências de especificação e locais de objeto, página ou byte no vocabulário versionado urn:hotpdf:preflight:mrr:1

CreatePreflightMRR adiciona plugins confiáveis em processo para extração de recursos e regras de validação personalizadas, enquanto ValidatePDFWithPluginBundle combina essas regras com uma THPDFValidationPolicy existente

Registrar um plugin limitado

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);

Determinismo e limite de confiança

O HotPDF valida IDs de plugin ASCII exclusivos e versão de ABI 1, executa plugins em ordem estável de ID, classifica recursos e conclusões retornados, omite jitter de tempo do relatório, escapa valores XML e rejeita capacidades não declaradas ou IDs de regra inválidos

Os limites restringem a contagem de plugins, a contagem de recursos, a contagem de conclusões, os bytes agregados de strings, os bytes de saída XML, o tempo decorrido por plugin e o tempo decorrido total; um plugin rejeitado contribui com uma conclusão de execução determinística e não consome orçamentos compartilhados de recursos, conclusões ou strings

Os plugins são executados dentro do processo do chamador e recebem o caminho de origem, a senha, o relatório de texto base, o nome da política, os limites e o token de cancelamento, portanto apenas código de plugin confiável deve ser registrado

Os limites de tempo decorrido são verificados depois que um avaliador retorna, pois um callback em processo não pode ser interrompido com segurança; avaliadores de longa duração devem consultar Context.CancellationToken e retornar prontamente

Veja THotPDF.CreatePreflightMRR, THotPDF.ValidatePDFWithPluginBundle, THPDFPreflightPluginDescriptor e THPDFPreflightPluginLimits