Plugins de preflight y XML MRR

pfXML serializa las verificaciones integradas, warnings, hints, rule IDs estables, referencias de especificación y ubicaciones de objeto, página o bytes en el vocabulario versionado urn:hotpdf:preflight:mrr:1

CreatePreflightMRR agrega plugins in-process confiables para extracción de features y reglas de validación personalizadas, mientras que ValidatePDFWithPluginBundle combina esas reglas con un THPDFValidationPolicy existente

Registre un plugin acotado

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 y frontera de confianza

HotPDF valida IDs de plugin ASCII únicos y ABI version 1, ejecuta los plugins en orden estable de ID, ordena las features y los findings devueltos, omite el jitter de tiempos del reporte, escapa los valores XML y rechaza capabilities no declaradas o rule IDs inválidos

Los límites acotan el conteo de plugins, de features, de findings, los bytes agregados de strings, los bytes de salida XML, el tiempo transcurrido por plugin y el tiempo total transcurrido; un plugin rechazado aporta un finding de ejecución determinista y no consume los presupuestos compartidos de features, findings ni strings

Los plugins se ejecutan dentro del proceso del llamador y reciben el path de origen, la contraseña, el reporte de texto base, el nombre de la política, los límites y el cancellation token, así que solo debe registrarse código de plugin confiable

Los límites de tiempo transcurrido se verifican después de que un evaluador devuelva, porque un callback in-process no puede preemptarse de forma segura; los evaluadores de larga duración deberían hacer polling de Context.CancellationToken y devolver con prontitud

Consulte THotPDF.CreatePreflightMRR, THotPDF.ValidatePDFWithPluginBundle, THPDFPreflightPluginDescriptor y THPDFPreflightPluginLimits