AST de flux de contenu préservant les tokens

HPDFContentStream fournit un modèle syntaxique borné et sans perte pour des éditions ciblées des flux de contenu PDF décodés

Parsing et inspection

HPDFParseContentStreamAST crée un THPDFContentStreamAST avec des limites par défaut de 4 194 304 lexèmes et 256 conteneurs imbriqués ; les appelants qui ont besoin de limites plus serrées peuvent appeler THPDFContentStreamAST.Create directement

THPDFContentLexemeKind distingue les espaces, les commentaires, les nombres, les noms, les chaînes littérales et hexadécimales, les booléens, les nulls, les mots, les délimiteurs de conteneurs, les données d’images inline et les octets malformés ; chaque octet d’entrée appartient à exactement un THPDFContentLexeme

THPDFContentSyntaxNodeKind distingue la racine, les opérations, les opérandes, les tableaux, les dictionnaires, les procédures, les images inline et les régions malformées ; chaque THPDFContentSyntaxNode utilise des index parent, premier enfant, dernier enfant et frère suivant, si bien que la traversée n’alloue pas de tableaux d’enfants

Utilisez GetLexeme, GetLexemeBytes, GetLexemeText et GetNode avec LexemeCount et NodeCount ; GetOriginalBytes renvoie une copie indépendante de la source

Valid, ErrorOffset et ErrorMessage signalent les entrées malformées tout en conservant une sérialisation exacte à l’octet près, et GetStatistics remplit THPDFContentASTStatistics avec la taille de la source, les compteurs, la profondeur maximale, le nombre d’images inline et le nombre de nœuds malformés

Overlays d’édition

ReplaceRange utilise des offsets d’octets à bornes semi-ouvertes, tandis que ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode et InsertAfterNode dérivent les plages des records syntaxiques

Chaque THPDFContentEdit est copié dans un overlay trié ; les éditions en conflit sont rejetées, les plages adjacentes restent valides, EditCount rapporte les éditions acceptées et ClearEdits restaure une sortie sans effet

Visiteurs d’opérateurs

HPDFVisitContentStreamOperators superpose à cet AST des visiteurs à comptage de références et des callbacks d’événements Delphi, fournit une vue en lecture seule des opérandes, applique les budgets de source, d’opérateur, de lexème, de profondeur et de remplacement, et repasse le parsing de la sortie transformée avant de déclarer le succès

Sérialisation

Serialize crée un tableau d’octets de sortie après un calcul de taille avec contrôle de débordement, tandis que WriteToStream écrit directement les plages source intactes et les plages de remplacement dans un TStream appartenu à l’appelant

Sans aucune édition, chaque voie reproduit la source à l’octet près sans changer l’écriture des nombres, les échappements de chaînes, les commentaires, les fins de ligne, les délimiteurs ni les charges utiles des images 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;