渐进渲染与取消

HotPDF 可以在多个有界调用中渲染已加载页面,并可以通过共享的调用方拥有的取消令牌停止长时间运行的文档操作

软件显示列表渲染在初始化页面白底位图时也检查取消,每次最多填充 64 KiB;取消会释放未完成的位图,不把部分图像加入栅格缓存,后续可用新的令牌重新渲染

渐进页面渲染

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 接受最大运行时间(毫秒)、最大顶层页面内容运算符数或两者;零表示该预算不受限制

调用在应用非零时间预算前至少完成一个运算符,因此图形状态总是在运算符边界暂停

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;

四个区域坐标是左下原点的 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 单元还为原始 THPDFJpegByteArray 输入暴露 THPDFJpegScanDecoder,带 THPDFJpegScanDecodeStatus 结果和用于行级取消的可选 THPDFJpegCancellationCheck 回调

增量路径接受带默认不透明度和无蒙版、传递函数、半色调、叠印或透明度组状态的完整目标 DeviceRGB 或 DeviceGray JPEG 图像绘制;所有其他绘制使用完整图像解码器以保留渲染语义

禁用选项、要求编解码器隔离、超出限制或遇到格式错误的输入也选择完整图像路径而不暴露部分失败的解码

进度回调

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