Pythonでフォントをサブセット化する方法【フォント軽量化】

公開日:  

python font


Pythonでフォントをサブセット化(使う文字だけを抽出して軽量化)する方法を紹介します。

環境

  • Windows 10
  • Python 3.6.2

経緯

ある日、自分が運用しているウェブサイトのフォントを変えたいなと思いました。
それまでは Google Fonts から良さそうなものを選択して使っていました。なのでまた Google Fonts でフォントを探したのですが、日本語に対応しているフォントがまだまだ少なく、気に入るものが見つかりませんでした。

早々に Google Fonts は諦めて、ネットで検索してフリーフォントを探すことにしました。
単にフリーフォントと検索するだけで様々なフォントが見つかり、その中に気に入ったものがあったため、それを使うことにしました。

ただ、フォントファイルのサイズを見ると5MBを超える大きさでした。日本語フォントなのでしょうがないとも思いつつ、軽量化する方法はないかとネットで調べると、フォントを「サブセット化」するという技があることを知りました。

フォントのサブセット化とは

フォントのサブセット化とはフォントの中から特定の文字(自分で指定可能)だけを抽出してフォントを再構成することです。一部の文字だけを抽出しているので元のフォントより軽量になったフォントを使用できます。

インストール

ここから実際にフォントをサブセット化するやり方を書いていきます。
Python はあらかじめインストールされているものとします。

fonttools をインストールしましょう。この中にフォントをサブセット化するツールが含まれています。

pip install fonttools

フォントを woff2 形式にしたい場合は以下もインストールする必要があります。

pip install brotli

これで必要なものはインストールできました。

フォントをサブセット化する

fonttools をインストールしたときに付属する pyftsubset というプログラムを使用することでフォントをサブセット化できます。

下記が使用例です。
otf 形式のフォントファイルをサブセット化し、woff2 形式のフォントを作成しています。

pyftsubset "./original.otf" --text-file="./chars.txt" --layout-features=* --flavor=woff2 --output-file="./subset.woff2"
  • 第一引数 元のフォントファイルを指定します。
  • --text-file サブセット化後のフォントに含みたい文字を記載したテキストファイルを指定します。
  • --layout-features CSSでfont-feature-settingsを使用したい場合は指定します。使わないなら不要です。
  • --flavor 作成したいフォントの形式を指定します。
  • --output-file 作成後のフォントのファイルパスを指定します。

--text-file に指定するファイルですが、ただの文字だけ書いてあるテキストファイルを用意すれば良いです。
例えば、半角英数字記号だけを抽出したい場合は以下をファイルに記載します。

   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

使う文字はどうやって決める?

フォントのサブセット化の方法は分かりましたが抽出したい文字(--text-fileで指定する文字)はどうやって決めたら良いでしょうか?

  • 第一水準漢字+記号+ローマ字+カタカナ+ひらがな を使う
    よく使う文字だけを使う方法です。ネットで「第一水準漢字」などと検索すると簡単に出てきます。

  • HTMLファイルからテキストを抽出する(静的サイトの場合)
    静的サイトの場合、ページのHTMLファイルからテキストを抽出して使用する方法があります。
    実際に使用している文字だけを使うのでフォントサイズはだいぶ小さくなると思います。
    HTMLファイルからテキストを抽出するには、自分でプログラムを作ってもいいですし、使えそうなツールも公開されています。

終わりに

以上でフォントをサブセット化する方法の紹介を終わります。



関連記事