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;