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;