漸進式轉譯與取消

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 提供直接接受權杖的多載

擁有權與部分結果規則

相關 API