مقدمه

قالب قلم فشرده (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 — نگاشت شناسه‌های گلیف به نام‌ها

CffCharset شناسه‌های گلیف (GIDs) را به نام‌های گلیف PostScript نگاشت می‌کند. برای دریافت مجموعه کاراکتر استاندارد ISO Adobe از standard() استفاده کنید یا برای تجزیه یک مجموعه کاراکتر از داده‌های باینری CFF از from_reader() استفاده کنید. متد 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 — نگاشت یونیکد به GID

CffEncoding جدول کدگذاری CFF را مدیریت می‌کند که کدهای کاراکتر را به شناسه‌های گلیف (GID) نگاشت می‌دهد. standard() کدگذاری استاندارد را برمی‌گرداند، expert() کدگذاری متخصص را برمی‌گرداند، و from_reader() یک کدگذاری سفارشی را از داده‌های باینری CFF تجزیه می‌کند. برای یافتن یک GID بر اساس نقطه کد یونیکد از unicode_to_gid() استفاده کنید و برای فهرست کردن تمام نقاط کد نگاشته‌شده از 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 یک ساختار داده INDEX CFF را نشان می‌دهد — آرایه‌ای با پیشوند طول که شامل رشته‌های بایتی با طول متغیر است و برای 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 نوع ۲

Type2Interpreter یک برنامه Type 2 charstring (فرمت فشرده شبیه PostScript که در فونت‌های CFF استفاده می‌شود) اجرا می‌کند و یک GlyphPath از دستورات خط‌کشی تولید می‌سازد. با interpret() بایت‌های charstring و دیکشنری خصوصی مرتبط را صدا بزنید. این امکان را می‌دهد تا خطوط گلیف خام را از charstringهای CFF بدون نیاز به یک مفسر کامل 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 نصب کنید.


آغاز کار

منابع مرتبط