Wprowadzenie
Compact Font Format (CFF) jest binarnym formatem opisu glifów używanym w czcionkach OpenType z silnikiem konturów zgodnym z PostScript. Aspose.Font FOSS dla Python udostępnia dedykowany zestaw klas w przestrzeni nazw aspose_font.cff do odczytu i analizowania struktur danych CFF: CffFont, CffCharset, CffEncoding, CffDict, CffIndex i Type2Interpreter. Ten wpis opisuje, jak wczytać czcionki CFF, przeglądać ich wewnętrzne tabele i interpretować programy charstring przy użyciu biblioteki.
Pakiet jest licencjonowany na licencji MIT. Zainstaluj go za pomocą pip install aspose-font>=1.0.0.
Kluczowe funkcje
Ładowanie czcionki CFF
FontLoader.open() wykrywa format CFF automatycznie — podaj albo samodzielny plik .cff, albo plik OTF zawierający tabelę konturu CFF. Zwrócony obiekt jest CffFont (dostępny przez właściwość cff_font w TtfFont dla plików 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)
Zestaw znaków CFF — Mapowanie identyfikatorów glifów na nazwy
CffCharset mapuje identyfikatory glifów (GIDs) na PostScript nazwy glifów. Użyj standard(), aby uzyskać standardowy zestaw znaków ISO Adobe lub from_reader(), aby sparsować zestaw znaków z binarnych danych CFF. Metoda name_for() zwraca PostScript nazwę dla GID, a gid_for() wykonuje odwrócone wyszukiwanie.
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"
Kodowanie CFF — mapowanie Unicode na GID
CffEncoding obsługuje tabelę kodowania CFF, która mapuje kody znaków na identyfikatory glifów. standard() zwraca standardowe kodowanie, expert() zwraca kodowanie eksperckie, a from_reader() parsuje niestandardowe kodowanie z binarnych danych CFF. Użyj unicode_to_gid(), aby wyszukać GID po punkcie kodowym Unicode, oraz get_all_codepoints(), aby wyliczyć wszystkie zmapowane punkty kodowe.
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")
Parsowanie słownika CFF
Czcionki CFF przechowują metadane najwyższego poziomu i prywatne w słownikach. CffDict.from_bytes() parsuje surowy blob CFF DICT i zapewnia dostęp get() i set() po kluczu operatora. TopDict.from_dict() specjalizuje to dla słowników CFF najwyższego poziomu, a PrivateDict.from_dict() robi to samo dla prywatnych DICTów.
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)
Struktury indeksów CFF
CffIndex reprezentuje strukturę danych CFF INDEX — tablicę prefiksowaną długością zmiennych ciągów bajtowych używaną dla charstrings, subrs i tabel nazw. from_reader() parsuje INDEX z binarnego czytnika, a wynik można indeksować przy użyciu liczby całkowitej.
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)}")
Interpretacja charstringów typu 2
Type2Interpreter wykonuje program Type 2 charstring (zwarty format podobny do PostScript używany w czcionkach CFF) i generuje GlyphPath poleceń konturu. Wywołaj interpret() z bajtami charstring i powiązanym prywatnym słownikiem. Umożliwia to wyodrębnienie surowych konturów glifów z charstringów CFF bez pełnego interpretera 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)
Szybki start
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)}")
Obsługiwane formaty
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| CFF | .cff | ✓ | ✓ |
| OTF | .otf | ✓ | ✓ |
| TTF | .ttf | ✓ | ✓ |
| WOFF | .woff | ✓ | ✓ |
| WOFF2 | .woff2 | ✓ | ✓ |
| EOT | .eot | ✓ | ✓ |
| TYPE1 | .pfb / .pfa | ✓ | ✓ |
Open Source i licencjonowanie
Aspose.Font FOSS dla Python jest licencjonowane na warunkach MIT. Kod źródłowy znajduje się na GitHub pod adresem aspose-font-foss/Aspose.Font-FOSS-for-Python. Zainstaluj z PyPI jako aspose-font.