Token-Preserving Content-Stream AST

HPDFContentStream poskytuje ohraničený bezztrátový syntaktický model pro cílené úpravy dekódovaných streamů obsahu PDF

Parse and inspect

HPDFParseContentStreamAST vytváří THPDFContentStreamAST s výchozími limity 4 194 304 lexémů a 256 vnořených kontejnerů; volající, kteří potřebují užší limity, mohou zavolat THPDFContentStreamAST.Create přímo

THPDFContentLexemeKind rozlišuje mezeru, komentáře, čísla, jména, literální a šestnáctkové řetězce, logické hodnoty, hodnoty null, slova, oddělovače kontejnerů, data vložených obrazů a chybné bajty; každý vstupní bajt patří přesně jednomu THPDFContentLexeme

THPDFContentSyntaxNodeKind rozlišuje kořen, operace, operandy, pole, slovníky, procedury, vložené obrazy a chybné regiony; každý THPDFContentSyntaxNode používá indexy rodiče, prvního potomka, posledního potomka a dalšího sourozence, takže procházení nealokuje pole potomků

Použijte GetLexeme, GetLexemeBytes, GetLexemeText a GetNode s LexemeCount a NodeCount; GetOriginalBytes vrací nezávislou kopii zdroje

Valid, ErrorOffset a ErrorMessage hlásí chybný vstup při zachování byte-exaktní serializace a GetStatistics plní THPDFContentASTStatistics velikostí zdroje, počty, maximální hloubkou, počtem vložených obrazů a počtem chybných uzlů

Edit overlays

ReplaceRange používá polootevřené bajtové offsety, zatímco ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode a InsertAfterNode odvozují rozsahy ze syntaktických záznamů

Každý THPDFContentEdit se zkopíruje do tříděného overlay; konfliktní úpravy se odmítnou, sousední rozsahy zůstávají platné, EditCount hlásí přijaté úpravy a ClearEdits obnovuje výstup bez operací

Operator visitors

HPDFVisitContentStreamOperators vrství reference-counted visitor a zpětná volání událostí Delphi nad tímto AST, poskytuje pohled operandů pouze pro čtení, vynucuje rozpočty zdroje, operátoru, lexému, hloubky a náhrad a před úspěchem znovu analyzuje transformovaný výstup

Serialize

Serialize vytvoří jedno pole výstupních bajtů po výpočtu velikosti s kontrolou přetečení, zatímco WriteToStream zapisuje nedotčené rozsahy zdroje a rozsahy náhrad přímo do TStream ve vlastnictví volajícího

Bez úprav obě cesty reprodukují zdroj byte po bytu bez změny pravopisu čísel, escapování řetězců, komentářů, konců řádků, oddělovačů nebo dat vložených obrazů

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;