Введение

Встроенный OpenType (EOT) — это компактный формат шрифтов, изначально разработанный для внедрения шрифтов TrueType в веб-страницы. Файл EOT оборачивает шрифт TTF или OTF в заголовок фиксированного размера, содержащий поля метаданных, описывающие размеры шрифта, версию, набор символов и разрешения на внедрение. Хотя современная веб-разработка в значительной степени перешла к WOFF/WOFF2, файлы EOT продолжают использоваться в устаревших документах и корпоративных приложениях.

Aspose.Font FOSS для Python предоставляет прямой доступ к внутренностям шрифта EOT через класс EotFont и его сопутствующий EotHeader. Вы можете загрузить файл EOT с помощью FontLoader.open, прочитать поля заголовка, пройтись по внутреннему TtfFont и сериализовать результат обратно в байты или в файл, используя Font.save. Библиотека опубликована на PyPI как aspose-font и лицензирована под лицензией MIT License. У него нет обязательных коммерческих зависимостей и он работает со стандартным Python 3 runtime.


Ключевые возможности

Загрузка шрифтов EOT

Используйте FontLoader.open для загрузки файла EOT из пути или объекта bytes. Метод возвращает экземпляр EotFont, когда обнаруживает сигнатуру EOT:

from aspose_font import FontLoader, EotFont

font = FontLoader.open("fonts/sample.eot")
assert isinstance(font, EotFont)

print(font.font_name)     # e.g. "Roboto"
print(font.font_family)   # e.g. "Roboto"
print(font.num_glyphs)    # number of glyphs in the inner font

FontLoader.open читает расширение файла и магию заголовка, чтобы автоматически определить формат. Для обычных файлов шрифтов аргумент font_type не требуется.


Чтение метаданных EotHeader

EotFont раскрывает поля заголовка напрямую как свойства класса. Они соответствуют полям, определённым в бинарной спецификации EOT:

from aspose_font import FontLoader, EotFont, EotSerializer

# Load EOT — FontLoader returns an EotFont instance for .eot files
loaded = FontLoader.open("fonts/sample.eot")

# Serialize back to bytes to confirm the font loaded correctly
eot_bytes = EotSerializer.serialize(loaded)
print(f"EOT data loaded: {len(eot_bytes)} bytes")

# Base Font properties work on any loaded font
print("Font name:", loaded.font_name)
print("Glyphs   :", loaded.num_glyphs)

Класс EotFont раскрывает следующую метадату заголовка как свойства:

  • eot_version (int) — версия формата EOT (например, 0x00020002)
  • flags (int) — флаги разрешения встраивания
  • charset (int) — идентификатор набора символов (0 = ANSI, 1 = DEFAULT)
  • italic (int) — флаг курсив (0 или 1)
  • weight (int) — толщина шрифта (например, 400 для Regular, 700 для Bold)
  • fs_type (int) — OS/2 биты встраивания fsType

Используйте flags и fs_type, чтобы определить, разрешает ли шрифт субсетирование или встраивание, что имеет значение при обработке шрифтов для конвейеров перераспределения.

Доступ к внутреннему TtfFont

Каждый EotFont оборачивает стандартный шрифт TrueType. Свойство inner_font возвращает экземпляр TtfFont, предоставляя доступ к полному набору таблиц TrueType:

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/sample.eot")

# Metrics are accessible directly from the loaded font
metrics = loaded.metrics
print("Units per em :", metrics.units_per_em)
print("Ascender     :", metrics.ascender)
print("Descender    :", metrics.descender)
print("Line gap     :", metrics.line_gap)

Свойство inner_font в EotFont возвращает обернутый экземпляр TtfFont, предоставляя доступ к полному набору таблиц TrueType, kern pairs и таблицам кодировок.


Сериализация EOT в байты

EotSerializer.serialize преобразует любой объект Font в необработанную байтовую строку EOT:

from aspose_font import FontLoader, EotFont, EotSerializer

font = FontLoader.open("fonts/sample.eot")
assert isinstance(font, EotFont)

eot_bytes = EotSerializer.serialize(font)
with open("output/sample_copy.eot", "wb") as fh:
    fh.write(eot_bytes)

print(f"Serialized {len(eot_bytes)} bytes")

Преобразование TTF в EOT

EotSerializer.serialize принимает любой экземпляр Font, поэтому вы можете загрузить TTF и сразу сериализовать его в байты EOT:

from aspose_font import FontLoader, EotFont, EotSerializer

ttf = FontLoader.open("fonts/Roboto-Regular.ttf")
eot_bytes = EotSerializer.serialize(ttf)

with open("output/Roboto-Regular.eot", "wb") as fh:
    fh.write(eot_bytes)

reloaded = FontLoader.open("output/Roboto-Regular.eot")
assert isinstance(reloaded, EotFont)
print("Converted and verified:", reloaded.font_name)

Метрики шрифтов и керн-пары

Объект EotFont наследует полный интерфейс Font, поэтому метрики и кодировка доступны напрямую без обращения к inner_font:

from aspose_font import FontLoader

loaded = FontLoader.open("fonts/sample.eot")

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

for pair in loaded.get_kern_pairs():
    print(f"  Kern: {pair}")

Быстрый старт

Установите библиотеку:

.venv/bin/pip install aspose-font

Загрузите и проанализируйте шрифт EOT:

from aspose_font import FontLoader, EotFont, EotSerializer

loaded = FontLoader.open("sample.eot")

# Base font info
print(f"Font name : {loaded.font_name}")
print(f"Glyphs    : {loaded.num_glyphs}")

# Metrics
metrics = loaded.metrics
print(f"UPM       : {metrics.units_per_em}")
print(f"Ascender  : {metrics.ascender}")

# Serialize the loaded font back to EOT bytes
eot_bytes = EotSerializer.serialize(loaded)
print(f"Serialized: {len(eot_bytes)} bytes")

Поддерживаемые форматы

ФорматРасширениеЧитатьЗапись
TTF.ttf✓—
OTF.otf✓—
EOT.eot✓—
CFF.cff✓—
TYPE1.pfb/.pfa✓—
WOFF.woff✓—
WOFF2.woff2✓—

Все перечисленные выше форматы поддерживаются для загрузки через FontLoader.open. Запись в конкретный формат использует Font.save или EotSerializer.serialize для EOT.


Открытый исходный код и лицензирование

Aspose.Font FOSS для Python выпущен под лицензией MIT. Вы можете использовать его в личных, коммерческих и open-source проектах бесплатно. Исходный код доступен на GitHub, а пакет распространяется через PyPI как aspose-font.


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

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