Besucher für Inhaltsoperatoren
HotPDF stellt jede Operation in einem dekodierten Inhalts-Stream über eine referenzgezählte Besucher-Schnittstelle und einen Delphi-Ereignis-Callback bereit, ohne dass Aufrufer einen PDF-Tokenizer schreiben müssen
Untersuchen und messen
THPDFContentOperatorEventData kennzeichnet die Phasen Beginn des Streams, Operator und Ende des Streams und meldet Operationsindex, Operatorname, Operandenzahl, Bytebereich sowie den deterministischen Zustand vor Ausführung des aktuellen Quelloperators
Der Zustand enthält die Tiefen von Grafikzustand, Textobjekt, markiertem Inhalt und Kompatibilitätsabschnitt, während THPDFContentOperatorView bei Bedarf schreibgeschützte Operations- oder Operandenbytes bereitstellt, ohne den gesamten Quellstream zu kopieren
Transformieren oder ablehnen
Callbacks wählen coaKeep, coaDelete, coaReplace, coaStop oder coaReject
Lösch- und Ersetzungsaktionen werden zu sortierten, nicht überlappenden AST-Änderungen; eine Ablehnung veröffentlicht keine Ausgabe und coaStop wird nach dem aktuellen Operator erfolgreich abgeschlossen
Zustandsschnappschüsse folgen auch bei Ersetzung einer Operation der ursprünglichen Quelliteration, wodurch wiederholte Untersuchungen deterministisch bleiben
Budgets und Validierung
THPDFContentOperatorVisitOptions.Default konfiguriert MaxSourceBytes, MaxOperators, MaxLexemes, MaxDepth, MaxReplacementBytes und ValidateOutput
Der Abbruch wird während der Iteration geprüft, und transformierte Ausgabe wird unter denselben Lexem-, Tiefen- und Operatorgrenzen erneut analysiert, bevor sie zurückgegeben oder auf eine geladene Seite geschrieben werden darf
Fehlerhafte Eingabe, ungültige Ersetzungsausgabe, Callback-Ausnahmen, Grenzverletzungen und explizite Ablehnung werden durch THPDFContentOperatorVisitStatus und eine Diagnose unterschieden
Registrierung geladener Seiten
PDF.ContentOperatorVisitor := Visitor;
PDF.OnContentOperator := HandleContentOperator;
Options := THPDFContentOperatorVisitOptions.Default;
if PDF.VisitLoadedPageContentOperators(0, True, Options,
CancellationToken, Statistics) then
UseStatistics(Statistics);
Der Schnittstellenbesucher läuft vor dem Ereignis-Callback, wenn beide zugewiesen sind, und beide werden synchron auf dem aufrufenden Thread ausgeführt
Mit ApplyChanges=True validiert HotPDF zuerst den vollständigen transformierten Stream, ersetzt dann den Seiteninhalt in einer Graphmutation und verwirft die Caches für kompilierte Display-Listen, Raster, Festplatte, Fontdecoder und Vorschaubilder