自訂串流篩選器登錄
HotPDF 可以在其內建 Flate、LZW、ASCII85、ASCIIHex 與 RunLength 解碼器所用的同一個有界管線內,解碼應用程式定義的 PDF 串流篩選器
登錄推式或拉式篩選器
實作 IHPDFCustomStreamFilter、選擇 csfmPush 或 csfmPull,並透過 THotPDF.RegisterCustomStreamFilter 登錄該介面
名稱以大小寫不敏感方式匹配,不帶前導斜線;重複登錄是明確的、內建名稱無法取代,且每個文件最多接受 64 個自訂名稱
登錄查詢會在短暫的臨界區段下保留介面快照;篩選器回呼與介面銷毀在登錄鎖之外執行
每個階段的單一預算
自訂輸出會透過既有的彙總追蹤器消耗 DecodeBudgetBytes 與 DocumentDecodeBudgetBytes,因此自訂與內建混合的處理鏈無法在各階段之間重置膨脹量的計算
THPDFCustomStreamFilterRequest.MaxOutputBytes 回報剩餘的逐鏈容額,而零值表示設定的逐鏈預算無上限
此要求也提供已解碼的 PDF 篩選器名稱、從零開始的階段索引、管線深度、可用的輸入大小與呼叫端取消符記
取消與尋址契約
可感知取消的 DecodeLoadedStreamToStream 多載會在自訂執行之前與之後、以及在拉式串流轉移期間檢查
自訂實作應在長推式迴圈或阻斷的外部工作中檢查 Request.CancellationToken
csscSeekable 宣告借用的輸入、推式目的地或傳回的拉式串流必須支援尋址;契約違反會產生 dpsSeekContractViolation
失敗隔離
每個自訂階段都把輸出寫入有界的 THPDFAdaptiveTempStream,之後才把任何位元組發佈到下一階段或呼叫端目的地
假的結果、例外、取消、尋址違反或預算失敗會捨棄該暫時輸出,並傳回類型化的管線狀態,而不會把自訂例外洩漏到公開解碼界限之外
成功的拉式篩選器會把其傳回串流的擁有權轉移給 HotPDF;傳回借用的輸入或 nil 串流會遭到拒絕
遙測
GetCustomStreamFilterStatistics 回報已登錄名稱、推式與拉式嘗試、成功、失敗、取消與尋址違反次數、彙總的輸入與產出位元組,加上最新的名稱與診斷
THPDFDecodePipelineInfo.CustomFilterCount 與 CustomFilterFailureCount 描述目前的鏈
範例
Filter := TApplicationFilter.Create;
PDF.RegisterCustomStreamFilter(Filter);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output,
CancellationToken, Info) then
HandleDecodeFailure(Info.Status, Info.Diagnostic);
finally
PDF.UnregisterCustomStreamFilter(Filter.FilterName);
end;