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;