AST content stream-a uz očuvanje tokena

HPDFContentStream obezbeđuje ograničen, bezzubitni model sintakse za ciljane izmene dekodovanih PDF content stream-ova

Parsiranje i pregled

HPDFParseContentStreamAST kreira THPDFContentStreamAST sa podrazumevanim limitima od 4.194.304 leksema i 256 ugnježdenih kontejnera; pozivaoci kojima trebaju oštriji limiti mogu direktno da pozovu THPDFContentStreamAST.Create

THPDFContentLexemeKind razlikuje beline, komentare, brojeve, imena, literalne i heksadekadske stringove, boolean-e, null vrednosti, reči, delimiter-e kontejnera, podatke inline slika i neispravne bajtove; svaki ulazni bajt pripada tačno jednom THPDFContentLexeme-u

THPDFContentSyntaxNodeKind razlikuje koren, operacije, operande, nizove, rečnike, procedure, inline slike i neispravne regione; svaki THPDFContentSyntaxNode koristi indekse roditelja, prvog deteta, poslednjeg deteta i sledećeg brata, tako da obilazak ne alocira nizove dece

Koristi GetLexeme, GetLexemeBytes, GetLexemeText i GetNode uz LexemeCount i NodeCount; GetOriginalBytes vraća nezavisnu kopiju izvora

Valid, ErrorOffset i ErrorMessage prijavljuju neispravan ulaz uz zadržavanje serijalizacije tačne do bajta, a GetStatistics popunjava THPDFContentASTStatistics veličinom izvora, brojačima, maksimalnom dubinom, brojem inline slika i brojem neispravnih čvorova

Edit overlay-i

ReplaceRange koristi poluotvorene bajt ofsete, dok ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode i InsertAfterNode izvode raspone iz sintaksnih zapisa

Svaki THPDFContentEdit kopira se u sortirani overlay; konfliktne izmene se odbacuju, susedni raspone ostaju važeći, EditCount izveštava prihvaćene izmene, a ClearEdits vraća no-op izlaz

Visitor-i operatora

HPDFVisitContentStreamOperators naslanja visitor sa brojanjem referenci i Delphi event callback-ove preko ovog AST-a, daje read-only prikaz operanada, sprovodi budžete za izvor, operatore, lekseme, dubinu i zamene, i ponovo parsira transformisani izlaz pre uspeha

Serijalizacija

Serialize kreira jedan izlazni bajt-niz nakon proračuna veličine sa proverom prekoračenja, dok WriteToStream upisuje netaknute izvorne spanove i zamenske spanove direktno u TStream u vlasništvu pozivaoca

Bez izmena, obe putanje reprodukuju izvor bajt po bajt, bez promene zapisa brojeva, string escapova, komentara, završetaka redova, delimitera ili payload-a inline slika

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;