AST de fluxo de conteúdo com preservação de tokens

HPDFContentStream fornece um modelo de sintaxe sem perdas limitado para edições direcionadas em fluxos de conteúdo PDF decodificados

Analisar e inspecionar

HPDFParseContentStreamAST cria um THPDFContentStreamAST com limites padrão de 4.194.304 lexemas e 256 contêineres aninhados; chamadores que precisam de limites mais rígidos podem chamar THPDFContentStreamAST.Create diretamente

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

THPDFContentSyntaxNodeKind distingue a raiz, operações, operandos, matrizes, dicionários, procedimentos, imagens embutidas e regiões malformadas; cada THPDFContentSyntaxNode usa índices de pai, primeiro filho, último filho e próximo irmão para que a travessia não aloque matrizes de filhos

Use GetLexeme, GetLexemeBytes, GetLexemeText e GetNode com LexemeCount e NodeCount; GetOriginalBytes retorna uma cópia independente da origem

Valid, ErrorOffset e ErrorMessage relatam entrada malformada mantendo a serialização exata em bytes, e GetStatistics preenche THPDFContentASTStatistics com tamanho da origem, contagens, profundidade máxima, contagem de imagens embutidas e contagem de nós malformados

Sobreposições de edição

ReplaceRange usa deslocamentos de bytes de intervalo aberto, enquanto ReplaceLexeme, ReplaceNode, DeleteNode, InsertBeforeNode e InsertAfterNode derivam intervalos de registros de sintaxe

Cada THPDFContentEdit é copiado em uma sobreposição ordenada; edições conflitantes são rejeitadas, intervalos adjacentes permanecem válidos, EditCount relata as edições aceitas e ClearEdits restaura a saída sem operações

Visitantes de operadores

HPDFVisitContentStreamOperators sobrepõe visitantes com contagem de referências e callbacks de eventos Delphi a este AST, fornece uma visão somente leitura dos operandos, impõe orçamentos de origem, operador, lexema, profundidade e substituição, e reanalisa a saída transformada antes do sucesso

Serializar

Serialize cria uma matriz de bytes de saída após um cálculo de tamanho com verificação de estouro, enquanto WriteToStream grava intervalos de origem intocados e intervalos de substituição diretamente em um TStream de propriedade do chamador

Sem edições, qualquer um dos caminhos reproduz a origem byte a byte sem alterar a grafia numérica, escapes de string, comentários, fins de linha, delimitadores ou cargas de imagem embutida

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;