Preflight-Plugins und XML-MRR

pfXML serialisiert integrierte Prüfungen, Warnungen, Hinweise, stabile Regel-IDs, Spezifikationsreferenzen und Objekt-, Seiten- oder Bytepositionen in das versionierte Vokabular urn:hotpdf:preflight:mrr:1

CreatePreflightMRR fügt vertrauenswürdige In-Process-Plugins zur Merkmalsextraktion und für benutzerdefinierte Validierungsregeln hinzu, während ValidatePDFWithPluginBundle diese Regeln mit einer vorhandenen THPDFValidationPolicy kombiniert

Ein begrenztes Plugin registrieren

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

Determinismus und Vertrauensgrenze

HotPDF validiert eindeutige ASCII-Plugin-IDs und ABI-Version 1, führt Plugins in stabiler ID-Reihenfolge aus, sortiert zurückgegebene Merkmale und Befunde, lässt Timing-Jitter aus dem Bericht weg, maskiert XML-Werte und weist nicht deklarierte Fähigkeiten oder ungültige Regel-IDs zurück

Grenzwerte begrenzen Pluginanzahl, Merkmalsanzahl, Befundanzahl, aggregierte Zeichenfolgenbytes, XML-Ausgabebytes, Laufzeit je Plugin und Gesamtlaufzeit; ein zurückgewiesenes Plugin trägt einen deterministischen Ausführungsbefund bei und verbraucht kein gemeinsames Budget für Merkmale, Befunde oder Zeichenfolgen

Plugins laufen im Prozess des Aufrufers und erhalten Quellpfad, Passwort, Basis-Textbericht, Richtlinienname, Grenzwerte und Abbruchtoken, daher sollte nur vertrauenswürdiger Plugin-Code registriert werden

Abgelaufene Grenzwerte werden erst geprüft, nachdem ein Evaluator zurückkehrt, weil ein In-Process-Callback nicht sicher unterbrochen werden kann; lang laufende Evaluatoren sollten Context.CancellationToken abfragen und zügig zurückkehren

Siehe THotPDF.CreatePreflightMRR, THotPDF.ValidatePDFWithPluginBundle, THPDFPreflightPluginDescriptor und THPDFPreflightPluginLimits