Token-Preserving Content-Stream AST

HPDFContentStream disponibiliza um modelo sintático sem perdas e com limites, para edições dirigidas a streams de conteúdo PDF descodificados

Parse and inspect

HPDFParseContentStreamAST cria um THPDFContentStreamAST com limites predefinidos de 4 194 304 lexemas e 256 contentores aninhados; quem precisar de limites mais apertados pode chamar diretamente THPDFContentStreamAST.Create

THPDFContentLexemeKind distingue espaços em branco, comentários, números, nomes, strings literais e hexadecimais, booleanos, nulos, palavras, delimitadores de contentores, dados de imagens inline e bytes malformados; cada byte de entrada pertence exatamente a um THPDFContentLexeme

THPDFContentSyntaxNodeKind distingue a raiz, operações, operandos, arrays, dicionários, procedimentos, imagens inline e regiões malformadas; cada THPDFContentSyntaxNode usa índices de pai, primeiro filho, último filho e irmão seguinte, pelo que a travessia não aloca arrays de filhos

Use GetLexeme, GetLexemeBytes, GetLexemeText, and GetNode com LexemeCount e NodeCount; GetOriginalBytes returns an independent source copy

Valid, ErrorOffset e ErrorMessage assinalam entrada malformada, mantendo a serialização byte a byte idêntica, e GetStatistics preenche THPDFContentASTStatistics com o tamanho da origem, contagens, profundidade máxima, número de imagens inline e número de nós malformados

Edit overlays

ReplaceRange uses half-open byte offsets, while ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode, and InsertAfterNode derive ranges from syntax records

Cada THPDFContentEdit é copiado para uma sobreposição ordenada; as edições em conflito são rejeitadas, os intervalos adjacentes continuam válidos, EditCount indica as edições aceites e ClearEdits repõe uma saída sem alterações

Operator visitors

HPDFVisitContentStreamOperators acrescenta sobre esta AST visitors com contagem de referências e callbacks de eventos Delphi, fornece uma vista só de leitura dos operandos, impõe orçamentos para origem, operadores, lexemas, profundidade e substituições, e volta a analisar a saída transformada antes de devolver sucesso

Serialize

Serialize cria um único array de bytes de saída após um cálculo de tamanho com verificação de overflow, enquanto WriteToStream escreve os intervalos de origem intactos e os intervalos de substituição diretamente num TStream fornecido pelo chamador

Sem edições, qualquer um dos caminhos reproduz a origem byte a byte, sem alterar a grafia dos números, os escapes das strings, os comentários, as quebras de linha, os delimitadores nem o conteúdo das imagens 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;