|
Arabic / Persian / Urdu 塑形支持 生产端塑形流程 (v2.85.0 - v2.119.68)
|
OpenType GSUB Engine CFF / OpenType Subsetting |
|
HotPDF 在生产端运行塑形流程,在 PDF 文本输出期间把 Unicode 输入的 Arabic、Persian 和 Urdu 文本段折叠为对应的 Arabic Presentation Forms,因此消费端阅读器会收到可直接渲染的位置字形和连字字形,不需要自带 Harfbuzz 级别的塑形器
流程内容 位置成形(v2.85.0):每个阿拉伯基础字母最多有四种位置形式,即 isolated(
LAM-ALEF 强制连字(v2.119.32):Arabic Unicode Shaping 规范要求任何 LAM(U+0644)后紧跟 ALEF(U+0627 裸形式、U+0622 带 madda、U+0623 带 hamza above、U+0625 带 hamza below)时折叠为单个连字 glyph(U+FEFB - U+FEFC isolated / final 形式,带相应的 hamza / madda 变体)。这是阿拉伯排版中少数非可选连字之一,也是正确性的要求;若渲染为分离 glyph,母语读者会立即识别为错误。HotPDF 在输出期间执行折叠,因此调用方无需在自己的代码路径中使用 Harfbuzz 级成形器
Persian / Urdu 核心 9 个字母(v2.119.35):波斯语和乌尔都语扩展了阿拉伯字母,包含不在 Arabic Presentation Forms-B block(U+FE70 - U+FEFC)中的字母。最常用的 9 个字母——包括 PEH(U+067E)、TCHEH(U+0686)、JEH(U+0698)、KEH(U+06A9 / U+06AF)、GAF(U+06AF)、NOON GHUNNA(U+06BA)、HEH DOACHASHMEE(U+06BE)、YEH BARREE(U+06D2)和 HEH GOAL(U+06C1)——在 Arabic Presentation Forms-A(U+FB50 - U+FDFF)中有 presentation forms。HotPDF 现在会在 positional shaping 期间将这些字母映射到对应 Forms-A glyph,使波斯语和乌尔都语文本在任何消费端阅读器中都能以正确的 init / medi / fina / isol 形式渲染
Arabic Extended-A + Supplement(v2.119.52、v2.119.56):joining-class 表现在覆盖剩余 Arabic Extended-A 字符(ALEF WASLA / NOON GHUNNA / HEH 变体)、Arabic Supplement U+0750-U+077F 以及更高的 Arabic Extended-A U+08A0-U+08FF 范围。带静态 Presentation Forms-A 编码的字符会通过现有四位置 shaper 映射;没有 Presentation Forms-A 编码的多数 Extended-A 字符只获得 joining-class 分类,使相邻字符即便在该字符原样传递时也能正确成形。v2.119.56 修正了 v2.119.52 引入的两个错误 Forms-A 映射(U+06C2 / U+06C3)
Persian / Urdu Form-B 全覆盖(v2.119.57):joining-class 表扩展到完整 U+0672-U+06D5 范围,约 80 个字符,覆盖 REH / DAL / SEEN / SAD / TAH / AIN / FEH / QAF / KAF / GAF / LAM / NOON / HEH / WAW / YEH 变体,并新增 26 个 Presentation Forms-A 映射(15 个 D-class 四形式 + 11 个 R-class 双形式)。尤其是乌尔都语标准 'h' HEH DOACHASHMEE(U+06BE → FBAA-FBAD)和乌尔都语词尾 yeh YEH BARREE(U+06D2 → FBAE-FBAF)现在会正确映射到此前被 v2.119.52 ALEF WASLA / NOON GHUNNA 临时修复误用的 Forms-A 槽位。静态 Forms-A 覆盖现在超过 40 个源字符
YEH-HAMZA + 元音连字后处理(v2.119.58):在 positional shaping 之后加入
Allah 连字(v2.119.60):四字符序列 ALEF + LAM + LAM + HEH 会折叠为 U+FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM。实现为
Bismillah 短语连字(v2.119.62):标准 22-codepoint Bismillah 短语 “بسم الله الرحمن الرحيم” 会折叠为单个 glyph U+FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM。它作为
公开查询辅助函数
调用方式 用
字体要求 通过
Noto Sans Arabic (Latin + Arabic; Forms-A + Forms-B + Arabic Extended-A). Noto Naskh Arabic, Noto Naskh Arabic UI. Amiri (traditional Naskh, full Forms-A + Forms-B coverage). Scheherazade New(SIL 出品,为穆斯林世界的各种语言而设计) Microsoft Arabic Typesetting / Tahoma / Times New Roman (Windows-bundled, full Forms-B; some have Forms-A coverage).
当注册字体缺少派生 presentation form 的 glyph 时,HotPDF 会回退到基础 Unicode codepoint 并原样输出;消费端阅读器随后可能尝试自己的成形(Acrobat、Foxit),也可能渲染
典型工作流
PDF.RegisterUnicodeTTF('NotoArab', 'NotoSansArabic-Regular.ttf'); PDF.AutoShapeArabic:= True; PDF.BeginDoc; PDF.CurrentPage.SetFont('NotoArab', [], 14); PDF.CurrentPage.RtLTextOut(100, 700, 0, UnicodeString(#$0645#$0631#$062D#$0628#$0627)); // "marhaba" (hello) PDF.EndDoc;
自动 Phase 8 流程集成 (v2.119.59 - v2.119.68) v2.119.59 引入了可选启用的
设置
ToUnicode CMap 连字反向映射 (v2.119.61, v2.119.62, v2.119.65)
PUA 合成码位输出 (v2.119.68)
与 OpenType GSUB 引擎的关系 上述 static post-pass shaper(v2.85.0 + v2.119.32 / 58 / 60 / 62)默认独立于 OpenType GSUB engine。通过
对于没有 Unicode codepoint 的 substitute glyph,调用方将
Scope and limitations BiDi 算法仍不在本页范围内:混合 LTR 和 RTL 文本段仍需调用方自行排序,或使用独立 BiDi 库。GPOS、Indic/Tibetan/Mongolian、Hebrew、N'Ko、Adlam、Thai/Lao 和 Javanese 支持现在分别记录在可选塑形开关与 API 页面中,因此本页只聚焦静态和 GSUB 驱动的 Arabic 塑形
另请参阅: OpenType GSUB Substitution Engine, Automatic Shaping Pipeline (Phase 8), Syriac / Mongolian / Devanagari Shaping, THotPDF.AssignSyntheticCodepointForGID, THPDFPage.RtLTextOut, THPDFPage.UnicodeTextOut, CFF / OpenType Font Subsetting |