漸進式轉譯與取消
HotPDF 可以把已載入頁面的轉譯拆成多次有界呼叫,也能透過共享的呼叫端取消權杖停止長時間的文件操作
漸進式頁面轉譯
對線性化的網路來源,THPDFLinearizedPageRedrawScheduler 會把首繪範圍與選用的共享物件相依分開,只在新抵達的相依可能改變頁面時才要求重繪
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 接受毫秒為單位的最大耗時、頂層頁面內容運算子的最大數量,或兩者同時;0 代表該項預算不設限
呼叫至少完成一個運算子才套用非零的時間預算,圖形狀態因此總是暫停在運算子邊界上
Bitmap 公開即時、呼叫端唯讀的部分點陣圖;工作階段到達 prsCompleted 或 prsCancelled 後,TakeBitmap 可不經複製直接移轉擁有權
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;
四個區域座標是左下原點的 PDF 使用者空間點,輸出點陣圖以要求的 DPI 恰好涵蓋該視窗
工作階段重用快取的顯示清單、跨呼叫保留圖形與文字狀態,並跳過保守邊界與 ROI 不相交的高成本路徑、文字、影像、Form 與漸變著色
狀態運算子與文字前進仍按來源順序執行,剔除較早的標記不可能移動或改色較晚的可見標記
RegionVisiblePaintObjects 與 RegionCulledPaintObjects 公開顯示清單的取捨結果,峰值記憶體保留則依區域尺寸而非整頁
漸進式 JPEG 掃描
THotPDF.ProgressiveJPEGScanDecoding 為 true 時,符合條件的漸進式 DCTDecode 影像每次有界的 ContinueRender 呼叫推進一個 JPEG 掃描,最終掃描完成前即可先看到粗糙的早期預覽
THotPDF.ProgressiveJPEGMaxScans 把每個影像限制在 1 到 4096 個掃描之間,文件解碼位元組預算也涵蓋對齊後的輸出點陣圖
THPDFLoadedPageRenderSession.ProgressiveJPEGScansDecoded 與 THPDFLoadedPageRenderSession.ProgressiveJPEGImagesDecoded 回報已完成的掃描與影像數;THPDFLoadedPageRenderSession.OnProgressiveJPEGScan 在每個可見掃描之後收到 THPDFProgressiveJPEGScanEvent,並可取消工作階段
HPDFJpeg 單元也公開 THPDFJpegScanDecoder,接受原始 THPDFJpegByteArray 輸入,回傳 THPDFJpegScanDecodeStatus 結果,並提供選用的 THPDFJpegCancellationCheck 回呼做列級取消
漸進路徑接受目標完整的 DeviceRGB 或 DeviceGray JPEG 影像著色,需為預設不透明度且無遮罩、轉換函式、半色調、疊印或透明群組狀態;其他著色一律使用完整影像解碼器以維持轉譯語意
停用選項、要求 codec 隔離、超出限制或遇到畸形輸入時,同樣改走完整影像路徑,不會露出半途失敗的解碼結果
進度回呼
THPDFProgressiveRenderProgressEvent 在每個完成的運算子之後觸發,收到已處理與總數量,以及轉譯執行的耗時
把回呼的 Cancel 參數設為 true 可讓該工作階段以 prsCancelled 收尾,而不取消共享權杖
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 私鑰提供者呼叫無法被安全中斷,因此取消狀態在該呼叫前後立即檢查