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;