介绍

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) — 对于等宽字体为 true
  • font_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 形式分发。


开始使用

相关资源