介绍
Type 1 是 Adobe 最早的可缩放字体格式,早于 TrueType 和 OpenType。Type 1 字体由两个文件组成:一个 .pfb(Printer Font Binary)文件,包含加密的字体程序;以及一个 .afm(Adobe 字体度量)文件,包含字距和度量数据。尽管已被 OpenType 取代,Type 1 字体仍在出版工作流、PostScript 流程和归档文档中广泛使用。
Aspose.Font FOSS 用于 Python 提供通过 Type1Font、Type1FontData、Type1Serializer 和 Type1Interpreter 直接访问 Type 1 内部的能力。您可以通过 FontLoader.open 加载 PFB 或 PFA 文件,检查嵌入的字体程序元数据,将 charstrings 解释为字形路径,并将字体序列化回 PFB 或 PFA 格式。
该库在 PyPI 上以 aspose-font 发布,采用 MIT 许可证。它没有强制性的商业依赖,并可在标准 Python 3 上运行。
主要特性
加载 Type 1 字体
使用 FontLoader.open 加载 PFB 或 PFA 文件。返回的对象同时提供标准的 Font 接口以及通过 Type1Font 类实现的 Type 1 特定功能:
from aspose_font import FontLoader
loaded = FontLoader.open("fonts/Courier.pfb")
print(loaded.font_name) # e.g. "Courier"
print(loaded.font_family) # e.g. "Courier"
print(loaded.num_glyphs) # number of defined glyphs
print(loaded.font_style) # style string, e.g. "Regular"
FontLoader.open 自动从文件头检测 Type 1 格式。PFB 和 PFA 文件均受支持。
加载 AFM 指标
Type 1 字体将其度量信息存放在单独的 .afm 文件中。Type1Font 类提供一个 load_afm(path) 方法,将 AFM 数据附加到已加载的字体对象上,从而可以通过 get_kern_pairs() 进行字距对查询。
如果没有 AFM 文件,get_kern_pairs() 将返回空列表,因为字距数据存放在 AFM 文件中,而不在 PFB 程序本身。load_afm 方法接受指向配套 .afm 文件的文件路径字符串。
访问 Type1FontData 元数据
Type1FontData 类公开嵌入在 Type 1 文件中的字体程序字典。它包括度量、边界框、编码向量、字符串和子例程:
from aspose_font.type1.data import Type1FontData
# Type1FontData is the font program dictionary parsed from the PFB
# Access its properties to inspect the raw PostScript font data
Type1FontData 属性:
font_name(str) — PostScript 字体名称full_name(str) — 完整的人类可读名称family_name(str) — 字体族weight(str) — 字重字符串(例如"Medium")italic_angle(float) — 斜体角度(度)is_fixed_pitch(bool) — 对于等宽字体为 truefont_bbox(tuple[int, int, int, int]) — 边界框(llx, lly, urx, ury)underline_position(int) — 下划线位置(字体单位)underline_thickness(int) — 下划线笔画粗细encoding(list[str]) — 256槽编码向量 (PostScript 字形名称)charstrings(dict[str, bytes]) — 字形名称 → charstring 字节映射subrs(list[bytes]) — charstring 引擎使用的子例程字节串len_iv(int) — lenIV 加密参数
解释 Charstrings
Type1Interpreter 将 Type 1 charstring 程序解码为 GlyphPath 轮廓。将来自 Type1FontData.charstrings 的原始 charstring 字节传递给 interpret:
from aspose_font.type1.interpreter import Type1Interpreter
interpreter = Type1Interpreter()
charstring = b"\x0e" # seac or other charstring bytes
glyph_path, stack_depth = interpreter.interpret(charstring)
for cmd in glyph_path.commands:
print(cmd)
interpret 返回一个 (GlyphPath, int) 元组。GlyphPath 包含字形轮廓的绘制指令。整数是执行后的最终栈深度,这对于调试畸形的 charstrings 很有用。
序列化为 PFB 和 PFA
Type1Serializer 将已加载的 Type 1 字体转换回二进制 PFB 或文本 PFA 格式。两种方法都接受任何 Font 实例并返回原始字节:
from aspose_font import FontLoader
from aspose_font.type1.serializer import Type1Serializer
loaded = FontLoader.open("fonts/Courier.pfb")
# Serialize to PFB (binary) format
pfb_bytes = Type1Serializer.serialize_pfb(loaded)
with open("output/Courier_copy.pfb", "wb") as fh:
fh.write(pfb_bytes)
# Serialize to PFA (text) format
pfa_bytes = Type1Serializer.serialize_pfa(loaded)
with open("output/Courier_copy.pfa", "wb") as fh:
fh.write(pfa_bytes)
print(f"PFB: {len(pfb_bytes)} bytes")
print(f"PFA: {len(pfa_bytes)} bytes")
字体度量
可以通过标准的 Font 接口访问度量和编码:
from aspose_font import FontLoader
loaded = FontLoader.open("fonts/Courier.pfb")
metrics = loaded.metrics
print(f"Units per em : {metrics.units_per_em}")
print(f"Ascender : {metrics.ascender}")
print(f"Descender : {metrics.descender}")
print(f"Underline pos : {metrics.underline_position}")
print(f"Underline tck : {metrics.underline_thickness}")
快速入门
安装库:
.venv/bin/pip install aspose-font
加载 PFB 字体并检查它:
from aspose_font import FontLoader
from aspose_font.type1.serializer import Type1Serializer
loaded = FontLoader.open("Courier.pfb")
print(f"Font name : {loaded.font_name}")
print(f"Family : {loaded.font_family}")
print(f"Style : {loaded.font_style}")
print(f"Glyphs : {loaded.num_glyphs}")
metrics = loaded.metrics
print(f"UPM : {metrics.units_per_em}")
# Round-trip: serialize back to PFB
pfb_bytes = Type1Serializer.serialize_pfb(loaded)
print(f"Serialized: {len(pfb_bytes)} bytes")
支持的格式
| 格式 | 扩展名 | 读取 | 写入 |
|---|---|---|---|
| TTF | .ttf | ✓ | — |
| OTF | .otf | ✓ | — |
| EOT | .eot | ✓ | — |
| CFF | .cff | ✓ | — |
| TYPE1 | .pfb/.pfa | ✓ | — |
| WOFF | .woff | ✓ | — |
| WOFF2 | .woff2 | ✓ | — |
Type 1 字体通过 FontLoader.open 加载,并通过 Type1Serializer 序列化。
开源与许可
Aspose.Font FOSS for Python 在 MIT 许可证下发布。您可以在个人、商业和开源项目中免费使用。源代码可在 GitHub 获取,软件包通过 PyPI 以 aspose-font 形式分发。