既存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バイトを返す

次のステップ