フォントのサブセット化には pyftsubset が便利だった

仕事で Google の Noto Serif Japanese フォントを使う必要があり、そのままだと Regular だけで 5MB あるので、 Subset 化する必要があった。コマンドラインから簡単にできるものを探すのにやや時間がかかったので、メモしておく。

色々試した結果、 Python 製の fonttools に入っている pyftsubset が優秀だったので、それを使った。

https://github.com/fonttools/fonttools

使い方

  1. NotoSerifJP-Regular をダウンロードする https://fonts.google.com/noto/specimen/Noto+Serif+JP/about

  2. fonttools をインストール

1
pip install fonttools
  1. コマンドを実行
1
pyftsubset public/fonts/NotoSerifJP-Regular.otf --text=こんにちは

もしくはファイルから指定できる。イケてる。

1
pyftsubset public/fonts/NotoSerifJP-Regular.otf --text-file=./font-subset.txt

他に試したもの

Node.js 製の fontmin もある。

https://github.com/ecomfe/fontmin

が、自分が試した限りは下記のような問題があった。

  • あんまりメンテナンスされていなそう
  • ESM モジュールに対応していないので、フォーク版をインストールする必要あり
  • otf には対応していないので、一旦 ttf に変換する必要がある

ESM に対応していないので、このようなエラーで進めない。

1
2
3
npx fontmin -t "こんにちは" NotoSerifJP-Regular.otf

Error [ERR_REQUIRE_ESM]: require() of ES Module /home/kazuya/.npm/_npx/4202e1329b3b026c/node_modules/meow/index.js from /home/kazuya/.npm/_npx/4202e1329b3b026c/node_modules/fontmin/cli.js not supported.

これを回避するには、 npx fontmin-esm とする必要がある。

また、 otf サポートされていない問題は特に面倒そうだったので、やめた。というかできなかった。 otf に対して fontmin を適用しようとすると、このようなエラーで進めない。

1
RangeError: Offset is outside the bounds of the DataView

オンラインで otf から ttf に変換するツールも試したが、なぜかサイズが 7kb になったりして変換できなかった。

他にも PHP 製のツールや Node.js + WASM のツールがあったが、いまいち使い方が分からなかったので敬遠した。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy