要素

テキスト

最も基本的な要素。オプションのスタイリングでテキストを追加します:

c.Text("Hello, World!")
c.Text("Styled text", template.FontSize(18), template.Bold())
c.Text("Red centered", template.TextColor(pdf.Red), template.AlignCenter())

テキストオプション

オプション説明
FontSize(size)フォントサイズ(ポイント単位、デフォルト: 12)
Bold()太字
Italic()イタリック
FontFamily(name)登録済みフォントを使用
TextColor(color)前景色
BgColor(color)背景色
AlignLeft()左揃え(デフォルト)
AlignCenter()中央揃え
AlignRight()右揃え
Underline()下線装飾
Strikethrough()取り消し線装飾
LetterSpacing(pts)文字間の追加スペース
TextIndent(value)先頭行インデント

リッチテキスト

RichText() を使った混合スタイルのインラインテキスト:

c.RichText(func(rt *template.RichTextBuilder) {
    rt.Span("Normal text ")
    rt.Span("bold", template.Bold())
    rt.Span(" and ")
    rt.Span("red", template.TextColor(pdf.Red))
    rt.Span(" in one line.")
})
┌─────────────────────────────────────────────┐
│  Normal text bold and red in one line.      │
│              ^^^^     ^^^                   │
│              bold     red color             │
└─────────────────────────────────────────────┘

テーブル

ヘッダーとデータ行のテーブル:

// Basic table
c.Table(
    []string{"Name", "Age", "City"},
    [][]string{
        {"Alice", "30", "Tokyo"},
        {"Bob", "25", "New York"},
        {"Charlie", "35", "London"},
    },
)
┌──────────┬──────┬──────────┐
│  Name    │ Age  │  City    │ ← ヘッダー(太字)
├──────────┼──────┼──────────┤
│  Alice   │  30  │  Tokyo   │
│  Bob     │  25  │  New York│
│  Charlie │  35  │  London  │
└──────────┴──────┴──────────┘

スタイル付きテーブル

darkBlue := pdf.RGBHex(0x1A237E)
lightGray := pdf.RGBHex(0xF5F5F5)

c.Table(
    []string{"Product", "Category", "Qty", "Unit Price", "Total"},
    [][]string{
        {"Laptop Pro 15", "Electronics", "2", "$1,299.00", "$2,598.00"},
        {"Wireless Mouse", "Accessories", "10", "$29.99", "$299.90"},
        {"USB-C Hub", "Accessories", "5", "$49.99", "$249.95"},
        {"Monitor 27\"", "Electronics", "3", "$399.00", "$1,197.00"},
        {"Keyboard", "Accessories", "10", "$79.99", "$799.90"},
        {"Webcam HD", "Electronics", "4", "$89.99", "$359.96"},
    },
    template.ColumnWidths(30, 20, 10, 20, 20),
    template.TableHeaderStyle(
        template.TextColor(pdf.White),
        template.BgColor(darkBlue),
    ),
    template.TableStripe(lightGray),
)
┌─────────────┬────────────┬─────┬───────────┬──────────┐
│  Product    │  Category  │ Qty │Unit Price │  Total   │ ← ダークブルーに白文字
├─────────────┼────────────┼─────┼───────────┼──────────┤
│  Laptop Pro │ Electronics│  2  │ $1,299.00 │$2,598.00 │ ← 白背景
│  Wireless.. │ Accessories│ 10  │    $29.99 │  $299.90 │ ← グレーストライプ
│  USB-C Hub  │ Accessories│  5  │    $49.99 │  $249.95 │ ← 白背景
│  Monitor 27"│ Electronics│  3  │   $399.00 │$1,197.00 │ ← グレーストライプ
│  Keyboard   │ Accessories│ 10  │    $79.99 │  $799.90 │ ← 白背景
│  Webcam HD  │ Electronics│  4  │    $89.99 │  $359.96 │ ← グレーストライプ
└─────────────┴────────────┴─────┴───────────┴──────────┘

テーブルオプション

オプション説明
ColumnWidths(widths...)カラム幅のパーセンテージ(合計100にする必要あり)
TableHeaderStyle(opts...)ヘッダー行のスタイル
TableStripe(color)行の背景色を交互に切り替え
TableCellVAlign(align)垂直方向の配置: VAlignTop, VAlignMiddle, VAlignBottom

テーブルの垂直配置

c.Table(
    []string{"Align", "Short", "Long Content"},
    [][]string{
        {"Top", "A", "This is a longer text that wraps to multiple lines"},
        {"Middle", "B", "Another longer text for demonstration purposes"},
    },
    template.TableCellVAlign(document.VAlignMiddle),
)

画像

JPEGまたはPNG画像を追加します:

imgData, _ := os.ReadFile("photo.jpg")

c.Image(imgData)
c.Image(imgData, template.FitWidth(document.Mm(80)))
c.Image(imgData, template.FitHeight(document.Mm(50)))

画像オプション

オプション説明
FitWidth(value)指定幅にスケール
FitHeight(value)指定高さにスケール
WithFitMode(mode)フィットモード: FitContain, FitCover, FitStretch, FitOriginal
WithAlign(align)水平配置: AlignLeft, AlignCenter, AlignRight

画像フィットモード

// Contain: フィットするようスケール、アスペクト比維持(デフォルト)
c.Image(data, template.WithFitMode(document.FitContain))

// Cover: 埋めるようスケール、切り取りの可能性あり
c.Image(data, template.WithFitMode(document.FitCover))

// Stretch: 境界を埋める、歪みの可能性あり
c.Image(data, template.WithFitMode(document.FitStretch))

// Original: 元のサイズを使用
c.Image(data, template.WithFitMode(document.FitOriginal))

画像の配置

c.Image(data, template.FitWidth(document.Mm(40)), template.WithAlign(document.AlignCenter))
c.Image(data, template.FitWidth(document.Mm(40)), template.WithAlign(document.AlignRight))

リスト

箇条書きリスト

c.List([]string{
    "Declarative document definition",
    "All element types supported",
    "Style options (bold, italic, color, align)",
    "Header and footer support",
})
┌─────────────────────────────────────────────┐
│  • Declarative document definition          │
│  • All element types supported              │
│  • Style options (bold, italic, color, ...)  │
│  • Header and footer support                │
└─────────────────────────────────────────────┘

番号付きリスト

c.OrderedList([]string{
    "Text with styles",
    "Tables with headers",
    "Lists (ordered/unordered)",
    "Lines and spacers",
    "QR codes and barcodes",
})
┌─────────────────────────────────────────────┐
│  1. Text with styles                        │
│  2. Tables with headers                     │
│  3. Lists (ordered/unordered)               │
│  4. Lines and spacers                       │
│  5. QR codes and barcodes                   │
└─────────────────────────────────────────────┘

リストオプション

オプション説明
ListIndent(value)左からのインデント

罫線

オプションのカラーと太さを持つ水平罫線:

// Default line (gray, 1pt)
c.Line()

// Colored line
c.Line(template.LineColor(pdf.Red))
c.Line(template.LineColor(pdf.Blue))

// Custom thickness
c.Line(template.LineThickness(document.Pt(0.5)))   // thin
c.Line(template.LineThickness(document.Pt(2)))     // medium
c.Line(template.LineThickness(document.Pt(5)))     // thick

// Color + thickness
c.Line(
    template.LineColor(pdf.RGBHex(0x1A237E)),
    template.LineThickness(document.Pt(2)),
)
┌─────────────────────────────────────────────┐
│  Default line:                              │
│  ─────────────────────────────── (gray 1pt) │
│  Red line:                                  │
│  ─────────────────────────────── (red)      │
│  Thin (0.5pt):                              │
│  ─────────────────────────────── (thin)     │
│  Thick (5pt):                               │
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (thick)    │
└─────────────────────────────────────────────┘

罫線オプション

オプション説明
LineColor(color)罫線の色
LineThickness(value)罫線の太さ

スペーサー

要素間に垂直スペースを追加します:

c.Text("Before spacer")
c.Spacer(document.Mm(10))    // 10mm gap
c.Text("After spacer")

c.Spacer(document.Mm(5))     // 5mm
c.Spacer(document.Mm(15))    // 15mm
c.Spacer(document.Mm(30))    // 30mm
┌─────────────────────────────────────────────┐
│  Before spacer                              │
│                                             │
│                  ↕ 10mm                     │
│                                             │
│  After spacer                               │
└─────────────────────────────────────────────┘

QRコード

テキストやURLからQRコードを生成します:

// Basic QR code
c.QRCode("https://gpdf.dev")

// With custom size
c.QRCode("https://gpdf.dev", template.QRSize(document.Mm(30)))

// With error correction level
c.QRCode("HELLO", template.QRSize(document.Mm(25)),
    template.QRErrorCorrection(qrcode.LevelH))

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

異なるサイズのQRコード

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("20mm", template.FontSize(9))
        c.QRCode("https://gpdf.dev", template.QRSize(document.Mm(20)))
    })
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("30mm", template.FontSize(9))
        c.QRCode("https://gpdf.dev", template.QRSize(document.Mm(30)))
    })
    r.Col(4, func(c *template.ColBuilder) {
        c.Text("40mm", template.FontSize(9))
        c.QRCode("https://gpdf.dev", template.QRSize(document.Mm(40)))
    })
})
┌───────────────┬───────────────┬───────────────┐
│  20mm         │  30mm         │  40mm         │
│  ┌──┐         │  ┌────┐       │  ┌──────┐     │
│  │QR│         │  │ QR │       │  │  QR  │     │
│  └──┘         │  └────┘       │  │      │     │
│               │               │  └──────┘     │
└───────────────┴───────────────┴───────────────┘

誤り訂正レベル

レベル復元率最適な用途
qrcode.LevelL~7%クリーンな環境
qrcode.LevelM~15%一般用途(デフォルト)
qrcode.LevelQ~25%産業用途
qrcode.LevelH~30%過酷な環境
import "github.com/gpdf-dev/gpdf/qrcode"

c.QRCode("HELLO", template.QRErrorCorrection(qrcode.LevelH))

QRコードオプション

オプション説明
QRSize(value)表示サイズ(幅 = 高さ)
QRErrorCorrection(level)誤り訂正レベル
QRScale(s)QRモジュールあたりのピクセル数

バーコード

Code 128バーコードを生成します:

// Basic barcode
c.Barcode("INV-2026-0001")

// With custom width
c.Barcode("PRODUCT-A-12345", template.BarcodeWidth(document.Mm(80)))

// With custom height
c.Barcode("SMALL-BAR", template.BarcodeHeight(document.Mm(10)))

// Numeric data (automatically optimized with Code C)
c.Barcode("1234567890")

カラム内のバーコード

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("Item A", template.FontSize(9))
        c.Barcode("ITEM-A-001", template.BarcodeWidth(document.Mm(60)))
    })
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("Item B", template.FontSize(9))
        c.Barcode("ITEM-B-002", template.BarcodeWidth(document.Mm(60)))
    })
})
┌────────────────────────┬────────────────────────┐
│  Item A                │  Item B                │
│  ║║│║║│║║║│║║│║║│      │  ║║│║║│║║║│║║│║║│      │
│  ITEM-A-001            │  ITEM-B-002            │
└────────────────────────┴────────────────────────┘

バーコードオプション

オプション説明
BarcodeWidth(value)表示幅
BarcodeHeight(value)表示高さ
BarcodeFormat(format)バーコード形式(デフォルト: Code 128)

絶対配置

通常のグリッドフローの外側で、ページ上の正確なXY座標に要素を配置します。透かし、スタンプ、ロゴ、オーバーレイに便利です。

page.Absolute(document.Mm(120), document.Mm(20), func(c *template.ColBuilder) {
    c.Text("CONFIDENTIAL", template.FontSize(20), template.Bold(), template.TextColor(pdf.Red))
})

// With explicit size
page.Absolute(document.Mm(10), document.Mm(250), func(c *template.ColBuilder) {
    c.QRCode("https://gpdf.dev", template.QRSize(document.Mm(20)))
}, gpdf.AbsoluteWidth(document.Mm(25)), gpdf.AbsoluteHeight(document.Mm(25)))

// Use page corner as origin (ignores margins)
page.Absolute(document.Mm(0), document.Mm(0), func(c *template.ColBuilder) {
    c.Text("Top-left corner of page")
}, gpdf.AbsoluteOriginPage())
┌─ Page ──────────────────────────────────────────┐
│  ┌─ Content Area ───────────────────────────┐   │
│  │                                          │   │
│  │   [Normal flow content]                  │   │
│  │                                          │   │
│  │              ┌──────────────┐            │   │
│  │              │ CONFIDENTIAL │ ← absolute │   │
│  │              └──────────────┘   (120,20) │   │
│  │                                          │   │
│  │   ┌──┐                                   │   │
│  │   │QR│ ← absolute (10,250)               │   │
│  │   └──┘                                   │   │
│  └──────────────────────────────────────────┘   │
└─────────────────────────────────────────────────┘

座標の基準点

基準点説明デフォルト
コンテンツエリアコンテンツエリアの左上からの相対XY(マージン内側)はい
ページページの左上隅からの相対XY(マージンを無視)いいえ

絶対配置オプション

オプション説明
AbsoluteWidth(value)絶対ブロックの明示的な幅
AbsoluteHeight(value)絶対ブロックの明示的な高さ
AbsoluteOriginPage()コンテンツエリアではなくページの角を基準点として使用

ページ番号 / 総ページ数

ヘッダーやフッターでの自動ページ番号:

// Current page number (e.g., "1", "2", "3")
c.PageNumber(template.AlignRight(), template.FontSize(8))

// Total page count (e.g., "4 total pages")
c.TotalPages(template.AlignRight(), template.FontSize(9))

どちらもスタイリング用の標準テキストオプションを受け付けます。