渐进渲染与取消
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 提供直接接受令牌的重载
所有权与部分结果规则
- 文档和令牌必须比引用它们的每个
THPDFLoadedPageRenderSession存活更久 - 已取消加载之后可以在同一文档实例上进行新加载
- 流优化是协作式而非事务式,因此取消前完成的流保持优化
- 已取消签名目标可能包含部分输出,在需要原子交付时应丢弃
- Windows 私钥提供程序调用无法安全中断,因此在该调用之前和之后立即观察取消