內容運算子訪客
HotPDF 透過參考計數的訪客介面與 Delphi 事件回呼公開已解碼內容串流中的每個運算,而不要求呼叫端撰寫 PDF 語彙剖析器
檢查與量測
THPDFContentOperatorEventData 識別串流開始、運算子與串流結束階段,並在目前的來源運算子執行之前回報運算索引、運算子名稱、運算元數目、位元組範圍與決定性狀態
此狀態包含圖形狀態、文字物件、標記內容與相容區段的深度,而 THPDFContentOperatorView 則在不必複製完整來源串流的情況下提供隨選的唯讀運算或運算元位元組
轉換或拒絕
回呼選取 coaKeep、coaDelete、coaReplace、coaStop 或 coaReject
刪除與取代動作變成已排序的不重疊 AST 編輯;拒絕不會發佈任何輸出,而 coaStop 會在目前的運算子之後成功完成
狀態快照即使在運算被取代時也遵循原始來源遍歷,使重複檢查保持確定性
預算與驗證
THPDFContentOperatorVisitOptions.Default 設定 MaxSourceBytes、MaxOperators、MaxLexemes、MaxDepth、MaxReplacementBytes 與 ValidateOutput
在遍歷期間檢查取消,而轉換後的輸出會在相同的語彙、深度與運算子限制下再次剖析,之後才能傳回或寫入已載入頁面
格式錯誤的輸入、無效的取代輸出、回呼例外、限制失敗與明確拒絕會以 THPDFContentOperatorVisitStatus 與一則診斷區分
已載入頁面註冊
PDF.ContentOperatorVisitor := Visitor;
PDF.OnContentOperator := HandleContentOperator;
Options := THPDFContentOperatorVisitOptions.Default;
if PDF.VisitLoadedPageContentOperators(0, True, Options,
CancellationToken, Statistics) then
UseStatistics(Statistics);
當兩者都指派時,介面訪客會在事件回呼之前執行,且兩者都會在呼叫端執行緒上同步執行
使用 ApplyChanges=True 時,HotPDF 會先驗證整個轉換後的串流,然後在單一圖形變更中取代頁面內容,並使已編譯的顯示清單、點陣、磁碟、字型解碼器與縮圖快取失效