Введение
Встроенный 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.