記事一覧

gpdf で IPAex ゴシックを使うには?

ipaexg.ttf を gpdf.WithFont で登録する。IPAex は Regular 1 ウェイトのみなので、Bold は合成か明朝ペアで対応する。

著者: gpdf team

質問を言い換えると

gpdf のドキュメントで、IPA (情報処理推進機構) が配布している IPAex ゴシック を使いたい。用途はだいたい決まっていて、e-Tax の PDF 添付、官公庁提出書類、あるいは 2010 年前後から IPAex に統一してきたハウススタイルの踏襲。詰まるのはいつも 3 点 — どのファイルを拾うか、Bold がない問題、そして IPA フォントライセンス v1.0 の条件。

速答

ipaexg.ttfgpdf.WithFont("IPAexGothic", bytes) で登録し、デフォルトに設定する。Bold は template.Bold() での合成か、IPAex 明朝をペア登録して明朝で強調する古典的な方法で対処。バイナリ配布時はライセンス全文を同梱する。

動くコード

package main

import (
    "log"
    "os"

    "github.com/gpdf-dev/gpdf"
    "github.com/gpdf-dev/gpdf/document"
    "github.com/gpdf-dev/gpdf/template"
)

func main() {
    font, err := os.ReadFile("ipaexg.ttf")
    if err != nil {
        log.Fatal(err)
    }

    doc := gpdf.NewDocument(
        gpdf.WithPageSize(gpdf.A4),
        gpdf.WithMargins(document.UniformEdges(document.Mm(25))),
        gpdf.WithFont("IPAexGothic", font),
        gpdf.WithDefaultFont("IPAexGothic", 10.5),
    )

    page := doc.AddPage()
    page.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Text("請求書", template.FontSize(24), template.Bold())
            c.Text("令和8年4月17日発行")
            c.Text("金額: ¥100,000 (税込)")
        })
    })

    data, err := doc.Generate()
    if err != nil {
        log.Fatal(err)
    }
    if err := os.WriteFile("invoice.pdf", data, 0o644); err != nil {
        log.Fatal(err)
    }
}

moji.or.jp/ipafont から IPAex00401.zip を落として ipaexg.ttfmain.go の隣に置き、go run main.go10.5 pt は Word 互換で違和感のない標準サイズ、25 mm マージンは日本の A4 ビジネス文書の慣習。

IPA / IPAex のどのファイルを使うか

zip を開くと TTF が 3 つとライセンス本文が入っている。名前がそっくりで間違えやすい:

ファイル中身
ipaexg.ttfIPAex ゴシック — サンセリフ、Latin はプロポーショナル。一般的な書類はこれ。
ipaexm.ttfIPAex 明朝 — セリフ、Latin はプロポーショナル。長文本文やゴシックと組んでの強調用。
ipag.ttfIPA ゴシック (ex なし) — サンセリフ、Latin が等幅。今はあまり使わない。

"ex" は extended proportional の略で、Latin を CJK 全角の格子から外してプロポーショナルにした版。旧 IPA ゴシック (ipag.ttf) は英数字まで全角幅で並ぶため、和英混在文書では間延びして見える。URL や金額や商品コードが必ず入る業務文書なら、ほぼ間違いなく IPAex (ipaexg/ipaexm) を選ぶ。

既存プロジェクトで ipag.ttf を使っているなら、理由はだいたい歴史的経緯 (IPA ゴシック初版が 2003 年、IPAex は 2010 年リリース)。ファミリ名を IPAexGothic に揃えて ipaexg.ttf に差し替えれば、コード側は 1 行変更で済む。

Bold がない問題への対処

IPAex は Regular のみ 1 ウェイト。Noto Sans JP が Thin から Black まで 9 ウェイト出しているのと比較すると見劣りするポイントで、IPAex を採用検討して断念する最大の理由はこれ。

gpdf での対処は 2 通り。

合成ボールド。 template.Bold() が Regular のグリフにストロークを重ねて太く見せる。タイポグラフィ的には「本当のボールド」(専用デザインされた太字アウトライン) とは別物だが、10 pt 以上の見出し・表ラベル用途なら肉眼ではほぼ見分けがつかない:

c.Text("合計金額", template.Bold())

明朝ペアで強調する。 日本語組版の古典的な強調手法は「太字にする」ではなく「明朝とゴシックを切り替える」。両ファミリを登録して場面で使い分ける:

gothic, _ := os.ReadFile("ipaexg.ttf")
mincho, _ := os.ReadFile("ipaexm.ttf")

doc := gpdf.NewDocument(
    gpdf.WithFont("IPAexGothic", gothic),
    gpdf.WithFont("IPAexMincho", mincho),
    gpdf.WithDefaultFont("IPAexGothic", 10.5),
)

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(12, func(c *template.ColBuilder) {
        c.Text("請求書", template.FontFamily("IPAexMincho"), template.FontSize(24))
        c.Text("ご請求内容は下記の通りです。")
    })
})

招待状や式典用の案内状、それから官公庁向けの公式文書でよく見る組み合わせ。見出しを明朝にし、本文をゴシックにするとフォーマル寄りの紙面になる。e-Tax 添付書類や税務署提出用の帳票なら、この組み合わせのほうが違和感なく収まる。

IPA フォントライセンスの扱い

IPAex は SIL OFL ではなく IPA フォントライセンス v1.0 (OSI 承認済み)。基本は寛容だが、2 点だけ確認しておく:

  1. ライセンス本文の同梱が必要。 フォントバイナリを配布する先にライセンス全文が付いている必要がある。//go:embed で TTF を Go バイナリに焼く場合、同時に LICENSES/IPA-FONT-1.0.txt を置いて NOTICE から参照しておけば問題ない。
  2. フォントのリネーム禁止。 TTF 自体を改変して再配布する場合、"IPA" や "IPAex" を含まない別名にする必要がある。ただしサブセット化はこれに該当しない — ライセンス第 3 条第 4 項が明示的に、フォントを使って作成した「出力文書」(Derivative Document) にはこの制約が及ばないと書いている。

つまり、gpdf が doc.Generate() 時にグリフをサブセット化して PDF に埋め込む行為は license 上セーフ。PDF ファイル自体はフォントプログラムの再配布ではなく「フォントを使って作った文書」扱いになる。

補足として、gpdf のコア OSS リポジトリには IPAex を置いていない (golden file テスト用は Noto 系の SIL OFL フォントを使っている)。これは下流のユーザが、自プロジェクトの LICENSE との組み合わせで IPA ライセンスの整合性をわざわざ確認せずに済むようにするため。アプリケーション側で IPAex を使うのは各プロジェクトの判断で問題ない。

IPAex ゴシック vs Noto Sans JP、どっちを選ぶか

比較軸IPAex ゴシックNoto Sans JP
ウェイト数1 (Regular のみ)9 (Thin 〜 Black)
ライセンスIPA フォントライセンス v1.0SIL OFL 1.1
Latin 扱いIPAex はプロポーショナル / IPA は等幅プロポーショナル
初期インストール一部の日本語 Linux ディストロ、TeX Live ptex-fontsAndroid、ChromeOS
よく使われる場面官公庁・税務・学術提出商用 Web、国際向け
ファイルサイズ7.5 MB (ゴシック単体)5 MB (Regular 単体)

e-Tax の PDF 添付、裁判所提出書類、学会への論文提出 — つまり出力が日本の制度的な窓口を通るときは IPAex を選ぶ。採点者・レビュア・OCR ツールが IPA に合わせて調整されている。それ以外は Noto Sans JP で十分。レンダリング結果はどちらも実用上そっくりで、選ぶ基準は見た目ではなく「出力先のエコシステムがどちらに馴染んでいるか」。

関連記事

gpdf を使ってみる

gpdf は Go の PDF 生成ライブラリ。MIT、外部依存ゼロ、ネイティブ CJK 対応。

go get github.com/gpdf-dev/gpdf

⭐ GitHub でスター · ドキュメントを読む