مقدمه

WOFF2 (Web Open Font Format 2) از Brotli به عنوان الگوریتم فشرده‌سازی خود استفاده می‌کند. بر خلاف WOFF 1 که از zlib استفاده می‌کند، WOFF2 Brotli را بر روی نمایه جدول گلیف پیش‌تبدیل‌شده اعمال می‌نماید و معمولاً ۲۰-۳۰٪ فشرده‌سازی بهتری نسبت به WOFF 1 به دست می‌آورد. این امر باعث می‌شود WOFF2 فرمت تحویل ترجیحی برای تایپوگرافی وب باشد.

Aspose.Font FOSS برای Python تمام عملیات Brotli را به‌صورت داخلی از طریق کلاس‌های بسته‌شده BrotliEncoder و BrotliDecoder مدیریت می‌کند. نیازی به brotli، brotlicffi یا بسته مشابهی خارجی نیست. تبدیل استاندارد فونت API هنگام تولید خروجی WOFF2 به‌صورت شفاف فشرده‌سازی Brotli را اعمال می‌کند.

این کتابخانه بر روی PyPI به عنوان aspose-font تحت مجوز MIT منتشر شده است.


ویژگی‌های کلیدی

تبدیل فونت‌ها به WOFF2

استفاده اصلی از Brotli در Aspose.Font فشرده‌سازی خودکار WOFF2 است. برای تولید یک فونت وب فشرده‌شده با Brotli از FontConverter.convert همراه با FontType.WOFF2 استفاده کنید:

from aspose_font.loader import FontLoader
from aspose_font.converter import FontConverter
from aspose_font import FontType
from pathlib import Path

# Load any supported format
font = FontLoader.open("MyFont.ttf")   # TTF, OTF, WOFF, EOT, CFF, TYPE1

# Convert to WOFF2 — Brotli applied internally
woff2 = FontConverter.convert(font, FontType.WOFF2)
output = woff2.to_bytes(FontType.WOFF2)

Path("MyFont.woff2").write_bytes(output)
print(f"WOFF2 output: {len(output)} bytes")

همچنین می‌توانید یک فایل WOFF 1 موجود را به WOFF2 تبدیل کنید تا فشرده‌سازی را ارتقا دهید:

from aspose_font.loader import FontLoader
from aspose_font.converter import FontConverter
from aspose_font import FontType
from pathlib import Path

woff = FontLoader.open("MyFont.woff")
woff2 = FontConverter.convert(woff, FontType.WOFF2)
Path("MyFont.woff2").write_bytes(woff2.to_bytes(FontType.WOFF2))
print("Upgraded WOFF 1 (zlib) -> WOFF2 (Brotli)")

در حال بارگذاری فونت‌های WOFF2

FontLoader.open به‌صورت خودکار داده‌های گلیف فشرده‌شده با Brotli را استخراج می‌کند:

from aspose_font.loader import FontLoader

woff2 = FontLoader.open("MyFont.woff2")
print(f"Name   : {woff2.font_name}")
print(f"Family : {woff2.font_family}")
print(f"Glyphs : {woff2.num_glyphs}")
print(f"Type   : {woff2.font_type}")

هیچ مرحله‌ای برای استخراج لازم نیست. بارگذار BrotliDecoder را بر روی جریان گلیف اعمال می‌کند قبل از ساختن نمونه Woff2Font.


کدگذاری سطح پایین Brotli

اطلاعیه داخلی API: BrotliEncoder and BrotliDecoder ابزارهای داخلی هستند (aspose_font._brotli). آنها بخشی از سطح عمومی API نیستند و ممکن است بین نسخه‌ها تغییر کنند. برای فشرده‌سازی فونت WOFF2، ترجیحاً FontLoader.open() به‌همراه Woff2Font، که به‌صورت شفاف Brotli را مدیریت می‌کند.

برای فشرده‌سازی داده‌های باینری دلخواه به‌صورت مستقل از عملیات فونت، BrotliEncoder داخلی یک پارامتر quality (۰-۱۱) را در اختیار می‌گذارد:

from aspose_font._brotli import BrotliEncoder  # internal API

data = b"Sample data to compress" * 200

# quality=11 = maximum compression; quality=0 = fastest
encoder = BrotliEncoder(quality=11)
compressed = encoder.encode(data)

ratio = len(compressed) / len(data)
print(f"Original   : {len(data)} bytes")
print(f"Compressed : {len(compressed)} bytes")
print(f"Ratio      : {ratio:.2%}")

BrotliEncoder.encode(data) bytes را می‌پذیرد و bytes را برمی‌گرداند. نمونهٔ رمزگذار برای فراخوانی‌های با تنظیمات کیفیت متفاوت قابل استفاده مجدد نیست — برای هر سطح کیفیت یک نمونهٔ جدید ایجاد کنید.


رمزشگایی سطح پایین Brotli

اطلاعیه داخلی API: به اطلاعیه بالا نگاه کنید — BrotliDecoder همچنین یک ابزار داخلی است.

BrotliDecoder.decode یک متد سطح‌کلاس است که هر بارگذاری Brotli را باز می‌کند:

from aspose_font._brotli import BrotliEncoder, BrotliDecoder  # internal API

original = b"Round-trip compression test" * 100

# Compress
encoder = BrotliEncoder(quality=6)
compressed = encoder.encode(original)
print(f"Compressed to {len(compressed)} bytes")

# Decompress
recovered = BrotliDecoder.decode(compressed)
assert recovered == original
print(f"Decompressed: {len(recovered)} bytes — data intact: {recovered == original}")

BrotliDecoder.decode یک بارگذاری bytes را می‌گیرد و bytes را برمی‌گرداند. این متد تمام بارگذاری را در یک فراخوانی پردازش می‌کند — هیچ رابط جریان‌داری وجود ندارد.


راهنمای سطوح فشرده‌سازی

پارامتر quality در BrotliEncoder.__init__ به سطوح کیفیت استاندارد Brotli نگاشت می‌شود:

QualitySpeedنسبت فشرده‌سازیکاربرد معمولی
0FastestLowestزمان واقعی / حساس به تأخیر
1-3Fastپایینداده‌های جریان‌دار
4-6BalancedMediumعمومی (توصیه‌شده)
7-9SlowHighمنابع ایستا
10-11SlowestHighestفایل‌های قلم، بایگانی

برای تولید فونت (WOFF2)، کیفیت ۱۱ بهترین حجم فایل را ارائه می‌دهد و در مسیر استاندارد FontConverter.convert استفاده می‌شود.


شروع سریع

نصب کتابخانه:

git clone https://github.com/aspose-font-foss/Aspose.Font-FOSS-for-Python.git
cd Aspose.Font-FOSS-for-Python
pip install -e .

یک TTF را به WOFF2 تبدیل کنید و فشرده‌سازی را تأیید کنید:

from aspose_font.loader import FontLoader
from aspose_font.converter import FontConverter
from aspose_font import FontType
from pathlib import Path

# Convert to WOFF2 (Brotli applied automatically)
ttf = FontLoader.open("MyFont.ttf")
woff2 = FontConverter.convert(ttf, FontType.WOFF2)
woff2_bytes = woff2.to_bytes(FontType.WOFF2)

# Compare sizes
ttf_bytes = ttf.to_bytes(FontType.TTF)
print(f"TTF   : {len(ttf_bytes)} bytes")
print(f"WOFF2 : {len(woff2_bytes)} bytes  ({len(woff2_bytes)/len(ttf_bytes):.1%} of TTF)")

Path("MyFont.woff2").write_bytes(woff2_bytes)
print("Done — WOFF2 saved")

منبع باز و مجوزدهی

Aspose.Font FOSS برای Python تحت مجوز MIT منتشر شده است. پیاده‌سازی Brotli بسته‌بندی‌شده در بسته تحت مجوز منبع باز خود قرار دارد. می‌توانید از این کتابخانه در پروژه‌های شخصی، تجاری و منبع باز بدون هزینه استفاده کنید.


شروع کار

منابع مرتبط