Plugin di Preflight e MRR XML
pfXML serializza i controlli incorporati, gli avvisi, i suggerimenti, gli ID di regola stabili, i riferimenti alle specifiche e le posizioni a livello di oggetto, pagina o byte nel vocabolario versionato urn:hotpdf:preflight:mrr:1
CreatePreflightMRR aggiunge plugin in-process attendibili per l'estrazione di feature e per regole di validazione personalizzate, mentre ValidatePDFWithPluginBundle combina tali regole con un THPDFValidationPolicy esistente
Registrare un plugin limitato
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 confine di fiducia
HotPDF valida gli ID dei plugin ASCII unici e l'ABI versione 1, esegue i plugin in ordine stabile di ID, ordina le feature e i risultati restituiti, omette dal report il jitter dei tempi, fa l'escape dei valori XML e rifiuta capacità non dichiarate o ID di regola non validi
I limiti vincolano numero di plugin, numero di feature, numero di risultati, byte aggregati di stringhe, byte dell'output XML, tempo trascorso per plugin e tempo totale trascorso; un plugin rifiutato contribuisce con un risultato di esecuzione deterministico e non consuma i budget condivisi di feature, risultati o stringhe
I plugin girano dentro il processo del chiamante e ricevono il percorso della sorgente, la password, il report di testo base, il nome della politica, i limiti e il cancellation token, quindi dovrebbero essere registrati solo plugin fidati
I limiti di tempo vengono controllati dopo che un evaluator restituisce, perché una callback in-process non può essere preemptata in sicurezza; gli evaluator long-running dovrebbero interrogare Context.CancellationToken e restituire prontamente
Vedere THotPDF.CreatePreflightMRR, THotPDF.ValidatePDFWithPluginBundle, THPDFPreflightPluginDescriptor e THPDFPreflightPluginLimits