2022年04月21日頃に、JavaScriptでPDFを生成するライブラリ『PDF-LIB』で、フォント サブセット(subset)化に失敗する現象を解決しました。その時の個人的な備忘録です。
『PDF-LIB』は、フォントの利用に『@pdf-lib/fontkit』を使います。フォントはサブセット化(必要なデータだけ格納)でき、ファイルサイズを減らせます。しかし、一部の文字が表示されなくなる「サブセット化失敗」のバグがあります。
PDF-LIB
https://pdf-lib.js.org/@pdf-lib/fontkit
https://github.com/Hopding/fontkit 私は「BIZUDPGothic-Regular.ttf」を使うことでこのバグに遭遇しました。
BIZUDPGothic-Regular.ttf
https://github.com/googlefonts/morisawa-biz-ud-gothic このバグは、『PDF-LIB』の作者は認識していて、『@pdf-lib/fontkit』のバグなので、自分は対処しないと回答しています。
custom font font subset with Chinese font does not work properly
https://github.com/Hopding/pdf-lib/issues/494 『@pdf-lib/fontkit』は更新が止まっています。この『fontkit』の本家は現在1.8.1で、サブセット化のバグが1.8.0で取れていると報告されています。
fontkit fails to create working subset for some fonts
https://github.com/foliojs/fontkit/issues/188 『@pdf-lib/fontkit』は、『fontkit』を『PDF-LIB』用に改造してあり、「fontkit.umd.js」は約4万4700行あります。このコードと、本家の『fontkit』を見比べて、サブセット化のバグ解消について実験をおこないました。
「subset」「Subset」でコードを検索して、おおまかな処理の当たりを付けて、その後、実際にどの部分が処理に使われているか絞り込んでいきました。そして怪しい変数の値を見て、原因を探っていきました。
最終的に「fontkit.umd.js」の4万940行あたりの「TTFSubset」の「prototype」の「encode」に、以下のような追記をおこないました。これで私の場合の問題は解決しました。
this.loca = {
offsets: []
,version: this.font.loca.version // 修正箇所
};
他の方の参考になるかもしれないので、記録を残しておきます。