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;