Token-erhaltender Content-Stream-AST
HPDFContentStream stellt ein begrenztes verlustfreies Syntaxmodell für gezielte Änderungen an dekodierten PDF-Content-Streams bereit
Parsen und Inspizieren
HPDFParseContentStreamAST erzeugt einen THPDFContentStreamAST mit Default-Limits von 4.194.304 Lexemen und 256 verschachtelten Containern; Aufrufer, die engere Limits brauchen, rufen THPDFContentStreamAST.Create direkt auf
THPDFContentLexemeKind unterscheidet Whitespace, Kommentare, Zahlen, Namen, Literal- und Hexadezimal-Strings, Booleans, Nulls, Wörter, Container-Delimiter, Inline-Image-Daten und fehlerhafte Bytes; jedes Eingabebyte gehört zu genau einem THPDFContentLexeme
THPDFContentSyntaxNodeKind unterscheidet Wurzel, Operationen, Operanden, Arrays, Dictionaries, Procedures, Inline-Images und fehlerhafte Regionen; jeder THPDFContentSyntaxNode verwendet Parent-, First-Child-, Last-Child- und Next-Sibling-Indizes, sodass die Traversierung keine Child-Arrays alloziert
Verwenden Sie GetLexeme, GetLexemeBytes, GetLexemeText und GetNode gemeinsam mit LexemeCount und NodeCount; GetOriginalBytes liefert eine unabhängige Kopie der Quelle
Valid, ErrorOffset und ErrorMessage melden fehlerhafte Eingaben und bewahren zugleich die byte-exakte Serialisierung, und GetStatistics füllt THPDFContentASTStatistics mit Quellgröße, Zählern, maximaler Tiefe, Inline-Image-Anzahl und der Anzahl fehlerhafter Knoten
Edit-Overlays
ReplaceRange arbeitet mit halboffenen Byte-Offsets, während ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode und InsertAfterNode die Bereiche aus Syntax-Records ableiten
Jedes THPDFContentEdit wird in ein sortiertes Overlay kopiert; konfligierende Edits werden verworfen, angrenzende Bereiche bleiben gültig, EditCount meldet die akzeptierten Edits, und ClearEdits stellt die No-Op-Ausgabe wieder her
Operator-Visitors
HPDFVisitContentStreamOperators legt referenzzählte Visitor- und Delphi-Event-Callbacks über diesen AST, stellt eine Read-only-Sicht auf die Operanden bereit, erzwingt Budgets für Quelle, Operatoren, Lexeme, Tiefe und Replacements und parst die transformierte Ausgabe erneut, bevor der Erfolg gemeldet wird
Serialisierung
Serialize erzeugt nach einer überlaufgeprüften Größenberechnung ein einziges Ausgabe-Byte-Array, während WriteToStream unberührte Quell-Spans und Replacement-Spans direkt in einen vom Aufrufer gehaltenen TStream schreibt
Ohne Edits reproduziert jeder der beiden Wege die Quelle byte für byte, ohne numerische Schreibweise, String-Escapes, Kommentare, Zeilenenden, Delimiter oder Inline-Image-Payloads zu verändern
var
AST: THPDFContentStreamAST;
Output: TBytes;
begin
AST:= HPDFParseContentStreamAST(ContentBytes);
try
if AST.Valid and AST.ReplaceRange(StartOfs, EndOfs, ReplacementBytes) then
AST.Serialize(Output);
finally
AST.Free;
end;
end;