CFF and OpenType Font Subsetting Functions

PDF 过滤器支持

 

顶部  EnableFontSubsetting  目录

这些单元级函数公开 HotPDF 嵌入字体流程使用的 CFF 和 OpenType-CFF 字体子集接口。HotPDF 还提供可复用的 Type 1 PFB 和 CFF 解析器单元,供需要更底层字体检查的调用方使用

 

Delphi 语法

function HPDFSubsetCFF(const CFFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes;

function HPDFIsCFF2Font(const FontBytes: TBytes): Boolean;

function HPDFInstantiateCFF2Font(const FontBytes: TBytes; const AxisValues: THPDFVariableFontAxisValueArray): TBytes;

function HPDFSubsetCFF2Font(const FontBytes: TBytes; const KeepGlyph: array of Boolean): TBytes;

function HPDFIsTrueTypeVariableFont(const FontBytes: TBytes): Boolean;

function HPDFInstantiateTrueTypeVariableFont(const FontBytes: TBytes; const AxisValues: THPDFVariableFontAxisValueArray): TBytes;

function HPDFSfntIsOTF(const Data: TBytes): Boolean;

function HPDFOTFFindCFFTable(const Data: TBytes; out TableOff: Cardinal; out TableLen: Cardinal): Boolean;

function HPDFSubsetOTFContainer(const OTFBytes: TBytes; const KeepGlyph: array of Boolean): TBytes;

function HPDFExtractTTFPostScriptName(const Data: TBytes): AnsiString;

 

说明

HPDFSubsetCFF 原地重写 CFF 字体载荷,保留 glyph ID,并把未使用的 CharStrings 与子例程替换为最小 stub。适合已从字体容器中提取出 CFF table 的调用方

 

HPDFIsCFF2Font 检测带CFF2 table 的 sfnt。HPDFInstantiateCFF2Font 解析选定的fvar 坐标,经 avar 1.0 或 2.0 解析,并跨递归子例程求值基于 VariationStore 的blend 操作,烘焙 HVAR、VVAR、MVAR metrics,移除 variable tables,并返回 checksum 正确的静态 sfnt

 

HPDFSubsetCFF2Font 执行同样的默认坐标 instancing,同时把未使用的 glyph program 替换为空 CharStrings。它保留 glyph IDs、multi-FD 字典、private hint 数据和 font matrices

 

HPDFIsTrueTypeVariableFont 检测包含 HPDFExtractTTFPostScriptName、glyf 和 loca。HPDFInstantiateTrueTypeVariableFont 经 avar 映射选定轴,求值 gvar tuples 和 IUP 插值,更新简单与复合轮廓及 phantom-point metrics,在适用处应用 HVAR、VVAR、MVAR,移除 variation tables,并返回 checksum 正确的静态 sfnt

 

HPDFSfntIsOTF 检测版本为 OTTO 的 sfnt container。HPDFOTFFindCFFTable 定位嵌入的 'CFF ' table。HPDFSubsetOTFContainer 对嵌入 CFF 或 CFF2 数据做子集化,返回 sfnt checksum 有效的 OTF container。HPDFExtractTTFPostScriptName 从 sfnt 读取 name ID 6name table,并在存在时返回 PostScript 字体名称

 

底层 CFF 整数解码器、FDArray / FDSelect 解析器和子例程扫描器是此公开 helper surface 背后的实现细节

 

子集化器同时识别 name-keyed CFF(单个 Private DICT、单个 Local Subr INDEX)和 CID-keyed CFF(Top DICT 中的 ROS 操作符、含多个子字体 Private DICT 的 FDArray、FDSelect 字形到 FD 的映射、每个 FD 各自的 Local Subr INDEX)。CID 支持覆盖 CJK / Indic / 阿拉伯文的 OpenType-CFF 字体;闭包扫描会跟踪每个保留下来的 CharString 所属的 FD 上下文,因此各 FD 的 Local Subr INDEX 是独立做子集化的

 

Type 1 and CFF parser units

HPDFType1Core、HPDFType1Glyphs、HPDFType1CFFHandler 和 HPDFType1PFBHandler 提供可复用 byte-array readers、Type 1 glyph-outline command extraction、CFF Header / INDEX / dictionary / charset / encoding parsing,以及 Type 1 PFB metadata 与 glyph lookup helpers。HPDFType1CFFHandler 解析 FontSet 内 SyntheticBase 对 Top 与 Private DICT 值、CharStrings、charset、Encoding 和 Local Subrs 的继承,同时拒绝无效索引、环和过深嵌套。HPDFType1CB 提供 C++Builder 友好的 parser 入口。这些单元包含在 Delphi 和 C++Builder package projects 中,使应用程序无需重新实现二进制解析器即可检查 Type 1 PFB 和 CFF 数据

 

另请参阅: EnableFontSubsetting, FontEmbedding, PDF 过滤器支持

Type 2 栈操作与子程序安全

原生字形渲染器实现了标准的 Type 2 布尔、算术、条件、暂存数组和栈操作,包括 put、get、ifelse、random、dup、exch、index 和 roll

暂存值在每个字形开始时重置,随机值可复现;操作数、暂存数组、递归和执行上限会拒绝畸形的程序,不会返回部分轮廓

子集扫描器会解析局部和全局子程序调用用到的算术与暂存数组表达式,包括 Type 2 16.16 定点操作数

当随机值、未知的暂存状态或跨过程的栈效应导致调用目标无法确定时,子集化会保留所有候选子程序,而不是丢弃可能可达的轮廓依赖

保留的和已弃用的 Multiple Master 操作仍不支持,会显式失败