介绍

TrueType 字体(.ttf)及其 OpenType 超集(.otf)是现代操作系统上主导的字体格式。两种格式共享基于 OpenType 规范的相同二进制表结构。针对 Python 的 Aspose.Font FOSS 通过 TtfFont 暴露此结构,提供对各个 OpenType 表、字距对数据、可变字体轴以及字形轮廓的直接访问。

TtfFont 类通过 TTF 特定的方法(包括 get_blob、get_table_bytes、set_table_bytes 和用于可变字体轴锁定的 instantiate)扩展了 Font 基类。TtfTableSet 属性(ttf_tables)提供对最常用的 OpenType 表的类型化访问:head、hhea、maxp、os2、name、post。

该库以 aspose-font 的名称在 PyPI 上发布,并采用 MIT 许可证。它没有强制性的商业依赖。


关键特性

加载 TTF 和 OTF 字体

使用 FontLoader.open 加载任意 TrueType 或 OpenType 字体文件:

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/Roboto-Regular.ttf")

print(loaded.font_name)
print(loaded.font_family)
print(loaded.font_style)
print(loaded.num_glyphs)

FontLoader.open 从文件头检测字体格式。支持 .ttf(TrueType)和 .otf(OpenType CFF)文件,且两者都返回一个 TtfFont 实例。


通过 TtfTableSet 访问 OpenType 表

ttf_tables 属性返回一个带有常用 OpenType 表类型化访问器的 TtfTableSet。每个属性返回表对象,若不存在则返回 None:

TtfFont 上的 ttf_tables 属性返回一个 TtfTableSet 实例。可用的表访问器:

  • head — HeadTable | None
  • hhea — HheaTable | None
  • maxp — MaxpTable | None
  • os2 — Os2Table | None
  • name — NameTable | None
  • post — PostTable | None

每个属性返回表对象,若字体文件中不存在该表则返回 None。在读取之前,访问 TtfTableSet 属性以检查特定表是否存在。对于未在命名访问器中覆盖的表,使用 TtfTableSet.get_raw(tag) 通过四字符 OpenType 标记检索原始字节。


读取原始表字节

get_table_bytes(tag) 返回任意 OpenType 表的原始字节。使用 get_blob(tag) 可获得一个在表不存在时返回 None 的 None 安全变体:

TtfFont 提供两种原始表访问方法:

  • get_table_bytes(tag) -> bytes — 返回指定表的原始字节(若不存在则抛出异常)
  • get_blob(tag) -> bytes | None — 若表不存在则返回 None(安全变体)

两种方法都接受四字符的 OpenType 表标签,例如 "cmap"、"GDEF" 或 "GPOS"。当表是可选时使用 get_blob,这样您可以在处理前检查 None。


字距对

get_kern_pairs() 返回字体中编码的所有字距对。每个 KernPair 包含 left(GlyphId)、right(GlyphId)和 value(以字体单位表示的整数):

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/Roboto-Regular.ttf")

pairs = loaded.get_kern_pairs()
print(f"Kern pairs: {len(pairs)}")

for pair in pairs[:5]:
    print(f"  Left: {pair.left}  Right: {pair.right}  Value: {pair.value}")

字体度量

标准度量可通过 metrics 属性访问:

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/Roboto-Regular.ttf")

metrics = loaded.metrics
print(f"Units per em  : {metrics.units_per_em}")
print(f"Ascender      : {metrics.ascender}")
print(f"Descender     : {metrics.descender}")
print(f"Line gap      : {metrics.line_gap}")
print(f"Underline pos : {metrics.underline_position}")

可变字体支持

对于可变字体,TtfFont 提供 is_variable、variable_axes 和 named_instances。使用 get_axis(tag) 通过其四字符标签检索特定轴:

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/RobotoFlex.ttf")

print(f"Is variable: {loaded.is_variable}")
print(f"Axes       : {len(loaded.variable_axes)}")

TtfFont 上的 get_axis(tag) 方法通过四字符标签检索 VariableAxis(例如,"wght" 表示粗细,"wdth" 表示宽度)。如果该轴在字体的 fvar 表中不存在,则返回 None。


转换字体

to_bytes(font_type) 将字体转换为不同的格式。使用 FontType 枚举来指定目标:

from aspose_font import FontLoader, FontType

loaded = FontLoader.open("fonts/Roboto-Regular.ttf")

ttf_bytes = loaded.to_bytes(FontType.TTF)
with open("output/Roboto-copy.ttf", "wb") as fh:
    fh.write(ttf_bytes)

print(f"Serialized: {len(ttf_bytes)} bytes")

快速入门

安装该库:

.venv/bin/pip install aspose-font

加载 TTF 字体并检查它:

from aspose_font import FontLoader, FontType

loaded = FontLoader.open("Roboto-Regular.ttf")

print(f"Font name : {loaded.font_name}")
print(f"Family    : {loaded.font_family}")
print(f"Glyphs    : {loaded.num_glyphs}")
print(f"Variable  : {loaded.is_variable}")

metrics = loaded.metrics
print(f"UPM       : {metrics.units_per_em}")

ttf_bytes = loaded.to_bytes(FontType.TTF)
print(f"Serialized: {len(ttf_bytes)} bytes")

支持的格式

格式扩展名读取写入
TTF.ttf✓—
OTF.otf✓—
EOT.eot✓—
CFF.cff✓—
TYPE1.pfb/.pfa✓—
WOFF.woff✓—
WOFF2.woff2✓—

所有格式均通过 FontLoader.open 加载。TTF/OTF 字体返回一个 TtfFont 实例。


开源与许可

Aspose.Font FOSS for Python 在 MIT 许可证下发布。您可以在个人、商业和开源项目中免费使用。源代码可在 GitHub 获取,软件包通过 PyPI 分发,形式为 aspose-font。


入门指南

相关资源