AST de content streams que preserva tokens
HPDFContentStream aporta un modelo de sintaxis sin pérdida y acotado para ediciones dirigidas de content streams PDF decodificados
Parse e inspección
HPDFParseContentStreamAST crea un THPDFContentStreamAST con límites por defecto de 4,194,304 lexemes y 256 contenedores anidados; los llamadores que necesiten límites más estrictos pueden llamar a THPDFContentStreamAST.Create directamente
THPDFContentLexemeKind distingue espacios en blanco, comentarios, números, names, cadenas literales y hexadecimales, booleans, nulls, words, delimitadores de contenedores, datos de imágenes inline y bytes malformados; cada byte de entrada pertenece a exactamente un THPDFContentLexeme
THPDFContentSyntaxNodeKind distingue la raíz, las operaciones, los operandos, los arrays, los diccionarios, los procedures, las imágenes inline y las regiones malformadas; cada THPDFContentSyntaxNode usa índices de padre, primer hijo, último hijo y siguiente hermano, de modo que el traversal no aloca arrays de hijos
Use GetLexeme, GetLexemeBytes, GetLexemeText y GetNode junto con LexemeCount y NodeCount; GetOriginalBytes devuelve una copia independiente de la fuente
Valid, ErrorOffset y ErrorMessage reportan la entrada malformada mientras conservan una serialización byte a byte exacta, y GetStatistics llena THPDFContentASTStatistics con el tamaño de la fuente, los conteos, la profundidad máxima, el conteo de imágenes inline y el conteo de nodos malformados
Overlays de edición
ReplaceRange usa offsets de bytes medio abiertos, mientras que ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode y InsertAfterNode derivan los rangos de los records de sintaxis
Cada THPDFContentEdit se copia a un overlay ordenado; las ediciones en conflicto se rechazan, los rangos adyacentes siguen siendo válidos, EditCount reporta las ediciones aceptadas y ClearEdits restaura una salida sin operaciones
Visitors de operadores
HPDFVisitContentStreamOperators agrega callbacks de visitors con conteo de referencias y eventos de Delphi sobre este AST, aporta una vista de solo lectura de los operandos, aplica presupuestos de fuente, operadores, lexemes, profundidad y reemplazos, y reparsea la salida transformada antes de declarar éxito
Serialización
Serialize crea un arreglo de bytes de salida después de un cálculo de tamaño con verificación de overflow, mientras que WriteToStream escribe los spans de fuente intactos y los spans de reemplazo directamente a un TStream propiedad del llamador
Sin ediciones, cualquiera de las dos rutas reproduce la fuente byte por byte sin cambiar la grafía numérica, los escapes de cadenas, los comentarios, los fines de línea, los delimitadores ni los payloads de imágenes inline
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;