プログレッシブレンダリングとキャンセル
HotPDF は、ロード済みページを複数の境界付き呼び出しでレンダリングでき、共有の呼び出し側所有キャンセルトークンを通じて長時間実行のドキュメント操作を停止できます
プログレッシブページレンダリング
Session := PDF.BeginLoadedPageProgressiveRender(0, 144);
try
repeat
Status := Session.ContinueRender(8, 128);
Preview.Assign(Session.Bitmap);
until Status in [prsCompleted, prsCancelled];
if Status = prsCompleted then
FinalBitmap := Session.TakeBitmap;
finally
Session.Free;
end;
ContinueRender は、ミリ秒単位の最大経過時間、上位レベルページコンテンツ演算子の最大数、またはその両方を受け入れます。ゼロはその予算で無制限を意味します
この呼び出しは、非ゼロの時間予算を適用する前に少なくとも 1 つの演算子を完了するため、グラフィックス状態は常に演算子境界で一時停止されます
Bitmap はライブの呼び出し側読み取り専用の部分ビットマップを公開し、TakeBitmap はセッションが prsCompleted または prsCancelled に達した後にコピーせずに所有権を転送します
ObjectsProcessed と TotalObjects は、ソース順のすべてのページ /Contents ストリームからの上位レベルコンテンツ演算子を報告します
プログレッシブ領域レンダリング
Session := PDF.BeginLoadedPageProgressiveRegionRender(
0, 72, 144, 360, 432, 144);
try
repeat
Status := Session.ContinueRender(6, 96);
until Status in [prsCompleted, prsCancelled];
finally
Session.Free;
end;
4 つの領域座標は、左下原点を持つ PDF ユーザー空間ポイントであり、出力ビットマップは要求された DPI で正確にそのウィンドウをカバーします
セッションはキャッシュ済み表示リストを再利用し、呼び出しをまたいでグラフィックスとテキスト状態を保持し、保守的な境界が ROI と交差しない高コストのパス、テキスト、画像、Form、シェーディング塗りを抑制します
状態演算子とテキスト進行はソース順で実行され続けるため、前のマークを刈り込んでも後で可視のマークが移動したり再着色されたりしません
RegionVisiblePaintObjects と RegionCulledPaintObjects は表示リストの選択を公開し、ピークメモリ予約はフルページではなく領域寸法に従います
プログレッシブ JPEG スキャン
THotPDF.ProgressiveJPEGScanDecoding が true の場合、適格なプログレッシブ DCTDecode 画像は、境界付き ContinueRender 呼び出しごとに 1 JPEG スキャン進むため、ライブビットマップは最終スキャンの前に初期の低精細プレビューを表示できます
THotPDF.ProgressiveJPEGMaxScans は各画像を 1 から 4096 スキャンに制限し、ドキュメントデコードバイト予算も整列された出力ビットマップをカバーします
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded と THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded は完了したスキャンと画像の数を報告します。THPDFLoadedPageRenderSession.OnProgressiveJPEGScan は各可視スキャンの後に THPDFProgressiveJPEGScanEvent を受け取り、セッションをキャンセルできます
HPDFJpeg ユニットは、生の THPDFJpegByteArray 入力用の THPDFJpegScanDecoder も公開し、THPDFJpegScanDecodeStatus 結果と、行レベルキャンセル用のオプション THPDFJpegCancellationCheck コールバックを備えます
増分パスは、デフォルトの不透明度とマスク、転送関数、ハーフトーン、オーバープリント、透明グループ状態のない、全ターゲット DeviceRGB または DeviceGray JPEG 画像塗りを受け入れます。他のすべての塗りは、レンダリングセマンティクスを保持するために完全画像デコーダーを使用します
オプションを無効にするか、コードック分離を要求するか、上限を超えるか、不正な入力に遭遇する場合も、部分的な失敗デコードを公開せずに完全画像パスを選択します
進捗コールバック
THPDFProgressiveRenderProgressEvent は、各完了した演算子の後に実行され、処理済みと合計のカウントと経過レンダー実行時間を受け取ります
そのセッションを共有トークンをキャンセルせずに prsCancelled で終了するには、コールバックの Cancel パラメータを true に設定します
Form XObject、パターン、画像デコード、または他のネストされた操作は、それを囲む上位レベル演算子に属し、制御が戻る前に小さな時間予算を超える可能性があります
操作全体のキャンセル
Token := THPDFCancellationToken.Create;
try
PDF.OperationCancellationToken := Token;
Worker.Start;
// Call Token.Cancel from another thread when the operation should stop
finally
PDF.OperationCancellationToken := nil;
Token.Free;
end;
THPDFCancellationToken はスレッドセーフでワンショットであり、呼び出し側が所有します。Cancel はキャンセルを恒久的に要求し、IsCancellationRequested は状態を公開します
ThrowIfCancellationRequested は EHPDFOperationCancelled を発生させ、OperationName に操作名を保持します
THotPDF.OperationCancellationToken は、ロード、同期レンダリング、明示的トークンのないプログレッシブレンダリング、OptimizeLoadedStreams、CreatePreflightReport、ValidatePDFVT に適用されます
SignPDFWithPFX と SignPDFWithSystemCertificate は、トークンを直接受け入れるオーバーロードを提供します
所有権と部分結果の規則
- ドキュメントとトークンは、それらを参照するすべての
THPDFLoadedPageRenderSessionより長く存続しなければなりません - キャンセルされたロードの後に、同じドキュメントインスタンスで新しいロードを続けることができます
- ストリーム最適化はトランザクション的ではなく協調的であるため、キャンセル前に完了したストリームは最適化されたままです
- キャンセルされた署名宛先は部分的な出力を含む可能性があるため、原子的な配信が必要な場合は破棄する必要があります
- Windows 秘密鍵プロバイダーの呼び出しは安全に中断できないため、キャンセルはその呼び出しの直前と直後に観測されます