AST dei Content Stream con Token Preservati
HPDFContentStream fornisce un modello sintattico lossless con limiti per modifiche mirate ai content stream PDF decodificati
Parsing e ispezione
HPDFParseContentStreamAST crea una THPDFContentStreamAST con limiti default di 4.194.304 lexeme e 256 contenitori annidati; i chiamanti che servono limiti più stretti possono chiamare direttamente THPDFContentStreamAST.Create
THPDFContentLexemeKind distingue whitespace, commenti, numeri, nomi, stringhe letterali ed esadecimali, booleani, null, parole, delimitatori di contenitore, dati inline-image e byte malformati; ogni byte di input appartiene a esattamente un THPDFContentLexeme
THPDFContentSyntaxNodeKind distingue root, operazioni, operandi, array, dizionari, procedure, inline image e regioni malformate; ogni THPDFContentSyntaxNode usa indici parent, first-child, last-child e next-sibling, così l'attraversamento non alloca array di figli
Usa GetLexeme, GetLexemeBytes, GetLexemeText e GetNode insieme a LexemeCount e NodeCount; GetOriginalBytes restituisce una copia indipendente del sorgente
Valid, ErrorOffset e ErrorMessage segnalano gli input malformati mantenendo una serializzazione identica byte per byte, mentre GetStatistics compila THPDFContentASTStatistics con dimensione del sorgente, conteggi, profondità massima, numero di inline image e numero di nodi malformati
Overlay di modifica
ReplaceRange usa offset in byte a intervallo semiaperto, mentre ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode e InsertAfterNode ricavano gli intervalli dai record di sintassi
Ogni THPDFContentEdit viene copiato in un overlay ordinato; le modifiche in conflitto vengono rifiutate, gli intervalli adiacenti restano validi, EditCount riporta le modifiche accettate e ClearEdits ripristina un output senza alcuna modifica
Visitor degli operatori
HPDFVisitContentStreamOperators aggiunge callback visitor reference-counted ed event Delphi sopra questo AST, offre una vista read-only degli operandi, applica budget su sorgente, operatori, lexeme, profondità e sostituzioni, e riparsa l'output trasformato prima di dichiarare successo
Serializzazione
Serialize crea un unico array di byte di output dopo un calcolo della dimensione con controllo di overflow, mentre WriteToStream scrive span intatti della sorgente e span di sostituzione direttamente su uno TStream di proprietà del chiamante
Senza modifiche, entrambi i percorsi riproducono la sorgente byte per byte senza cambiare spelling numerico, escape delle stringhe, commenti, fine riga, delimitatori o payload delle inline-image
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;