カスタムストリームフィルタレジストリ
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;