English | 日本語 | 中文 | 한국어 | Español | Português
純粋なGoで実装された、外部依存ゼロのPDF生成ライブラリ。レイヤードアーキテクチャと宣言的なビルダーAPIを提供します。
- 外部依存ゼロ — Go標準ライブラリのみ使用
- レイヤードアーキテクチャ — 低レベルPDFプリミティブ、ドキュメントモデル、高レベルテンプレートAPI
- 12カラムグリッドシステム — Bootstrap風のレスポンシブレイアウト
- TrueTypeフォント対応 — カスタムフォントの埋め込みとサブセット化
- CJK対応 — 日中韓テキストを初日からフルサポート
- テーブル — ヘッダー、カラム幅指定、ストライプ行、垂直揃え、外周罫線とセル罫線
- 罫線と背景 — テーブル / 画像 / Box コンテナに適用可能(solid / dashed / dotted)
- ヘッダー&フッター — ページ番号付きで全ページに一貫表示
- リスト — 箇条書きリストと番号付きリスト
- QRコード — 純GoのQRコード生成(誤り訂正レベル対応)
- バーコード — Code 128バーコード生成
- テキスト装飾 — 下線、取り消し線、字間、字下げ
- ページ番号 — 自動ページ番号と総ページ数
- Goテンプレート統合 — GoテンプレートからPDF生成
- 再利用可能コンポーネント — 請求書・レポート・レターのプリセットテンプレート
- JSONスキーマ — JSONのみでドキュメントを定義
- 複数の単位 — pt, mm, cm, in, em, %
- カラースペース — RGB、グレースケール、CMYK
- 画像 — JPEGとPNGの埋め込み(フィットオプション対応)
- 絶対位置指定 — ページ上の任意のXY座標に要素を配置
- 既存PDFオーバーレイ — 既存PDFを開いてテキスト、画像、スタンプを上に追加
- フォームフラット化 — AcroFormフィールドを静的ページコンテンツに変換、非ウィジェット注釈は保持
- PDFマージ — 複数のPDFをページ範囲指定付きで1つに結合
- ドキュメントメタデータ — タイトル、著者、件名、作成者
- 暗号化 — AES-256暗号化(ISO 32000-2, Rev 6)、オーナー/ユーザーパスワードと権限制御
- PDF/A — PDF/A-1bおよびPDF/A-2b準拠、ICCプロファイルとXMPメタデータ対応
- デジタル署名 — CMS/PKCS#7署名、RSA/ECDSA鍵対応、RFC 3161タイムスタンプ対応
go-pdf/fpdf、signintech/gopdf、maroto v2 との比較。 5回実行の中央値、各100イテレーション。Apple M1、Go 1.25。
実行時間(低いほど良い):
| ベンチマーク | gpdf | fpdf | gopdf | maroto v2 |
|---|---|---|---|---|
| 1ページ | 13 µs | 132 µs | 423 µs | 237 µs |
| テーブル (4x10) | 108 µs | 241 µs | 835 µs | 8.6 ms |
| 100ページ | 683 µs | 11.7 ms | 8.6 ms | 19.8 ms |
| 複合ドキュメント | 133 µs | 254 µs | 997 µs | 10.4 ms |
メモリ使用量(低いほど良い):
| ベンチマーク | gpdf | fpdf | gopdf | maroto v2 |
|---|---|---|---|---|
| 1ページ | 16 KB | 1.2 MB | 1.8 MB | 61 KB |
| テーブル (4x10) | 209 KB | 1.3 MB | 1.9 MB | 1.6 MB |
| 100ページ | 909 KB | 121 MB | 83 MB | 4.0 MB |
| 複合ドキュメント | 246 KB | 1.3 MB | 2.0 MB | 2.0 MB |
- 1ページ — ビルド→レイアウト→レンダリングのシングルパスパイプラインで中間データ構造を持たない。全体を通して具体的な構造体型を使用(
interface{}ボクシングなし)し、ドキュメントツリーを最小限のヒープ割り当てで構築。 - テーブル — セル内容を再利用可能な
strings.Builderバッファを通じて PDF コンテンストリームコマンドとして直接書き出す。セルごとのオブジェクトラッピングやフォントの繰り返し検索がなく、フォントはドキュメントごとに1回だけ解決。 - 100ページ — レイアウトは O(n) で線形にスケール。オーバーフローページネーションはスライス参照で残りのノードを渡す(ディープコピーなし)。フォントは1回だけパースされ全ページで共有。
- 複合ドキュメント — 再計測なしのシングルパスレイアウトが上記すべてを統合。フォントサブセッティングは実際に使用されたグリフのみを埋め込み、Flate 圧縮がデフォルトで適用されるため、メモリと出力サイズの両方を小さく保つ。
ベンチマーク実行:
cd _benchmark && go test -bench=. -benchmem -count=5┌─────────────────────────────────────┐
│ gpdf (entry point) │
├─────────────────────────────────────┤
│ template — Builder API, Grid │ Layer 3
├─────────────────────────────────────┤
│ document — Nodes, Style, Layout │ Layer 2
├─────────────────────────────────────┤
│ pdf — Writer, Fonts, Streams │ Layer 1
└─────────────────────────────────────┘
- Go 1.22 以降
go get github.com/gpdf-dev/gpdfpackage main
import (
"os"
"github.com/gpdf-dev/gpdf"
"github.com/gpdf-dev/gpdf/document"
"github.com/gpdf-dev/gpdf/template"
)
func main() {
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithMargins(document.UniformEdges(document.Mm(20))),
)
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("Hello, World!", template.FontSize(24), template.Bold())
})
})
data, _ := doc.Generate()
os.WriteFile("hello.pdf", data, 0644)
}フォントサイズ、太さ、スタイル、色、背景色、配置:
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("大きな太字タイトル", template.FontSize(24), template.Bold())
c.Text("イタリックテキスト", template.Italic())
c.Text("太字 + イタリック", template.Bold(), template.Italic())
c.Text("赤いテキスト", template.TextColor(pdf.Red))
c.Text("カスタムカラー", template.TextColor(pdf.RGBHex(0x336699)))
c.Text("背景色付き", template.BgColor(pdf.Yellow))
c.Text("中央揃え", template.AlignCenter())
c.Text("右揃え", template.AlignRight())
})
})CJKテキストのレンダリングにはTrueTypeフォントの埋め込みが必要です。各言語にはそれぞれのNoto Sansフォントを使用します:
fontData, _ := os.ReadFile("NotoSansJP-Regular.ttf")
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithFont("NotoSansJP", fontData),
gpdf.WithDefaultFont("NotoSansJP", 12),
)
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("こんにちは世界", template.FontSize(18))
})
})多言語ドキュメントでは、複数のフォントを登録してFontFamily()で切り替えます:
jpFont, _ := os.ReadFile("NotoSansJP-Regular.ttf")
scFont, _ := os.ReadFile("NotoSansSC-Regular.ttf")
krFont, _ := os.ReadFile("NotoSansKR-Regular.ttf")
doc := gpdf.NewDocument(
gpdf.WithFont("NotoSansJP", jpFont),
gpdf.WithFont("NotoSansSC", scFont),
gpdf.WithFont("NotoSansKR", krFont),
gpdf.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"))
})
})推奨フォント(すべて無料、OFLライセンス):
| フォント | 言語 |
|---|---|
| Noto Sans JP | 日本語 |
| Noto Sans SC | 簡体字中国語 |
| Noto Sans KR | 韓国語 |
Bootstrap風の12カラムグリッドでレイアウトを構築:
// 2等分カラム
page.AutoRow(func(r *template.RowBuilder) {
r.Col(6, func(c *template.ColBuilder) {
c.Text("左半分")
})
r.Col(6, func(c *template.ColBuilder) {
c.Text("右半分")
})
})
// サイドバー + メインコンテンツ
page.AutoRow(func(r *template.RowBuilder) {
r.Col(3, func(c *template.ColBuilder) {
c.Text("サイドバー")
})
r.Col(9, func(c *template.ColBuilder) {
c.Text("メインコンテンツ")
})
})Row() で高さを指定、AutoRow() でコンテンツに合わせた自動高さ:
// 固定高さ: 30mm
page.Row(document.Mm(30), func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("この行の高さは30mmです")
})
})基本的なテーブル:
c.Table(
[]string{"商品名", "数量", "価格"},
[][]string{
{"ウィジェット", "10", "¥500"},
{"ガジェット", "3", "¥1,200"},
},
)スタイル付きテーブル(ヘッダー色、カラム幅、ストライプ行):
c.Table(
[]string{"商品", "カテゴリ", "数量", "単価", "合計"},
[][]string{
{"ノートPC Pro 15", "電子機器", "2", "¥129,900", "¥259,800"},
{"ワイヤレスマウス", "周辺機器", "10", "¥2,999", "¥29,990"},
},
template.ColumnWidths(30, 20, 10, 20, 20),
template.TableHeaderStyle(
template.TextColor(pdf.White),
template.BgColor(pdf.RGBHex(0x1A237E)),
),
template.TableStripe(pdf.RGBHex(0xF5F5F5)),
)テーブル罫線 — 外周フレーム、セルグリッド、または両方:
outer := template.Border(
template.BorderWidth(document.Pt(1)),
template.BorderColor(pdf.RGBHex(0x1A237E)),
)
grid := template.Border(
template.BorderWidth(document.Pt(0.5)),
template.BorderColor(pdf.Gray(0.5)),
)
// 外周フレームのみ
c.Table(header, rows, template.WithTableBorder(outer))
// セルグリッドのみ(Excel 風グリッド線)
c.Table(header, rows, template.WithTableCellBorder(grid))
// 外周フレーム + セルグリッド + 背景
c.Table(header, rows,
template.WithTableBorder(outer),
template.WithTableCellBorder(grid),
template.WithTableBackground(pdf.RGBHex(0xFAFAFA)),
)
// 破線セルグリッド
dashed := template.Border(
template.BorderWidth(document.Pt(0.75)),
template.BorderColor(pdf.RGBHex(0x0D47A1)),
template.BorderLine(document.BorderDashed),
)
c.Table(header, rows, template.WithTableCellBorder(dashed))JPEGとPNG画像の埋め込み(フィットオプション対応):
c.Image(imgData) // デフォルトサイズ
c.Image(imgData, template.FitWidth(document.Mm(80))) // 幅に合わせる
c.Image(imgData, template.FitHeight(document.Mm(30))) // 高さに合わせる罫線と背景色を指定(透過 PNG に背景を敷く用途に便利):
c.Image(pngData,
template.FitWidth(document.Mm(60)),
template.WithImageBorder(template.Border(
template.BorderWidth(document.Pt(2)),
template.BorderColor(pdf.RGBHex(0xE53935)),
)),
template.WithImageBackground(pdf.RGBHex(0xFFF8E1)),
)カラム内の任意の内容を、罫線・塗りつぶし・パディング付きの矩形コンテナでラップ:
c.Box(func(c *template.ColBuilder) {
c.Text("Box の中")
c.Text("本文 2 行")
},
template.WithBoxBorder(template.Border(
template.BorderWidth(document.Pt(1)),
template.BorderColor(pdf.RGBHex(0x1A237E)),
)),
template.WithBoxBackground(pdf.RGBHex(0xE8EAF6)),
template.WithBoxPadding(document.UniformEdges(document.Mm(4))),
)c.Line() // デフォルト(グレー、1pt)
c.Line(template.LineColor(pdf.Red)) // 色付き
c.Line(template.LineThickness(document.Pt(3))) // 太線
c.Spacer(document.Mm(5)) // 5mmの垂直間隔箇条書きリストと番号付きリスト:
// 箇条書きリスト
c.List([]string{"項目1", "項目2", "項目3"})
// 番号付きリスト
c.OrderedList([]string{"ステップ1", "ステップ2", "ステップ3"})サイズと誤り訂正レベルを指定可能なQRコード生成:
// 基本的なQRコード
c.QRCode("https://gpdf.dev")
// サイズと誤り訂正レベルを指定
c.QRCode("https://gpdf.dev",
template.QRSize(document.Mm(30)),
template.QRErrorCorrection(qrcode.LevelH))Code 128バーコード生成:
// 基本的なバーコード
c.Barcode("INV-2026-0001")
// 幅を指定
c.Barcode("INV-2026-0001", template.BarcodeWidth(document.Mm(80)))自動ページ番号と総ページ数:
doc.Footer(func(p *template.PageBuilder) {
p.AutoRow(func(r *template.RowBuilder) {
r.Col(6, func(c *template.ColBuilder) {
c.Text("gpdfで生成", template.FontSize(8))
})
r.Col(6, func(c *template.ColBuilder) {
c.PageNumber(template.AlignRight(), template.FontSize(8))
})
})
})
doc.Header(func(p *template.PageBuilder) {
p.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.TotalPages(template.AlignRight(), template.FontSize(9))
})
})
})下線、取り消し線、字間、字下げ:
c.Text("下線テキスト", template.Underline())
c.Text("取り消し線テキスト", template.Strikethrough())
c.Text("広い字間", template.LetterSpacing(3))
c.Text("字下げ段落...", template.TextIndent(document.Pt(24)))全ページに繰り返し表示されるヘッダーとフッター:
doc.Header(func(p *template.PageBuilder) {
p.AutoRow(func(r *template.RowBuilder) {
r.Col(6, func(c *template.ColBuilder) {
c.Text("ACME株式会社", template.Bold(), template.FontSize(10))
})
r.Col(6, func(c *template.ColBuilder) {
c.Text("社外秘", template.AlignRight(), template.FontSize(10),
template.TextColor(pdf.Gray(0.5)))
})
})
})
doc.Footer(func(p *template.PageBuilder) {
p.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("gpdfで生成", template.AlignCenter(),
template.FontSize(8), template.TextColor(pdf.Gray(0.5)))
})
})
})for i := 1; i <= 5; i++ {
page := doc.AddPage()
page.AutoRow(func(r *template.RowBuilder) {
r.Col(12, func(c *template.ColBuilder) {
c.Text("ページコンテンツ")
})
})
}既存のPDFを開いて、同じビルダーAPIでコンテンツを重ねて配置:
// 既存PDFを開く
doc, err := gpdf.Open(existingPDFBytes)
// 1ページ目に「DRAFT」透かしを追加
doc.Overlay(0, func(p *template.PageBuilder) {
p.Absolute(document.Mm(50), document.Mm(140), func(c *template.ColBuilder) {
c.Text("DRAFT", template.FontSize(72),
template.TextColor(pdf.Gray(0.85)))
})
})
// 全ページにページ番号を追加
count, _ := doc.PageCount()
doc.EachPage(func(i int, p *template.PageBuilder) {
p.Absolute(document.Mm(170), document.Mm(285), func(c *template.ColBuilder) {
c.Text(fmt.Sprintf("%d / %d", i+1, count), template.FontSize(10))
}, template.AbsoluteWidth(document.Mm(20)))
})
result, _ := doc.Save()インタラクティブなAcroFormフィールドを静的ページコンテンツにフラット化。リンクやコメントなどの非ウィジェット注釈は保持されます:
// フォームフィールドを含むPDFを開く
doc, err := gpdf.Open(filledFormPDF)
// すべてのフォームフィールドを静的コンテンツにフラット化
if err := doc.FlattenForms(); err != nil {
log.Fatal(err)
}
result, _ := doc.Save()複数のPDFをページ範囲指定付きで1つのドキュメントに結合:
// 複数のPDFを結合
merged, _ := gpdf.Merge(
[]gpdf.Source{
{Data: coverPage},
{Data: report},
{Data: appendix, Pages: gpdf.PageRange{From: 1, To: 3}}, // 最初の3ページのみ
},
gpdf.WithMergeMetadata("My Document", "Author", ""),
)JSONのみでドキュメントを定義:
schema := []byte(`{
"page": {"size": "A4", "margins": "20mm"},
"metadata": {"title": "レポート", "author": "gpdf"},
"body": [
{"row": {"cols": [
{"span": 12, "text": "JSONからこんにちは", "style": {"size": 24, "bold": true}}
]}}
]
}`)
doc, err := template.FromJSON(schema, nil)
data, _ := doc.Generate()テーブルと画像はビルダー API と同じ border / background キーを受け付けます:
style には solid(デフォルト) / dashed / dotted / none を指定可能。CSS 順で [top, right, bottom, left] を別指定する場合は widths、一律の場合は width を使用。
GoテンプレートとJSONスキーマで動的コンテンツを生成:
schema := []byte(`{
"page": {"size": "A4", "margins": "20mm"},
"metadata": {"title": "{{.Title}}"},
"body": [
{"row": {"cols": [
{"span": 12, "text": "{{.Title}}", "style": {"size": 24, "bold": true}}
]}}
]
}`)
data := map[string]any{"Title": "動的レポート"}
doc, err := template.FromJSON(schema, data)事前パース済みGoテンプレートでより柔軟に:
tmpl, _ := gotemplate.New("doc").Funcs(template.TemplateFuncMap()).Parse(schemaStr)
doc, err := template.FromTemplate(tmpl, data)関数一つで一般的なドキュメントを生成:
請求書:
doc := template.Invoice(template.InvoiceData{
Number: "#INV-2026-001",
Date: "2026年3月1日",
DueDate: "2026年3月31日",
From: template.InvoiceParty{Name: "ACME株式会社", Address: []string{"東京都渋谷区1-2-3"}},
To: template.InvoiceParty{Name: "クライアント株式会社", Address: []string{"大阪府大阪市4-5-6"}},
Items: []template.InvoiceItem{
{Description: "Web開発", Quantity: "40時間", UnitPrice: 150, Amount: 6000},
{Description: "UI/UXデザイン", Quantity: "20時間", UnitPrice: 120, Amount: 2400},
},
TaxRate: 10,
Notes: "ご利用ありがとうございます!",
})
data, _ := doc.Generate()レポート:
doc := template.Report(template.ReportData{
Title: "四半期レポート",
Subtitle: "2026年 Q1",
Author: "ACME株式会社",
Sections: []template.ReportSection{
{
Title: "エグゼクティブサマリー",
Content: "売上は2025年Q4と比較して15%増加しました。",
Metrics: []template.ReportMetric{
{Label: "売上", Value: "¥12.5M", ColorHex: 0x2E7D32},
{Label: "成長率", Value: "+15%", ColorHex: 0x2E7D32},
},
},
{
Title: "売上内訳",
Table: &template.ReportTable{
Header: []string{"事業部", "2026 Q1", "変化"},
Rows: [][]string{{"クラウド", "¥5.2M", "+26.8%"}, {"エンタープライズ", "¥3.8M", "+8.6%"}},
},
},
},
})レター:
doc := template.Letter(template.LetterData{
From: template.LetterParty{Name: "ACME株式会社", Address: []string{"東京都渋谷区1-2-3"}},
To: template.LetterParty{Name: "田中太郎 様", Address: []string{"大阪府大阪市4-5-6"}},
Date: "2026年3月1日",
Subject: "業務提携のご提案",
Greeting: "田中様",
Body: []string{"戦略的パートナーシップをご提案させていただきたく..."},
Closing: "敬具",
Signature: "山田花子",
})AES-256暗号化、オーナー/ユーザーパスワードと権限制御:
// オーナーパスワードのみ(パスワードなしでPDFを開けるが、編集は制限)
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithEncryption(
encrypt.WithOwnerPassword("owner-secret"),
),
)
// 両方のパスワードと権限制御
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithEncryption(
encrypt.WithOwnerPassword("owner-pass"),
encrypt.WithUserPassword("user-pass"),
encrypt.WithPermissions(encrypt.PermPrint|encrypt.PermCopy),
),
)PDF/A-1bまたはPDF/A-2b準拠ドキュメントの生成:
doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithPDFA(
pdfa.WithLevel(pdfa.LevelA2b),
pdfa.WithMetadata(pdfa.MetadataInfo{
Title: "アーカイブレポート",
Author: "gpdf",
}),
),
)RSAまたはECDSA鍵によるCMS/PKCS#7署名:
data, _ := doc.Generate()
signed, err := gpdf.SignDocument(data, signature.Signer{
Certificate: cert,
PrivateKey: key,
Chain: intermediates,
},
signature.WithReason("承認済み"),
signature.WithLocation("東京"),
signature.WithTimestamp("http://tsa.example.com"),
)doc := gpdf.NewDocument(
gpdf.WithPageSize(gpdf.A4),
gpdf.WithMetadata(document.DocumentMetadata{
Title: "年次報告書 2026",
Author: "gpdf Library",
Subject: "ドキュメントメタデータの例",
Creator: "My Application",
}),
)// 利用可能なページサイズ
document.A4 // 210mm x 297mm
document.A3 // 297mm x 420mm
document.Letter // 8.5in x 11in
document.Legal // 8.5in x 14in
// 均一マージン
template.WithMargins(document.UniformEdges(document.Mm(20)))
// 非対称マージン
template.WithMargins(document.Edges{
Top: document.Mm(10),
Right: document.Mm(40),
Bottom: document.Mm(10),
Left: document.Mm(40),
})// Generateは[]byteを返す
data, err := doc.Generate()
// Renderは任意のio.Writerに書き込む
var buf bytes.Buffer
err := doc.Render(&buf)
// ファイルに直接書き込む
f, _ := os.Create("output.pdf")
defer f.Close()
doc.Render(f)| 関数 | 説明 |
|---|---|
WithPageSize(size) |
ページサイズを設定 (A4, A3, Letter, Legal) |
WithMargins(edges) |
ページマージンを設定 |
WithFont(family, data) |
TrueTypeフォントを登録 |
WithDefaultFont(family, size) |
デフォルトフォントを設定 |
WithMetadata(meta) |
ドキュメントメタデータを設定 |
WithEncryption(opts...) |
AES-256暗号化を有効化 |
WithPDFA(opts...) |
PDF/A準拠を有効化 |
| メソッド | 説明 |
|---|---|
c.Text(text, opts...) |
スタイルオプション付きテキストを追加 |
c.Table(header, rows, opts...) |
テーブルを追加 |
c.Image(data, opts...) |
画像を追加 (JPEG/PNG) |
c.QRCode(data, opts...) |
QRコードを追加 |
c.Barcode(data, opts...) |
バーコードを追加 (Code 128) |
c.List(items, opts...) |
箇条書きリストを追加 |
c.OrderedList(items, opts...) |
番号付きリストを追加 |
c.PageNumber(opts...) |
現在のページ番号を追加 |
c.TotalPages(opts...) |
総ページ数を追加 |
c.Line(opts...) |
水平線を追加 |
c.Spacer(height) |
垂直スペースを追加 |
c.Box(fn, opts...) |
スタイル付き Box にコンテンツをラップ(罫線 / 塗り / パディング) |
| メソッド | 説明 |
|---|---|
page.AutoRow(fn) |
自動高さの行を追加 |
page.Row(height, fn) |
固定高さの行を追加 |
page.Absolute(x, y, fn, opts...) |
指定したXY座標にコンテンツを配置 |
| オプション | 説明 |
|---|---|
gpdf.AbsoluteWidth(value) |
明示的な幅を設定(デフォルト: 残りスペース) |
gpdf.AbsoluteHeight(value) |
明示的な高さを設定(デフォルト: 残りスペース) |
gpdf.AbsoluteOriginPage() |
コンテンツ領域ではなくページ角を原点にする |
| 関数 / メソッド | 説明 |
|---|---|
gpdf.Open(data, opts...) |
既存PDFをオーバーレイ用に開く |
doc.PageCount() |
ページ数を取得 |
doc.Overlay(page, fn) |
特定ページにコンテンツを重ねて配置 |
doc.EachPage(fn) |
全ページにオーバーレイを適用 |
doc.FlattenForms() |
AcroFormフィールドを静的ページコンテンツにフラット化 |
doc.Save() |
変更したPDFを保存 |
gpdf.Merge(sources, opts...) |
複数のPDFを1つに結合 |
WithMergeMetadata(title, author, producer) |
結合後のメタデータを設定 |
| オプション | 説明 |
|---|---|
template.FontSize(size) |
フォントサイズをポイント単位で設定 |
template.Bold() |
太字 |
template.Italic() |
イタリック |
template.FontFamily(name) |
登録済みフォントを使用 |
template.TextColor(color) |
テキスト色を設定 |
template.BgColor(color) |
背景色を設定 |
template.Underline() |
下線装飾 |
template.Strikethrough() |
取り消し線装飾 |
template.LetterSpacing(pts) |
字間をポイント単位で設定 |
template.TextIndent(value) |
字下げを設定 |
template.AlignLeft() |
左揃え(デフォルト) |
template.AlignCenter() |
中央揃え |
template.AlignRight() |
右揃え |
| オプション | 説明 |
|---|---|
template.ColumnWidths(w...) |
カラム幅をパーセンテージで設定 |
template.TableHeaderStyle(opts...) |
ヘッダー行のスタイル設定 |
template.TableStripe(color) |
交互行の色を設定 |
template.TableCellVAlign(align) |
セルの垂直揃え (Top/Middle/Bottom) |
template.WithTableBorder(spec) |
テーブル外周に罫線を描画 |
template.WithTableCellBorder(spec) |
全ヘッダー・ボディセルに同じ罫線を描画(グリッド線) |
template.WithTableBorderCollapse(b) |
隣接セル境界の collapse を有効化 |
template.WithTableBackground(color) |
テーブルの外側 Box を塗りつぶし |
| オプション | 説明 |
|---|---|
template.FitWidth(value) |
幅に合わせてスケール(アスペクト比維持) |
template.FitHeight(value) |
高さに合わせてスケール(アスペクト比維持) |
template.MinDisplayWidth(v) |
この幅を下回る場合は次ページへ送る |
template.MinDisplayHeight(v) |
この高さを下回る場合は次ページへ送る |
template.WithImageBorder(spec) |
画像の周囲に罫線を描画 |
template.WithImageBackground(color) |
画像の Box を塗りつぶし(透過 PNG に便利) |
| オプション | 説明 |
|---|---|
template.WithBoxBorder(spec) |
Box の周囲に罫線を描画 |
template.WithBoxBackground(color) |
Box を塗りつぶし |
template.WithBoxPadding(edges) |
内側のパディング |
template.WithBoxMargin(edges) |
外側のマージン |
template.WithBoxWidth(value) |
明示的な幅 |
template.WithBoxHeight(value) |
明示的な高さ |
BorderSpec を一度組み立てて、WithTableBorder / WithTableCellBorder /
WithImageBorder / WithBoxBorder / WithTextBorder で適用します:
spec := template.Border(
template.BorderWidth(document.Pt(1)), // 全 4 辺一律
template.BorderColor(pdf.RGBHex(0x1A237E)),
template.BorderLine(document.BorderSolid), // BorderSolid | BorderDashed | BorderDotted
)| オプション | 説明 |
|---|---|
template.Border(opts...) |
BorderSpec を構築(デフォルト: 1pt black solid) |
template.BorderWidth(v) |
全 4 辺に同じ幅 |
template.BorderWidths(t, r, b, l) |
CSS 順で各辺別の幅 |
template.BorderColor(c) |
辺の色 |
template.BorderLine(style) |
線スタイル: BorderSolid / BorderDashed / BorderDotted / BorderNone |
| オプション | 説明 |
|---|---|
template.QRSize(value) |
QRコードのサイズを設定 |
template.QRMinSize(value) |
最小表示サイズ — これを下回る場合は次ページへ送る |
template.QRErrorCorrection(level) |
誤り訂正レベルを設定 (L/M/Q/H) |
template.QRScale(n) |
モジュールスケール係数を設定 |
| オプション | 説明 |
|---|---|
template.BarcodeWidth(value) |
バーコードの幅を設定 |
template.BarcodeHeight(value) |
バーコードの高さを設定 |
template.BarcodeFormat(fmt) |
バーコードフォーマットを設定 (Code 128) |
| オプション | 説明 |
|---|---|
encrypt.WithOwnerPassword(pw) |
オーナーパスワードを設定 |
encrypt.WithUserPassword(pw) |
ユーザーパスワードを設定 |
encrypt.WithPermissions(perm) |
ドキュメント権限を設定 (PermPrint, PermCopy, PermModify等) |
| オプション | 説明 |
|---|---|
pdfa.WithLevel(level) |
準拠レベルを設定 (LevelA1b, LevelA2b) |
pdfa.WithMetadata(info) |
XMPメタデータを設定 (Title, Author, Subject等) |
| 関数 / オプション | 説明 |
|---|---|
gpdf.SignDocument(data, signer, opts...) |
デジタル署名でPDFに署名 |
signature.WithReason(reason) |
署名理由を設定 |
signature.WithLocation(location) |
署名場所を設定 |
signature.WithTimestamp(tsaURL) |
RFC 3161タイムスタンプを有効化 |
signature.WithSignTime(t) |
署名時刻を設定 |
| 関数 | 説明 |
|---|---|
template.FromJSON(schema, data) |
JSONスキーマからドキュメントを生成 |
template.FromTemplate(tmpl, data) |
Goテンプレートからドキュメントを生成 |
template.TemplateFuncMap() |
テンプレートヘルパー関数を取得(toJSONを含む) |
| 関数 | 説明 |
|---|---|
template.Invoice(data) |
プロフェッショナルな請求書PDFを生成 |
template.Report(data) |
構造化されたレポートPDFを生成 |
template.Letter(data) |
ビジネスレターPDFを生成 |
| オプション | 説明 |
|---|---|
template.LineColor(color) |
罫線の色を設定 |
template.LineThickness(value) |
罫線の太さを設定 |
document.Pt(72) // ポイント (1/72インチ)
document.Mm(10) // ミリメートル
document.Cm(2.5) // センチメートル
document.In(1) // インチ
document.Em(1.5) // フォントサイズに対する相対値
document.Pct(50) // パーセントpdf.RGB(0.2, 0.4, 0.8) // RGB (0.0–1.0)
pdf.RGBHex(0xFF5733) // 16進数からRGB
pdf.Gray(0.5) // グレースケール
pdf.CMYK(0, 0.5, 1, 0) // CMYK
// 定義済みカラー
pdf.Black, pdf.White, pdf.Red, pdf.Green, pdf.Blue
pdf.Yellow, pdf.Cyan, pdf.MagentaMIT
{"span": 12, "table": { "header": ["商品", "数量", "単価"], "rows": [["A","1","¥100"], ["B","2","¥200"]], "border": {"width": "1pt", "color": "#1A237E"}, // 外周フレーム "cellBorder": {"width": "0.5pt", "color": "gray(0.5)", "style": "dashed"}, // グリッド線 "background": "#FAFAFA" }} {"span": 12, "image": { "src": "...", "width": "60mm", "border": {"widths": ["2pt","2pt","2pt","2pt"], "color": "#E53935"}, "background": "#FFF8E1" }}