Token-megőrző tartalomfolyam-AST

A HPDFContentStream korlátozott veszteségmentes szintaxismodellt biztosít a dekódolt PDF tartalomfolyamok célzott szerkesztéséhez

Elemzés vizsgálat

A HPDFParseContentStreamAST egy THPDFContentStreamAST objektumot hoz létre alapértelmezett 4 194 304 lexéma és 256 beágyazott tároló korláttal; a szigorúbb korlátokat igénylő hívók közvetlenül hívhatják a THPDFContentStreamAST.Create metódust

A THPDFContentLexemeKind megkülönbözteti a szóközöket, megjegyzéseket, számokat, neveket, literál- és hexadecimális sztringeket, logikai értékeket, nullákat, szavakat, tároló-elválasztókat, beágyazott képadatokat és hibás bájtokat; minden bemeneti bájt pontosan egy THPDFContentLexeme objektumhoz tartozik

A THPDFContentSyntaxNodeKind megkülönbözteti a gyökeret, a műveleteket, az operandusokat, a tömböket, a szótárakat, az eljárásokat, a beágyazott képeket és a hibás régiókat; minden THPDFContentSyntaxNode szülő-, első-gyermek-, utolsó-gyermek- és következő-testvér indexeket használ, így a bejárás nem foglal le gyermektömböket

Használja a GetLexeme, GetLexemeBytes, GetLexemeText és GetNode metódusokat a LexemeCount és NodeCount értékekkel; a GetOriginalBytes független forrásmásolatot ad vissza

A Valid, ErrorOffset és ErrorMessage a hibás bemenetet jelenti, miközben megtartja a bájt-pontos szerializációt, a GetStatistics pedig a THPDFContentASTStatistics értéket tölti meg forrásmérettel, számlálókkal, maximális mélységgel, beágyazott kép-számmal és hibás csomópont-számmal

Szerkesztés-átfedések

A ReplaceRange félnyitott bájteltolásokat használ, míg a ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode és InsertAfterNode a tartományokat szintaxisrekordokból származtatja

Minden THPDFContentEdit egy rendezett átfedésbe másolódik; az ütköző szerkesztések elutasításra kerülnek, a szomszédos tartományok érvényesek maradnak, az EditCount az elfogadott szerkesztéseket jelenti, a ClearEdits pedig visszaállítja a művelet nélküli kimenetet

Operátor-látogatók

A HPDFVisitContentStreamOperators referenciaszámlált látogató- és Delphi esemény-visszahívásokat rétegez erre az AST-re, csak olvasható operandusnézetet biztosít, forrás-, operátor-, lexéma-, mélység- és csere-költségvetéseket érvényesít, és a sikeres előtt újra elemzi a transzformált kimenetet

Szerializálás

A Serialize egy kimeneti bájttömböt hoz létre egy túlcsordulás-ellenőrzött méretszámítás után, míg a WriteToStream az érintetlen forrástartományokat és a csere-tartományokat közvetlenül egy hívó tulajdonában lévő TStream objektumba írja

Szerkesztések nélkül bármelyik út bájtra pontosan reprodukálja a forrást anélkül, hogy megváltoztatná a numerikus helyesírást, a sztring-átkódolásokat, a megjegyzéseket, a sorvégeket, az elválasztókat vagy a beágyazott kép-adatcsomagokat

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;