可选文档处理器

THPDFDocumentHandlerRegistry 在弱扩展名或 MIME 提示之前按检查到的内容选择可替换处理器,然后把选定的源转换为一个由导出和渲染共享的不可变 PDF 缓存

内置可选处理器

预算与失败隔离

一次经过验证的 ZIP 中央目录扫描在转换前强制执行条目、压缩字节、展开字节、每条目、重复路径、不安全路径和压缩比限制

经典 PKZIP ZipCrypto 条目可以通过 ArchivePasswordCallback 请求凭据;该 callback 接收源名称、条目名称和从 1 开始的尝试序号,MaxPasswordAttempts 把重试限定在 1 到 16 之间

凭据和部分解码的条目字节只留在内存中并在各次尝试之间清除,每次 callback 前后都检查取消,而缺失 callback、拒绝提供凭据、重试耗尽或不支持的加密都会失败关闭

ZipCrypto 是传统的密码保护而非现代认证加密,非 ASCII 密码的字节约定在不同 ZIP 生产者之间可能不一致

受密码保护的条目需要 Delphi 12 或更高版本,其 System.Zip 暴露了解密钩子;用更早的 Delphi 版本构建时,handler 仍能读取未加密条目,但在 ArchivePasswordCallback 被调用之前就把加密条目按不支持拒绝

条目尺寸或偏移需要 ZIP64 字段的,要求 Delphi 11 或更高版本;更早的 Delphi 版本会按不支持拒绝

资源、回流、页面、像素、DPI、输出和取消限制在转换与渲染全程保持生效,输出发布失败时会恢复可寻址的目标流

注册与使用

var
  Registry: THPDFDocumentHandlerRegistry;
  Options: THPDFDocumentHandlerOptions;
  Handled: IHPDFHandledDocument;
  Info: THPDFDocumentHandlerInfo;
begin
  Registry:= THPDFDocumentHandlerRegistry.Create;
  try
    Registry.RegisterStandardHandlers;
    Options:= THPDFDocumentHandlerOptions.Default;
    Options.ArchivePasswordCallback:= SupplyArchivePassword;
    if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
      Handled.WritePDF(OutputStream, Options, Info);
  finally
    Registry.Free;
  end;
end;

相关 API