Aspose.Font が Python で WOFF2 用に Brotli 圧縮を使用する方法

Aspose.Font が Python で WOFF2 用に Brotli 圧縮を使用する方法

WOFF2(Web Open Font Format 2)は、Google が開発した汎用のロスレス圧縮アルゴリズムである Brotli を使用してグリフデータを圧縮します。Aspose.Font FOSS for Python は Brotli のすべての操作を内部で処理するため、外部の圧縮ライブラリをインストールする必要はありません。バンドルされた BrotliEncoder と BrotliDecoder クラスは、標準の WOFF2 変換パス外で任意のデータを圧縮または解凍する必要がある場合に、低レベルで使用できます。

ステップバイステップガイド

Step 1: パッケージをインストール

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

Step 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 のマジックバイトを検出し、Woff2Font インスタンスを構築する前にグリフストリームを展開するために BrotliDecoder を呼び出します。

ステップ 5: 低レベル Brotli エンコーディング

内部 API: BrotliEncoder and BrotliDecoder はリリース間で変更される可能性のある内部ユーティリティです。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 デコード

Brotli 圧縮データをデコードするには、BrotliDecoder.decode を使用してください:

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 デコードと逆テーブル変換の両方が適用されます。

参照

 日本語