カスタムストリームフィルタレジストリ

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;

関連 API