可选文档处理器
THPDFDocumentHandlerRegistry 在弱扩展名或 MIME 提示之前按检查到的内容选择可替换处理器,然后把选定的源转换为一个由导出和渲染共享的不可变 PDF 缓存
内置可选处理器
- XPS 和 OpenXPS 保留固定页面尺寸与视觉顺序,把自闭合或带属性的缩写
Path几何转换为原生 PDF 矢量,保留属性和属性元素形式的纯色画刷、多色标LinearGradientBrush与椭圆形RadialGradientBrush着色图案,并通过包内 JPEG、PNG、TIFF 或 JPEG XRImageBrush资源(TileMode=None)填充路径 - XPS 图像填充支持绝对或
RelativeToBoundingBox的Viewbox与Viewport映射,None、Tile、FlipX、FlipY和FlipXY平铺模式,原生路径与放置裁剪,有限的六参数Transform属性或ImageBrush.TransformMatrixTransform元素,画刷与路径不透明度,PNG soft mask alpha,图像 DPI,以及包资源缓存 - XPS
Path.OpacityMask支持纯色、多色标线性或椭圆形径向渐变,以及 PNGImageBrushmask,包括重复和反射的图像单元;均匀 alpha 会折叠进既有图形状态,而可变 alpha 使用有界的原生 DeviceGray 透明度组,共享着色图案与图像 soft mask 流 - XPS Canvas
Opacity和Canvas.OpacityMask通过隔离的 DeviceRGB Form XObject 对重叠的后代只做一次合成,而不是逐个衰减每个子项;均匀 mask alpha 折叠进组状态,可变渐变或 PNG 图像 alpha 复用原生 soft mask 资源,嵌套组保留变换后的裁剪、资源所有权和有界链接批注,上限为每组 4,096 个组和 16 MiB 捕获内容 - XPS
VisualBrush递归转换内联或由资源支撑的Canvas、Path和Glyphs视觉元素,解析嵌套与远程ResourceDictionary作用域,把绝对Viewbox映射到绝对或相对Viewport,并在直接、平铺和反射放置之间复用同一个有界 PDF Form XObject - XPS
Canvas.Clip接受有界缩写几何、本地或远程StaticResourcePathGeometry值,以及带结构化直线、Bézier、二次曲线或弧形 figure、几何变换、空几何和EvenOdd或NonZero填充规则的直接属性元素;嵌套裁剪成为原生 PDFW*或W路径,导航矩形与活动的变换后裁剪边界求交,解析上限为 100,000 个数值,畸形或奇异的裁剪在绘制子视觉元素之前失败关闭 - XPS
Glyphs接受至多 65,536 条严格Indices映射,保留一对多与多对一的 cluster 推进、以 em 百分之一显式表示的 advance、水平和垂直偏移、奇数BidiLevel的反向推进、纯色属性或属性元素填充、不透明度、Unicode 提取以及失败关闭的畸形输入诊断;简单 run 使用原生 PDFTJ数组,大型映射缓冲以均摊线性成本增长 - 包
FontUri资源支持 TrueType 与 OpenType 程序、TTC 成员片段以及 XPS GUID 混淆字体;精确字形 ID、源自 cmap 的 run、cluster、advance、偏移、RTL 原点、字体资源复用、嵌入权限、可选子集化和ToUnicode提取映射都保持为原生 PDF 字体数据,不做 GDI 替换 - 变换后的
Path和Glyphs视觉元素上的 XPSFixedPage.NavigateUri会成为带几何或度量推导边界的原生 PDF 链接批注;HTTP、HTTPS 和 mail 链接保持 URI action,而包相对页面和经百分号解码的LinkTarget片段在所有页面可用之后变成前向或后向 GoTo action - Canvas 的
FixedPage.NavigateUri会成为每个后代Path、Glyphs或嵌套 Canvas 视觉元素的继承目标,直到某个后代提供自己的 URI;作用域目标在嵌套覆盖之后恢复,跟随各视觉元素的几何与变换,仍受活动 Canvas 裁剪约束,能在隔离透明度组捕获后保留,并在可复用VisualBrushForm 内保持抑制 - 导航上限为 65,536 个链接、每个 URI 8,192 字符,发布期间检查取消,可复用
VisualBrush捕获期间保持抑制,遇到控制字符、不安全 scheme、缺失目标或路径与片段不匹配时一律拒绝 - 非标准
RelativeTransform、未解析的矩阵资源、Repeat 或 Reflect 渐变延展、非 sRGB 插值、可变 alpha 绘图画刷、颜色转换、图像描边、相对VisualBrushviewbox、样式模拟、横置字形以及高级描边属性仍保持为显式诊断 - EPUB 解析
container.xml、清单和 spine 顺序,然后使用带仅回调包资源的有界 HTML5 分页媒体导入器 - CBZ 识别受支持的图像条目,应用确定性的自然文件名顺序,并以配置的图像 DPI 为每个图像创建一页
预算与失败隔离
一次经过验证的 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;