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;