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