مقدمه
WOFF (Web Open Font Format) قالب استاندارد برای تحویل فونتها در وب است. WOFF 1 یک فونت TrueType یا CFF را با فشردهسازی zlib میپیچد؛ WOFF 2 به جای آن از فشردهسازی Brotli استفاده میکند و معمولاً نسبت فشردهسازی 20-30٪ بهتری را به دست میآورد. هر دو قالب توسط تمام مرورگرهای مدرن پشتیبانی میشوند و همچنان قالب توصیهشده برای تحویل تایپوگرافی وب باقی ماندهاند.
Aspose.Font FOSS برای Python اکنون WOFF و WOFF2 را از طریق یکپارچه Font کلاس. این کلاس همان مجموعه ویژگیها را فراهم میکند (font_name, font_family, num_glyphs), یک گزینهٔ اختیاری metadata_xml بلوک، یک inner_font دسترسدهنده که مقدار پایهٔ TtfFont، و یک to_bytes() متد برای تبدیل فرمت.
این کتابخانه در PyPI به عنوان aspose-font منتشر شده و تحت مجوز MIT License بدون وابستگیهای تجاری اجباری ارائه میشود.
ویژگیهای کلیدی
بارگذاری فونتهای WOFF و WOFF2
از FontLoader.open برای بارگذاری یک فایل WOFF یا WOFF2 استفاده کنید. لودر بهصورت خودکار قالب را از بایتهای جادویی فایل تشخیص میدهد:
from aspose_font import FontLoader
# Load WOFF 1
woff = FontLoader.open("MyFont.woff")
print(f"Name : {woff.font_name}")
print(f"Family : {woff.font_family}")
print(f"Style : {woff.font_style}")
print(f"Glyphs : {woff.num_glyphs}")
print(f"Type : {woff.font_type}")
# Load WOFF 2
woff2 = FontLoader.open("MyFont.woff2")
print(f"Name : {woff2.font_name}")
print(f"Glyphs : {woff2.num_glyphs}")
FontLoader.open یک WoffFont برای فایلهای .woff و یک Woff2Font برای فایلهای .woff2 برمیگرداند. هر دو کلاس همان رابط پایه Font را پیادهسازی میکنند، بنابراین کدی که خصوصیات را میخواند برای هر دو فرمت یکسان است.
بررسی متادیتای WOFF
فایلهای WOFF ممکن است یک بلوک متادیتای XML اختیاری شامل اطلاعات مجوز، اعتبارها و توصیف قلم را شامل شوند. از طریق ویژگی metadata_xml به آن دسترسی پیدا کنید:
from aspose_font.loader import FontLoader
font = FontLoader.open("MyFont.woff")
xml = getattr(font, "metadata_xml", None)
if xml:
print("WOFF metadata XML:")
print(xml[:500])
else:
print("No metadata block in this WOFF file")
ویژگی metadata_xml یک str حاوی XML خام برمیگرداند، یا None اگر قلم بلوک متادیتایی نداشته باشد. هر دو WoffFont و Woff2Font این ویژگی را نمایان میکنند.
دسترسی به جداول داخلی TTF
WOFF و WOFF2 یک قلم TrueType را میپیچند. ویژگی inner_font قلم زیرین TtfFont را با دسترسی کامل به مجموعه جداول OpenType آن فراهم میکند:
from aspose_font.loader import FontLoader
font = FontLoader.open("MyFont.woff")
inner = getattr(font, "inner_font")
tables = inner.ttf_tables # TtfTableSet
print(f"Units/em : {tables.head.units_per_em}")
print(f"Ascender : {tables.hhea.ascender}")
print(f"Num glyphs : {tables.maxp.num_glyphs}")
print(f"Family name : {tables.name.best_name(1)}")
از طریق inner.ttf_tables میتوانید به تمام جداول استاندارد OpenType دسترسی داشته باشید: head، hhea، maxp، os2، name و post. برای جداولی که دسترسیگر نامگذاری شده ندارند، از inner.get_blob(tag) برای بازیابی بایتهای خام بر اساس برچسب OpenType استفاده کنید.
جفتهای کرن از یک قلم WOFF
get_kern_pairs() تمام جفتهای کرن تعبیهشده در قلم را برمیگرداند. هر KernPair شامل left (GlyphId)، right (GlyphId) و value (int، به واحدهای قلم) است:
from aspose_font import FontLoader
font = FontLoader.open("MyFont.woff")
pairs = font.get_kern_pairs()
print(f"Kern pairs: {len(pairs)}")
for pair in pairs[:5]:
print(f" {pair.left} + {pair.right} = {pair.value}")
جفتهای کرن در جدول kern داخلی TTF ذخیره میشوند. قلمهایی که به جای جدول kern ویژگیهای کرن OpenType GPOS را فراهم میکنند، همچنان لیست خالیای از این متد برمیگردانند.
تبدیل فرمت
FontConverter.convert بین فرمتهای قلم تبدیل میکند. برای مشخص کردن فرمت هدف از enum FontType استفاده کنید، سپس برای سریالسازی to_bytes() را فراخوانی کنید:
from aspose_font.loader import FontLoader
from aspose_font.converter import FontConverter
from aspose_font import FontType
from pathlib import Path
# TTF -> WOFF
ttf = FontLoader.open("MyFont.ttf")
woff = FontConverter.convert(ttf, FontType.WOFF)
Path("MyFont.woff").write_bytes(woff.to_bytes(FontType.WOFF))
# TTF -> WOFF2 (Brotli-compressed)
woff2 = FontConverter.convert(ttf, FontType.WOFF2)
Path("MyFont.woff2").write_bytes(woff2.to_bytes(FontType.WOFF2))
# WOFF -> WOFF2
existing_woff = FontLoader.open("MyFont.woff")
converted = FontConverter.convert(existing_woff, FontType.WOFF2)
Path("MyFont-from-woff.woff2").write_bytes(converted.to_bytes(FontType.WOFF2))
# WOFF2 -> WOFF (decompress back to WOFF 1)
existing_woff2 = FontLoader.open("MyFont.woff2")
woff1 = FontConverter.convert(existing_woff2, FontType.WOFF)
Path("MyFont-from-woff2.woff").write_bytes(woff1.to_bytes(FontType.WOFF))
تمام چهار مسیر تبدیل (TTF به WOFF، TTF به WOFF2، WOFF به WOFF2، WOFF2 به WOFF) توسط همان FontConverter.convert API پشتیبانی میشوند.
ساخت بسته قلم وب
WebFontBuilder.build یک بسته کامل قلم وب را از یک منبع TTF واحد تولید میکند و یک WebFontBundle حاوی CSS، HTML و داراییهای قلم برمیگرداند. برای ذخیره بسته روی دیسک، write_to را روی باندل فراخوانی کنید:
from aspose_font.web import WebFontBuilder
from aspose_font.loader import FontLoader
# Load a TTF source font
font = FontLoader.open("MyFont.ttf")
# Build the web font bundle (WOFF + WOFF2 assets, CSS, HTML)
bundle = WebFontBuilder.build(
font=font,
file_stem="MyFont",
include_woff=True,
font_display="swap",
preview_text="The quick brown fox",
instance_coordinates=None,
)
# Write the bundle's assets, CSS, and HTML to disk
written_paths = bundle.write_to("web-output")
print(f"Wrote {len(written_paths)} files to web-output/")
write_to فهرست مسیرهای فایلهایی که نوشته است را برمیگرداند. پارامتر font_display مستقیماً به توصیفگر CSS font-display نگاشت میشود و "auto"، "block"، "swap"، "fallback" یا "optional" را میپذیرد.
شروع سریع
نصب کتابخانه:
git clone https://github.com/aspose-font-foss/Aspose.Font-FOSS-for-Python.git
cd Aspose.Font-FOSS-for-Python
pip install -e .یک فونت WOFF را بارگذاری کنید و به WOFF2 تبدیل کنید:
from aspose_font.loader import FontLoader
from aspose_font.converter import FontConverter
from aspose_font import FontType
from pathlib import Path
# Load WOFF
font = FontLoader.open("MyFont.woff")
print(f"Font : {font.font_name}")
print(f"Glyphs : {font.num_glyphs}")
print(f"Type : {font.font_type}")
# Inspect metadata (if present) — WoffFont-specific property
xml = getattr(font, "metadata_xml", None)
print(f"Has metadata: {xml is not None}")
# Access inner OpenType tables — WoffFont-specific property
inner = getattr(font, "inner_font")
tables = inner.ttf_tables
print(f"Units/em: {tables.head.units_per_em}")
# Convert to WOFF2
woff2 = FontConverter.convert(font, FontType.WOFF2)
Path("MyFont.woff2").write_bytes(woff2.to_bytes(FontType.WOFF2))
print("Converted to WOFF2")
قالبهای پشتیبانیشدهٔ وبفونت
| فرمت | پسوند | Load | تبدیل به WOFF | تبدیل به WOFF2 |
|---|---|---|---|---|
| TTF | .ttf | بله | بله | بله |
| OTF | .otf | بله | بله | بله |
| WOFF | .woff | بله | — | بله |
| WOFF2 | .woff2 | بله | بله | — |
| EOT | .eot | بله | بله | بله |
| CFF | .cff | بله | بله | بله |
| TYPE1 | .pfb/.pfa | بله | بله | لطفاً متنی |
تمام قالبهای منبع از تبدیل به WOFF و WOFF2 از طریق FontConverter.convert پشتیبانی میکنند.
منبع باز و مجوزدهی
Aspose.Font FOSS برای Python تحت مجوز MIT منتشر شده است. میتوانید از آن در پروژههای شخصی، تجاری و منبع باز بدون هزینه استفاده کنید. کد منبع در GitHub موجود است و بسته بهصورت aspose-font از طریق PyPI توزیع میشود.