Введение

TrueType шрифты (.ttf) и их надмножество OpenType (.otf) являются доминирующими форматами шрифтов в современных операционных системах. Оба формата используют одну и ту же двоичную структуру таблиц, основанную на спецификации OpenType. Aspose.Font FOSS для Python раскрывает эту структуру через TtfFont, предоставляя прямой доступ к отдельным таблицам OpenType, данным о керн-парах, осям переменных шрифтов и контурам глифов.

Класс TtfFont расширяет базовый класс Font методами, специфичными для TTF, включая get_blob, get_table_bytes, set_table_bytes и instantiate для блокировки осей переменного шрифта. Свойство TtfTableSet (ttf_tables) предоставляет типизированный доступ к наиболее часто используемым таблицам OpenType: head, hhea, maxp, os2, name, post.

Библиотека опубликована на PyPI как aspose-font и лицензирована по лицензии 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.


Доступ к таблицам OpenType через TtfTableSet

Свойство ttf_tables возвращает TtfTableSet с типизированными аксессорами для общих таблиц OpenType. Каждое свойство возвращает объект таблицы или None, если он отсутствует:

Свойство ttf_tables в TtfFont возвращает экземпляр 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 (int в единицах шрифта):

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)}")

Метод get_axis(tag) в TtfFont извлекает VariableAxis по его четырёхбуквенному тегу (например, "wght" для веса, "wdth" для ширины). Он возвращает None, если ось отсутствует в таблице fvar шрифта.


Преобразование шрифтов

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 для Python выпускается под лицензией MIT. Вы можете использовать его в личных, коммерческих и открытых проектах бесплатно. Исходный код доступен на GitHub, а пакет распространяется через PyPI как aspose-font.


Начало работы

Связанные ресурсы