既存PDFオーバーレイ
概要
gpdfは既存のPDFを開き、元のデータを変更せずに新しいコンテンツを上に重ねることができます。これはインクリメンタルアップデート技術を使用しており、新しいオブジェクトは元のPDFバイトの後に追加されます。
一般的なユースケース:
- 透かしの追加(「DRAFT」「CONFIDENTIAL」)
- ページ番号の挿入
- 日付付きの承認スタンプの押印
- 既存ドキュメントへのヘッダー/フッターの追加
既存PDFを開く
import gpdf "github.com/gpdf-dev/gpdf"
// Read existing PDF bytes (from file, HTTP response, database, etc.)
pdfBytes, _ := os.ReadFile("input.pdf")
doc, err := gpdf.Open(pdfBytes)
if err != nil {
log.Fatal(err)
}
NewDocument と同じオプション(フォント、デフォルトフォントなど)を渡すことができます:
doc, err := gpdf.Open(pdfBytes,
gpdf.WithFont("NotoSans", fontData),
gpdf.WithDefaultFont("NotoSans", 12),
)
単一ページへのオーバーレイ
Overlay(pageIndex, fn) を使って特定のページ(0ベースインデックス)にコンテンツを追加します:
doc.Overlay(0, func(p *template.PageBuilder) {
p.Absolute(document.Mm(40), document.Mm(120), func(c *template.ColBuilder) {
c.Text("DRAFT",
template.FontSize(72),
template.TextColor(pdf.Gray(0.85)),
)
})
})
PageBuilder は新しいページを作成する場合と同じAPI(AutoRow, Absolute, Row など)をサポートしています。
すべてのページへのオーバーレイ
EachPage(fn) を使ってすべてのページを反復処理します:
count, _ := doc.PageCount()
doc.EachPage(func(pageIndex int, p *template.PageBuilder) {
p.Absolute(document.Mm(170), document.Mm(285), func(c *template.ColBuilder) {
c.Text(fmt.Sprintf("%d / %d", pageIndex+1, count),
template.FontSize(10),
template.AlignRight(),
)
}, template.AbsoluteWidth(document.Mm(20)))
})
結果の保存
result, err := doc.Save()
if err != nil {
log.Fatal(err)
}
os.WriteFile("output.pdf", result, 0644)
元のPDFコンテンツは保持されます — Save() はオーバーレイデータを元のバイトの後に追加します。
完全な例: 透かし + ページ番号
pdfBytes, _ := os.ReadFile("report.pdf")
doc, err := gpdf.Open(pdfBytes)
if err != nil {
log.Fatal(err)
}
count, _ := doc.PageCount()
doc.EachPage(func(i int, p *template.PageBuilder) {
// Watermark
p.Absolute(document.Mm(40), document.Mm(140), func(c *template.ColBuilder) {
c.Text("CONFIDENTIAL",
template.FontSize(60),
template.TextColor(pdf.Color{R: 0.9, G: 0.9, B: 0.9, A: 1, Space: pdf.ColorSpaceRGB}),
)
})
// Page number (bottom-right)
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.AlignRight(),
)
}, template.AbsoluteWidth(document.Mm(20)))
})
result, _ := doc.Save()
os.WriteFile("report_stamped.pdf", result, 0644)
APIリファレンス
| メソッド | 説明 |
|---|---|
gpdf.Open(data, opts...) | 既存のPDFを変更用に開く |
doc.PageCount() | ページ数を取得 |
doc.Overlay(pageIndex, fn) | 特定のページにコンテンツを追加(0ベース) |
doc.EachPage(fn) | すべてのページにコンテンツを追加 |
doc.Save() | 変更されたPDFバイトを返す |