Zachowująca tokeny AST strumienia treści

HPDFContentStream dostarcza ograniczony, bezstratny model składni dla celowanych edycji zdekodowanych strumieni treści PDF

Parsowanie i inspekcja

HPDFParseContentStreamAST tworzy THPDFContentStreamAST z domyślnymi limitami 4 194 304 leksemów i 256 zagnieżdżonych kontenerów; wywołujący potrzebujący ostrzejszych limitów mogą wywołać THPDFContentStreamAST.Create bezpośrednio

THPDFContentLexemeKind rozróżnia białe znaki, komentarze, liczby, nazwy, literały łańcuchowe i szesnastkowe, wartości boolowskie, null-e, słowa, ograniczniki kontenerów, dane obrazów inline oraz źle uformowane bajty; każdy bajt wejściowy należy do dokładnie jednego THPDFContentLexeme

THPDFContentSyntaxNodeKind rozróżnia korzeń, operacje, argumenty, tablice, słowniki, procedury, obrazy inline i regiony źle uformowane; każdy THPDFContentSyntaxNode używa indeksów rodzica, pierwszego dziecka, ostatniego dziecka i następnego rodzeństwa, więc przechodzenie nie alokuje tablic dzieci

Używaj GetLexeme, GetLexemeBytes, GetLexemeText i GetNode wraz z LexemeCount i NodeCount; GetOriginalBytes zwraca niezależną kopię źródła

Valid, ErrorOffset i ErrorMessage raportują źle uformowane wejście, zachowując serializację zgodną bajt w bajt, a GetStatistics wypełnia THPDFContentASTStatistics rozmiarem źródła, licznikami, maksymalną głębokością, liczbą obrazów inline i liczbą węzłów źle uformowanych

Nakładki edycji

ReplaceRange używa półotwartych offsetów bajtów, podczas gdy ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode i InsertAfterNode wyprowadzają zakresy z rekordów składni

Każda THPDFContentEdit jest kopiowana do posortowanej nakładki; sprzeczne edycje są odrzucane, przyległe zakresy pozostają ważne, EditCount raportuje przyjęte edycje, a ClearEdits przywraca wyjście no-op

Odwiedzający operatorów

HPDFVisitContentStreamOperators nakłada na tę AST odwiedzającego z licznikiem odwołań i wywołania zwrotne zdarzeń Delphi, dostarcza widok argumentów tylko do odczytu, wymusza budżety źródła, operatorów, leksemów, głębokości i zastępowań, a przed sukcesem ponownie parsuje przekształcone wyjście

Serializacja

Serialize tworzy jedną wyjściową tablicę bajtów po obliczeniu rozmiaru z kontrolą przepełnienia, podczas gdy WriteToStream zapisuje nietkane zakresy źródła i zakresy zastąpień bezpośrednio do strumienia TStream należącego do wywołującego

Bez edycji każda z tych ścieżek odtwarza źródło bajt w bajt, nie zmieniając zapisu liczb, eskapów łańcuchów, komentarzy, końców linii, ograniczników ani ładunków obrazów inline

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;