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