如何在 Python 中使用 Aspose.Font 对 WOFF2 进行 Brotli 压缩
WOFF2(Web Open Font Format 2)使用 Brotli 对其字形数据进行压缩,Brotli 是由 Google 开发的通用无损压缩算法。Aspose.Font 为 Python 提供的 FOSS 在内部处理所有 Brotli 操作——您无需安装任何外部压缩库。捆绑的 BrotliEncoder 和 BrotliDecoder 类可用于低层次操作,当您需要在标准 WOFF2 转换路径之外压缩或解压任意数据时。
分步指南
步骤 1:安装包
git clone https://github.com/aspose-font-foss/Aspose.Font-FOSS-for-Python.git
cd Aspose.Font-FOSS-for-Python
pip install -e .步骤 2:导入所需类
用于标准 WOFF2 操作:
from aspose_font import FontLoader
from aspose_font.converter import FontConverter # internal API — may change between releases
from aspose_font import FontType用于低级 Brotli 操作(内部 API — 可能在不同版本之间更改):
from aspose_font._brotli import BrotliEncoder, BrotliDecoder # internal API步骤 3:创建 WOFF2 字体(Brotli 压缩)
标准流程:将任意字体转换为 WOFF2。Brotli 压缩会自动应用。
from aspose_font import FontLoader
from aspose_font.converter import FontConverter # internal API — may change between releases
from aspose_font import FontType
from pathlib import Path
# Load a TTF or WOFF source
source = FontLoader.open("MyFont.ttf")
# Convert to WOFF2 — Brotli compression is applied internally
woff2 = FontConverter.convert(source, FontType.WOFF2)
output_bytes = woff2.to_bytes(FontType.WOFF2)
Path("MyFont.woff2").write_bytes(output_bytes)
print(f"WOFF2 size: {len(output_bytes)} bytes")压缩不需要额外的步骤。库在生成 WOFF2 输出时会在内部调用 BrotliEncoder。
步骤 4:加载并验证 WOFF2 字体
在加载 .woff2 文件时,库会在公开字体属性之前自动解压 Brotli 压缩的字形数据:
from aspose_font 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}")FontLoader.open 检测到 WOFF2 魔术字节并调用 BrotliDecoder 解压字形流,然后再构建 Woff2Font 实例。
步骤 5:低级 Brotli 编码
内部 API:
BrotliEncoderandBrotliDecoder是内部实用工具,可能在不同版本之间发生变化。对于 WOFF2 字体压缩,建议使用上文步骤 3-4 中显示的公共 API。
当需要使用 Brotli 压缩任意二进制数据时,直接使用 BrotliEncoder。quality 参数(0–11)控制压缩级别:
from aspose_font._brotli import BrotliEncoder # internal API
data = b"Hello, Brotli!" * 100 # Sample data to compress
encoder = BrotliEncoder(quality=11) # quality 11 = maximum compression
compressed = encoder.encode(data)
print(f"Original : {len(data)} bytes")
print(f"Compressed: {len(compressed)} bytes")
print(f"Ratio : {len(compressed)/len(data):.2%}")质量 11 在编码速度上付出代价,以获得最佳压缩率。质量 0 是最快的。对于 WOFF2 输出中的字体数据,库使用默认的质量级别。
步骤 6:低级 Brotli 解码
使用 BrotliDecoder.decode 解压 Brotli 压缩的数据:
from aspose_font._brotli import BrotliEncoder, BrotliDecoder # internal API
original = b"Hello, Brotli!" * 100
# Compress
encoder = BrotliEncoder(quality=6)
compressed = encoder.encode(original)
# Decompress
decoded = BrotliDecoder.decode(compressed)
assert decoded == original
print(f"Decoded {len(decoded)} bytes — matches original: {decoded == original}")BrotliDecoder.decode 是一个类方法,接受压缩后的字节并返回解压后的字节。没有流式 API —— 必须在一次调用中提供完整的压缩负载。
何时使用低级 Brotli API
当以下情况时,BrotliEncoder 和 BrotliDecoder 类很有用:
- 您需要在不依赖字体处理的情况下压缩或解压任意二进制负载(例如,压缩字体元数据或自定义数据块)。
- 您需要在将 Brotli 压缩的负载传递给 WOFF2 解析器之前预先验证其格式是否正确。
- 您正在构建需要已知压缩比数据的测试夹具。
对于所有标准字体操作(加载、转换、保存 WOFF2),您不需要低层的 API —— FontLoader.open 和 FontConverter.convert 会透明地处理 Brotli。
常见问题
该库是否需要外部的 brotli 包?
不需要。Aspose.Font 用于 Python 的 FOSS 捆绑了自己的 Brotli 实现。无需 brotli、brotlicffi 或类似的包。
该库在 WOFF2 中使用的压缩质量是多少?
该库使用默认的 WOFF2 输出质量级别。要在自定义压缩任务中控制质量级别,请使用 BrotliEncoder(quality=N),其中 N 的取值范围是 0(最快)到 11(最高压缩率)。
我可以直接解压 WOFF2 字形流吗?
WOFF2 字形数据使用 Brotli 解压缩与特定字体的转换(即 “transformed” 表格格式)的组合。仅对原始 Brotli 流进行解压缩不足以恢复可用的字体——必须通过 FontLoader.open 加载 WOFF2 文件,系统会同时执行 Brotli 解压缩和表格逆向转换。