フォント
フォントの登録
ドキュメント作成時に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),
)