Token-Preserving Content-Stream AST

HPDFContentStream proporciona un modelo de sintaxis sin pérdidas y acotado para ediciones específicas de flujos de contenido PDF decodificados

Analizar e inspeccionar

HPDFParseContentStreamAST crea un THPDFContentStreamAST con límites predeterminados de 4,194,304 lexemas y 256 contenedores anidados; los llamadores que necesitan límites más estrictos pueden llamar a THPDFContentStreamAST.Create directamente

THPDFContentLexemeKind distingue espacios en blanco, comentarios, números, nombres, cadenas literales y hexadecimales, booleanos, nulos, palabras, delimitadores de contenedor, datos de imagen en línea y bytes malformados; cada byte de entrada pertenece exactamente a un THPDFContentLexeme

THPDFContentSyntaxNodeKind distingue la raíz, las operaciones, los operandos, las matrices, los diccionarios, los procedimientos, las imágenes en línea y las regiones malformadas; cada THPDFContentSyntaxNode usa índices de padre, primer hijo, último hijo y siguiente hermano para que el recorrido no asigne matrices de hijos

Usa GetLexeme, GetLexemeBytes, GetLexemeText y GetNode con LexemeCount y NodeCount; GetOriginalBytes devuelve una copia independiente del origen

Valid, ErrorOffset y ErrorMessage informan de la entrada malformada conservando la serialización exacta por bytes, y GetStatistics rellena THPDFContentASTStatistics con el tamaño del origen, los recuentos, la profundidad máxima, el recuento de imágenes en línea y el recuento de nodos malformados

Superposiciones de edición

ReplaceRange usa desplazamientos de bytes medio abiertos, mientras que ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode e InsertAfterNode derivan los rangos de los registros de sintaxis

Cada THPDFContentEdit se copia en una superposición ordenada; las ediciones en conflicto se rechazan, los rangos adyacentes permanecen válidos, EditCount informa de las ediciones aceptadas y ClearEdits restaura la salida sin operación

Visitantes de operadores

HPDFVisitContentStreamOperators superpone devoluciones de llamada de visitante con recuento de referencias y de eventos Delphi sobre este AST, proporciona una vista de operandos de solo lectura, aplica presupuestos de origen, operador, lexema, profundidad y reemplazo, y vuelve a analizar la salida transformada antes de tener éxito

Serializar

Serialize crea una matriz de bytes de salida después de un cálculo de tamaño con comprobación de desbordamiento, mientras que WriteToStream escribe los tramos de origen sin tocar y los tramos de reemplazo directamente en un TStream propiedad del llamador

Sin ediciones, cualquiera de las dos rutas reproduce el origen byte a byte sin cambiar la ortografía numérica, los escapes de cadena, los comentarios, los finales de línea, los delimitadores ni las cargas útiles de imagen en línea

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;