はじめに
pdf-libで請求書や納品書を作ろうとすると、多くの人が最初につまずくのが日本語です。英数字はすんなり出るのに、「請求書」と書こうとした瞬間にエラーになる、あるいは文字が全部消えてしまう——そんな経験はないでしょうか。
これはバグではなく、PDFというフォーマットの仕様上の話なんです。この記事では、なぜ日本語がそのままでは出せないのか、そしてどうやってフォントを埋め込み、しかもファイルを重くしすぎずに済ませるのかを解説します。
なぜ日本語がそのまま出せないのか
標準フォントに日本語がない
PDFには「標準14フォント」と呼ばれる、どんなビューアでも表示できる基本フォントが定義されています。ただ、その中身はHelveticaやTimes Romanといった欧文フォントばかり。日本語のグリフ(字形)は一つも含まれていません。
pdf-libもこの標準フォントを前提にしているため、初期状態では日本語を描画できません。「あ」や「請」に対応する字形が、そもそもPDFの中に存在しないからです。
埋め込みという解決策
ではどうするか。答えはシンプルで、日本語フォントのファイル自体をPDFの中に同梱することです。これを「フォントの埋め込み」と呼びます。
日本語対応のフォント(NotoやIPAなど)を用意する
fontkitを有効にしてフォントを埋め込み可能にする
埋め込んだフォントを指定してテキストを配置
埋め込んでしまえば、そのPDFはどの環境で開いても——相手のPCに日本語フォントが入っていなくても——同じ見た目で表示されます。帳票のように「相手に届ける」書類では、これが安心につながります。
フォントを埋め込むと重くなる問題
数MBのフォントがそのまま乗る
埋め込みには落とし穴があります。日本語フォントは、収録している文字数が膨大です。ひらがな・カタカナ・漢字・記号まで含めると、フォントファイルは数MBに達することも珍しくありません。
これをそのままPDFに埋め込むと、たった1枚の請求書が数MBのファイルになってしまうのです。メール添付やストレージ保管を考えると、これは無視できない問題です。
フルセット埋め込みの代償
1文字しか日本語を使わなくても、フォント全体を埋め込めばフォント全文字ぶんの容量が乗ります。帳票を大量に生成・保管する運用では、この積み重ねが効いてきます。
帳票で実際に使う文字は少ない
ここで発想を変えます。請求書に登場する日本語は、実はそれほど多くありません。「請求書」「御中」「合計」「消費税」、あとは取引先名や商品名くらいです。
数千文字ある日本語フォントのうち、1枚の帳票で使うのはせいぜい数十〜数百文字。使わない文字まで埋め込むのは、明らかに無駄なんです。
サブセット化で軽くする
使う文字だけを取り出す
そこで登場するのが**サブセット化(subsetting)**です。これは、フォントの中から「実際に使う文字の字形だけ」を抜き出して埋め込む技術です。
数千文字ぶんの字形が丸ごと乗り、1ファイルが数MB規模に膨らむ
帳票に登場する数十〜数百文字ぶんだけ。ファイルは大幅に軽量化される
pdf-libではfontkitを組み合わせ、埋め込み時にサブセット化を有効にすることで、この最適化が効くようになります。見た目はフルセットとまったく同じで、容量だけが小さくなる——いいとこ取りの手法です。
効果と実務上の注意
サブセット化の効果は劇的です。数MBあったPDFが、数百KB以下にまで落ちることも珍しくありません。大量の帳票を扱う輸入卸の運用では、この差が保管コストと取り回しに直結します。
一点だけ注意があります。サブセット化は「生成時に使う文字」を前提に字形を絞り込むため、あとからPDF内のテキストを別の文字に編集する用途には向きません。ただ帳票は生成したら確定するものなので、実務ではほぼ問題になりませんでした。
まとめ
日本語PDFの鬼門であるフォント埋め込みは、「標準フォントに日本語がない → だから埋め込む → でも重い → サブセット化で軽くする」という流れで整理すると、すっきり理解できます。
- 標準フォントに日本語の字形は含まれていない
- 相手の環境に依存せず表示するにはフォントの埋め込みが必要
- フルセット埋め込みはファイルが重くなる
- サブセット化で「使う文字だけ」を埋め込めば、見た目そのままで大幅に軽量化できる
この技術があってはじめて、コードによる帳票生成が実用に耐えます。全体像は 請求書・納品書PDFの自動生成 で、帳票に流し込む会社情報の管理は 宛先・自社プロファイルのマスタ管理 で解説しています。