フォント

フォントの登録

ドキュメント作成時にTrueTypeフォントを登録します:

fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")

doc := template.New(
    template.WithPageSize(document.A4),
    template.WithFont("NotoSansJP", fontData),
    template.WithDefaultFont("NotoSansJP", 12),
)

複数のフォントファミリー

用途に応じて複数のフォントを登録できます:

regular, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
bold, _ := os.ReadFile("fonts/NotoSansJP-Bold.ttf")
mono, _ := os.ReadFile("fonts/RobotoMono-Regular.ttf")

doc := template.New(
    template.WithFont("NotoSansJP", regular),
    template.WithFont("NotoSansJP-Bold", bold),
    template.WithFont("RobotoMono", mono),
    template.WithDefaultFont("NotoSansJP", 12),
)

FontFamily() でテキスト要素のフォントを切り替えます:

c.Text("Regular text")  // uses default NotoSansJP
c.Text("Bold heading", template.FontFamily("NotoSansJP-Bold"), template.FontSize(18))
c.Text("Code snippet", template.FontFamily("RobotoMono"), template.FontSize(10))

CJKサポート

gpdfは日本語、中国語、韓国語テキストをファーストクラスでサポートしています。CJK機能には禁則処理ルール(行頭・行末での特定文字の禁止)に基づく自動改行が含まれます。

fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")

doc := template.New(
    template.WithPageSize(document.A4),
    template.WithMargins(document.UniformEdges(document.Mm(20))),
    template.WithFont("NotoSansJP", fontData),
    template.WithDefaultFont("NotoSansJP", 12),
)

page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
    r.Col(12, func(c *template.ColBuilder) {
        c.Text("日本語テキストのサンプル", template.FontSize(18))
        c.Text("gpdfは純Go・ゼロ依存のPDF生成ライブラリです。")
        c.Text("CJKテキストの改行やレイアウトを正しく処理します。")
    })
})

多言語CJKドキュメント

複数のCJK言語を含むドキュメントでは、各フォントを個別に登録しFontFamily()で切り替えます:

jpFont, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")
scFont, _ := os.ReadFile("fonts/NotoSansSC-Regular.ttf")
krFont, _ := os.ReadFile("fonts/NotoSansKR-Regular.ttf")

doc := template.New(
    template.WithPageSize(document.A4),
    template.WithFont("NotoSansJP", jpFont),
    template.WithFont("NotoSansSC", scFont),
    template.WithFont("NotoSansKR", krFont),
    template.WithDefaultFont("NotoSansJP", 12),
)

page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("こんにちは", template.FontFamily("NotoSansJP"))
    })
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("你好", template.FontFamily("NotoSansSC"))
    })
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("안녕하세요", template.FontFamily("NotoSansKR"))
    })
})

CJKコンテンツのQRコード

QRコードは日本語を含むUnicodeコンテンツをサポートしています:

c.QRCode("こんにちは世界", template.QRSize(document.Mm(30)))

フォントサブセッティング

gpdfはTrueTypeフォントを自動的にサブセット化します — ドキュメントで実際に使用されるグリフのみが埋め込まれます。これにより、数万のグリフを含むCJKフォントでもファイルサイズを大幅に削減できます。

対応フォント形式

形式サポート
TrueType (.ttf)完全サポート
OpenType (.otf)部分サポート(TrueTypeアウトライン)
WOFF / WOFF2非サポート
Type 1非サポート

推奨フォント

フォント用途
Noto Sans JP日本語テキスト
Noto Sans SC簡体字中国語
Noto Sans KR韓国語テキスト
Noto Sansラテン文字・欧文テキスト
InterモダンなUI風ドキュメント
Roboto Monoコードや等幅テキスト

JSONスキーマでのフォント使用

JSONスキーマ使用時は、Goオプションでフォントを登録します:

fontData, _ := os.ReadFile("fonts/NotoSansJP-Regular.ttf")

schema := []byte(`{
    "page": {"size": "A4"},
    "body": [
        {"row": {"cols": [
            {"span": 12, "text": "日本語テキスト", "style": {"font": "NotoSansJP"}}
        ]}}
    ]
}`)

doc, err := template.FromJSON(schema, nil,
    template.WithFont("NotoSansJP", fontData),
)

次のステップ