保留 Token 的內容串流 AST
HPDFContentStream 為已解碼 PDF 內容串流的定點編輯提供有界的無損語法模型
解析與檢視
HPDFParseContentStreamAST 會以預設上限建立 THPDFContentStreamAST:4,194,304 個詞素與 256 層巢狀容器;需要更緊上限的呼叫端可直接呼叫 THPDFContentStreamAST.Create
THPDFContentLexemeKind 區分空白、註解、數字、名稱、字面與十六進位字串、布林值、null、word、容器分隔符號、內嵌影像資料與格式錯誤的位元組;每個輸入位元組都恰好屬於一個 THPDFContentLexeme
THPDFContentSyntaxNodeKind 區分根節點、運算、運算元、陣列、字典、程序、內嵌影像與格式錯誤區域;每個 THPDFContentSyntaxNode 使用父節點、首子節點、尾子節點與下一個兄弟節點索引,走訪時不必配置子節點陣列
搭配 LexemeCount 與 NodeCount 使用 GetLexeme、GetLexemeBytes、GetLexemeText 與 GetNode;GetOriginalBytes 回傳獨立的來源副本
Valid、ErrorOffset 與 ErrorMessage 在回報格式錯誤輸入的同時仍保持逐位元組精確的序列化;GetStatistics 則把來源大小、各項計數、最大深度、內嵌影像數與格式錯誤節點數填入 THPDFContentASTStatistics
編輯覆蓋層
ReplaceRange 使用半開位元組偏移區間,而 ReplaceLexeme、ReplaceNode、DeleteNode、InsertBeforeNode 與 InsertAfterNode 則從語法 record 推導區間
每個 THPDFContentEdit 會被複製進排序好的覆蓋層;衝突的編輯會被拒絕,相鄰區間仍然合法,EditCount 回報已接受的編輯數,ClearEdits 則讓輸出回到無作用狀態
運算子訪客
HPDFVisitContentStreamOperators 在這個 AST 之上疊加參照計數的訪客與 Delphi 事件 callback,提供唯讀的運算元檢視,強制執行來源、運算子、詞素、深度與取代的預算,並在宣告成功前重新解析轉換後的輸出
序列化
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;