Введение
Compact Font Format (CFF) — это двоичный формат описания глифов, используемый внутри шрифтов OpenType с PostScript-совместимым движком контуров. Aspose.Font FOSS для Python предоставляет отдельный набор классов в пространстве имён aspose_font.cff для чтения и исследования структур данных CFF: CffFont, CffCharset, CffEncoding, CffDict, CffIndex и Type2Interpreter. В этой статье рассматривается, как загружать CFF-шрифты, перемещаться по их внутренним таблицам и интерпретировать программы charstring с помощью библиотеки.
Пакет лицензирован по MIT. Установите его с помощью pip install aspose-font>=1.0.0.
Ключевые возможности
Загрузка CFF-шрифта
FontLoader.open() автоматически определяет формат CFF — передайте либо отдельный файл .cff, либо файл OTF, в котором встроена таблица контуров CFF. Возвращаемый объект является CffFont (доступен через свойство cff_font у TtfFont для OTF-файлов).
from aspose_font.loader import FontLoader
# Load a standalone CFF file
font = FontLoader.open("OpenSans.cff")
# Load a standalone CFF file (auto-detected from format)
font = FontLoader.open("OpenSans.cff")
print(font.font_name, font.num_glyphs)
CFF Charset — сопоставление идентификаторов глифов с именами
CffCharset сопоставляет идентификаторы глифов (GIDs) с PostScript именами глифов. Используйте standard(), чтобы получить стандартный набор символов ISO Adobe, или from_reader(), чтобы разобрать набор символов из бинарных данных CFF. Метод name_for() возвращает имя PostScript для GID, а gid_for() выполняет обратный поиск.
from aspose_font.cff.charset import CffCharset
charset = CffCharset.standard()
print(charset.name_for(1)) # ".notdef" or similar
print(charset.gid_for("A")) # GID for the PostScript name "A"
Кодировка CFF — сопоставление Unicode-в-GID
CffEncoding обрабатывает таблицу кодировки CFF, которая сопоставляет коды символов идентификаторам глифов. standard() возвращает стандартную кодировку, expert()— экспертную кодировку, а from_reader() разбирает пользовательскую кодировку из бинарных данных CFF. Используйте unicode_to_gid(), чтобы найти GID по кодовой точке Unicode, и get_all_codepoints(), чтобы перечислить все сопоставленные кодовые точки.
from aspose_font.cff.encoding import CffEncoding
encoding = CffEncoding.standard()
gid = encoding.unicode_to_gid(0x41) # Unicode for 'A'
all_codepoints = encoding.get_all_codepoints()
print(f"Standard encoding covers {len(all_codepoints)} code points")
Разбор словаря CFF
Шрифты CFF хранят метаданные верхнего уровня и приватные метаданные в словарях. CffDict.from_bytes() разбирает необработанный блоб CFF DICT и предоставляет доступ к get() и set() по ключу оператора. TopDict.from_dict() специализирует это для словарей CFF верхнего уровня, а PrivateDict.from_dict() делает то же самое для приватных DICT.
from aspose_font.cff.dict_ import CffDict
# Parse a raw CFF DICT from bytes
raw_dict_bytes = b"..." # CFF-encoded DICT bytes
d = CffDict.from_bytes(raw_dict_bytes)
vals = d.get(21) # retrieve values for operator 21 (PostScript CharstringType)
Структуры индексов CFF
CffIndex представляет структуру данных CFF INDEX— массив байтовых строк переменной длины с префиксом длины, используемый для charstrings, subrs и таблиц имён. from_reader() разбирает INDEX из бинарного чтения, и результат можно индексировать целочисленным индексом.
from aspose_font.cff.index import CffIndex
from aspose_font._io import BinaryReader # internal API — may change between releases
import io
raw_index = b"..." # raw CFF INDEX bytes
reader = BinaryReader(io.BytesIO(raw_index))
index = CffIndex.from_reader(reader)
print(f"INDEX entries: {len(index)}")
Интерпретация Charstring типа2
Type2Interpreter выполняет программу Type 2 charstring (компактный формат, похожий на PostScript, используемый в шрифтах CFF) и создает GlyphPath команд контура. Вызовите interpret() с байтами charstring и соответствующим приватным словарём. Это позволяет извлекать необработанные контуры глифов из CFF charstring без полного PostScript интерпретатора.
from aspose_font.cff.type2 import Type2Interpreter
interpreter = Type2Interpreter()
glyph_path = interpreter.interpret(charstring_bytes, private_dict)
for cmd in glyph_path.commands:
print(type(cmd).__name__, cmd)
Быстрый старт
git clone https://github.com/aspose-font-foss/Aspose.Font-FOSS-for-Python.git
cd Aspose.Font-FOSS-for-Python
pip install -e .from aspose_font.loader import FontLoader
# Load an OTF with embedded CFF outlines
font = FontLoader.open("OpenSans-Regular.otf")
glyph_id = font.encoding.unicode_to_gid(0x41)
glyph = font.glyph_accessor.get_glyph_by_id(glyph_id)
print(f"Path commands for 'A': {len(glyph.path.commands)}")
Поддерживаемые форматы
| Формат | Расширение | Чтение | Запись |
|---|---|---|---|
| CFF | .cff | ✓ | ✓ |
| OTF | .otf | ✓ | ✓ |
| TTF | .ttf | ✓ | ✓ |
| WOFF | .woff | ✓ | ✓ |
| WOFF2 | .woff2 | ✓ | ✓ |
| EOT | .eot | ✓ | ✓ |
| TYPE1 | .pfb / .pfa | ✓ | ✓ |
Открытый исходный код и лицензирование
Aspose.Font FOSS для Python имеет лицензию MIT. Исходный код находится на GitHub по адресу aspose-font-foss/Aspose.Font-FOSS-for-Python. Установите из PyPI как aspose-font.