Inleiding
Compact Font Format (CFF) is het binaire glyph-beschrijvingsformaat dat wordt gebruikt in OpenType lettertypen met een PostScript-compatibele outline-engine. Aspose.Font FOSS voor Python biedt een speciale set klassen onder de aspose_font.cff namespace voor het lezen en inspecteren van CFF-gegevensstructuren: CffFont, CffCharset, CffEncoding, CffDict, CffIndex en Type2Interpreter. Deze post loopt door hoe CFF-lettertypen te laden, hun interne tabellen te navigeren, en charstring-programma’s te interpreteren met behulp van de bibliotheek.
Het pakket heeft een MIT-licentie. Installeer het met pip install aspose-font>=1.0.0.
Belangrijkste kenmerken
Laden van een CFF-lettertype
FontLoader.open() detecteert CFF-formaat automatisch — geef ofwel een losstaand .cff-bestand of een OTF-bestand dat een CFF-outline-tabel bevat. Het geretourneerde object is een CffFont (toegankelijk via de cff_font-eigenschap op TtfFont voor OTF-bestanden).
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 — Glyph-ID’s naar namen in kaart brengen
CffCharset koppelt glyph-ID’s (GIDs) aan PostScript glyph-namen. Gebruik standard() om de standaard ISO Adobe-tekenset te verkrijgen of from_reader() om een tekenset te parseren uit binaire CFF-gegevens. De name_for() methode retourneert de PostScript naam voor een GID, en gid_for() voert de omgekeerde zoekopdracht uit.
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-codering — Unicode-naar-GID-mapping
CffEncoding behandelt de CFF-coderingstabel, die tekencodes naar glyph-ID’s mappt. standard() retourneert de standaardcodering, expert() retourneert de expertcodering, en from_reader() parseert een aangepaste codering uit binaire CFF-gegevens. Gebruik unicode_to_gid() om een GID op te zoeken op basis van een Unicode-codepunt en get_all_codepoints() om alle toegewezen codepunten te enumereren.
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-woordenboekparsing
CFF-lettertypen slaan top-level en private metadata op in woordenboeken. CffDict.from_bytes() parseert een ruwe CFF DICT-blob en geeft je get() en set() toegang via de operator-sleutel. TopDict.from_dict() specialiseert dit voor top-level CFF-woordenboeken, en PrivateDict.from_dict() doet hetzelfde voor private DICTs.
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-indexstructuren
CffIndex representeert een CFF INDEX-datastructuur — een lengte-geprefixed array van variabele-lengte byte-strings die worden gebruikt voor charstrings, subrs en naamtabellen. from_reader() parseert een INDEX vanuit een binaire lezer en het resultaat is indexeerbaar met een geheel getal.
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)}")
Interpretatie van Type-2-charstring
Type2Interpreter voert een Type 2 charstring-programma uit (het compacte PostScript-achtige formaat dat wordt gebruikt in CFF-lettertypen) en produceert een GlyphPath van omtrekcommando’s. Roep interpret() aan met de charstring-bytes en het bijbehorende private dictionary. Dit stelt je in staat om ruwe glyph-omtrekken te extraheren uit CFF-charstrings zonder een volledige PostScript interpreter.
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)
Snelstart
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)}")
Ondersteunde formaten
| Formaat | Extensie | Lezen | Schrijven |
|---|---|---|---|
| CFF | .cff | ✓ | ✓ |
| OTF | .otf | ✓ | ✓ |
| TTF | .ttf | ✓ | ✓ |
| WOFF | .woff | ✓ | ✓ |
| WOFF2 | .woff2 | ✓ | ✓ |
| EOT | .eot | ✓ | ✓ |
| TYPE1 | .pfb / .pfa | ✓ | ✓ |
Open source & licenties
Aspose.Font FOSS voor Python is MIT-licentie. Broncode staat op GitHub op aspose-font-foss/Aspose.Font-FOSS-for-Python. Installeer vanaf PyPI als aspose-font.