自定义流过滤器注册表
HotPDF 可以在其内置 Flate、LZW、ASCII85、ASCIIHex 和 RunLength 解码器使用的同一有界管线中解码应用定义的 PDF 流过滤器
注册推或拉过滤器
实现 IHPDFCustomStreamFilter,选择 csfmPush 或 csfmPull,并通过 THotPDF.RegisterCustomStreamFilter 注册接口
名称不区分大小写匹配且不带前导斜杠,重复注册是显式的,内置名称不能替换,每个文档最多接受 64 个自定义名称
注册表查找在短临界区下保留接口快照;过滤器回调和接口销毁在注册表锁外运行
每个阶段共享一个预算
自定义输出通过现有聚合跟踪器消费 DecodeBudgetBytes 和 DocumentDecodeBudgetBytes,因此混合自定义和内置链不能在阶段之间重置扩展核算
THPDFCustomStreamFilterRequest.MaxOutputBytes 报告剩余每链配额,而零表示配置的每链预算不受限制
请求还提供解码后的 PDF 过滤器名称、从零开始的阶段索引、管线深度、可用时的输入大小以及调用方取消令牌
取消与寻址契约
取消感知的 DecodeLoadedStreamToStream 重载在自定义执行前后以及拉流传输期间检查
自定义实现应在长推循环或阻塞外部工作内检查 Request.CancellationToken
csscSeekable 声明借用的输入、推目标或返回的拉流必须支持寻址;契约违规产生 dpsSeekContractViolation
失败隔离
每个自定义阶段在向下一阶段或调用方目标发布任何字节之前,都写入有界的 THPDFAdaptiveTempStream
假结果、异常、取消、寻址违规或预算失败会丢弃该临时输出,并返回类型化管线状态,而不会将自定义异常泄漏到公共解码边界之外
成功的拉过滤器将其返回的流的所有权转移给 HotPDF;返回借用的输入或 nil 流会被拒绝
遥测
GetCustomStreamFilterStatistics 报告注册名称、推和拉尝试、成功、失败、取消和寻址违规计数、聚合输入和产生字节,以及最新名称和诊断
THPDFDecodePipelineInfo.CustomFilterCount 和 CustomFilterFailureCount 描述当前链
示例
Filter := TApplicationFilter.Create;
PDF.RegisterCustomStreamFilter(Filter);
try
if not PDF.DecodeLoadedStreamToStream(StreamObject, Output,
CancellationToken, Info) then
HandleDecodeFailure(Info.Status, Info.Diagnostic);
finally
PDF.UnregisterCustomStreamFilter(Filter.FilterName);
end;