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;