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