保留标记的内容流 AST

HPDFContentStream 为对解码的 PDF 内容流进行针对性编辑提供有界的无损语法模型

解析与检查

HPDFParseContentStreamAST 创建 THPDFContentStreamAST,默认限制为 4,194,304 个词素和 256 个嵌套容器;需要更严格限制的调用方可以直接调用 THPDFContentStreamAST.Create

THPDFContentLexemeKind 区分空白、注释、数字、名称、字面量和十六进制字符串、布尔、空、单词、容器分隔符、内联图像数据和格式错误的字节;每个输入字节恰好属于一个 THPDFContentLexeme

THPDFContentSyntaxNodeKind 区分根、操作、操作数、数组、字典、过程、内联图像和格式错误区域;每个 THPDFContentSyntaxNode 使用父、首子、末子和下一兄弟索引,因此遍历不分配子数组

使用 GetLexeme、GetLexemeBytes、GetLexemeText 和 GetNode 配合 LexemeCount 和 NodeCount;GetOriginalBytes 返回独立的源拷贝

Valid、ErrorOffset 和 ErrorMessage 报告格式错误的输入,同时保留逐字节精确的序列化,GetStatistics 用源大小、计数、最大深度、内联图像数和格式错误节点数填充 THPDFContentASTStatistics

编辑覆盖层

ReplaceRange 使用半开字节偏移,而 ReplaceLexeme、ReplaceNode、DeleteNode、InsertBeforeNode 和 InsertAfterNode 从语法记录派生范围

每个 THPDFContentEdit 被复制到排序的覆盖层中;冲突的编辑被拒绝,相邻范围保持有效,EditCount 报告接受的编辑,ClearEdits 恢复无操作输出

运算符访问器

HPDFVisitContentStreamOperators 在此 AST 之上分层引用计数的访问器和 Delphi 事件回调,提供只读操作数视图,强制执行源、运算符、词素、深度和替换预算,并在成功前重新解析变换后的输出

序列化

Serialize 在溢出检查的大小计算后创建一个输出字节数组,而 WriteToStream 将未触及的源跨度和替换跨度直接写入调用方拥有的 TStream

没有编辑时,任一路径都逐字节再现源,而不改变数字拼写、字符串转义、注释、行尾、分隔符或内联图像负载

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;