字体回退和竖排文本
HotPDF 可以按 Unicode 脚本选择回退字体,报告仍然未解析的码位,并通过真正的竖排 CID 书写模式输出 CJK 文本
文档级回退链
THotPDF.SetFontFallbackChain 为某个 THPDFFontScript 类别存储一个有序的字体列表
THPDFPage.TextOutWithFallback 对照所选字体、其脚本链和公共链解析每一个 Unicode 标量,然后将使用相同字体的相邻标量作为一个文本走向输出
- 回退链是文档设置,在各个页面之间保持可用
- 在保留调用方顺序的同时,会移除重复和空的字体名称
- 已安装字体探测在接受覆盖之前会拒绝静默的 GDI 替换
- 辅助平面标量在分类之前从 UTF-16 代理对解码
- 每个回退走向使用现有的内嵌 Type0 字体、子集化、
ToUnicode和共享的跨页面字体路径 - 回退排版会按请求的粗体或斜体字型检查已安装字族,在各走向之间保留全部字体样式、字符集、大小和书写方向设置,并在结束后恢复调用方的字体
可操作的诊断
AnalyzeUnresolvedGlyphs 执行只读的覆盖审计,而 TextOutWithFallback 记录在输出期间遇到的未解析标量
每个 THPDFUnresolvedGlyphInfo 包含标量码位、主字体、已分类的脚本,以及一个以分号分隔的回退建议列表
GetUnresolvedGlyphs 返回当前文档报告,ClearUnresolvedGlyphs 开始一个新的报告间隔
THotPDF.ResolveFontForCodePoint 和 THotPDF.AnalyzeUnresolvedGlyphs 的显式样式重载接受 TFontStyles,预检得以检查与输出相同的字型;原重载仍检查常规字型
文本框、SVG 内嵌文本和已加载文本外观会在回退排版中保留带样式的字族,而不是把 PDF 内部字体名当作系统字族,也不是把每个走向都切换成常规字型
竖排 CJK 书写
THPDFPage.TextOutVertical 选择当前字体的竖排变体,并输出一个 Identity-V 文本走向,而不是手动定位每一个字符
- CID 后代字体包含
/DW2默认值和特定于字形的/W2条目 - OpenType
vhea与vmtx提供竖排步进和顶部侧边距;TrueType 原点从每个glyf边界框推导,而VORG为 CFF 提供权威的原点默认值和例外 - 不含竖排表的字体使用可配置的 1000 单位推进量和 880 单位原点默认值
- 启用
sfVerticalAlternates后,整段保持长度不变的 GSUB run 在字体声明支持时使用vrt2,否则回退到vert,同时保持当前的 script 和 language 选择 - 当字体缺少标点替换但映射了 Unicode 竖排呈现形式时,逗号、句点、括号、破折号、省略号和相关标点会改用那些字形,同时
ToUnicode保留源文本 - 竖排的
vkrn和vpalGPOS 特性仍可通过ShapingFeatures使用 GetVerticalTextAdvance返回定位下一个竖排走向所需的用户空间推进量
示例
PDF.SetFontFallbackChain(hfsCJK,
['Microsoft YaHei UI', 'Yu Gothic UI', 'Malgun Gothic']);
PDF.SetFontFallbackChain(hfsEmoji, ['Segoe UI Emoji']);
PDF.CurrentPage.SetFont('Arial', [], 12);
PDF.CurrentPage.TextOutWithFallback(72, 72, 0, Text);
PDF.CurrentPage.SetFont('Yu Gothic UI', [], 14);
PDF.CurrentPage.TextOutVertical(420, 72, VerticalText);
Missing := PDF.GetUnresolvedGlyphs;