PDF-LIB
PDFを生成するAPIを開発することになり、今回はPDF-LIBを使ってみることにしました。
発生した問題
今回はテンプレートとして用意されているPDFに対して文字や線を配置していくような処理で、2日ほどの作業でAPIが動作しました。デプロイして動作確認をしていると、PDFのファイルサイズが極端に大きくなっていることに気づきました。テンプレートのPDFは300KB程度なのに対して、出力されたPDFは14MBになっていました。
フォントのサブセット化
PDF-LIBではデフォルトでフォントがサブセット化されずに埋め込まれていて、サブセット化するには明示的に指定する必要がありました。以下のエントリーではたぬき油性マジック
を埋め込んだPDFが5.3MBになっていて、それをサブセット化したら7KBになったようです。
私はNotoSansMonoCJKjp-Regular.otf
を利用していて、それがそのままPDFに埋め込まれてしまったようです。以下のようなコードでフォントの埋め込みのサブセット化を有効にします。
const font = await pdfDoc.embedFont(fontBytes, { subset: true });
サブセット化の失敗
サブセット化を有効にしたのですが、今度はPDFにフォントが埋め込まれずに文字が出力されなくなってしまいました。以下のエントリーではこの問題についてまとめられていました。
解決方法
fontkitを修正してフォントのサブセット化を実現する方法もあるようですが、たぬき油性マジック
ではフォントのサブセット化ができていたことから、サブセット化がうまくいくフォントを調べて利用するという解決方法もあるかと思いました。
こういう時はIPAフォントかなと思い、IPAexゴシック(Ver.004.01)
をダウンロードしました。
IPAexゴシックではフォントのサブセット化がうまくいき、PDFのファイルサイズを小さくすることができました。
その他に利用可能だったフォント
私の場合、これまでNotoSansMonoCJKjp-Regular.otf
を利用してきました。IPAexゴシックだとフォントの感じが少し違っていたため、PDF-LIBでサブセット化が有効になる他のフォントをさがしました。
源真ゴシックに等幅フォントがあり、PDF-LIBでサブセット化も大丈夫だったので、これを利用することにしました。