フォームフラット化

概要

Since v1.0.4

gpdfはインタラクティブなAcroFormフィールド(テキストフィールド、チェックボックス、ラジオボタンなど)を静的ページコンテンツにフラット化できます。フラット化後、フォームフィールドは編集不可になり、その視覚的な表示がページに焼き込まれます。

一般的なユースケース:

  • 入力済みフォームを静的ドキュメントとしてアーカイブ
  • 提出済みフォームのさらなる編集を防止
  • フォームを印刷や配布用に準備
  • インタラクティブPDFを静的PDFに変換

基本的なフラット化

gpdf.Open() で開いた既存のドキュメントに対して FlattenForms() を使用します:

import gpdf "github.com/gpdf-dev/gpdf"

// フォームフィールドが入力済みのPDFを読み込む
pdfBytes, _ := os.ReadFile("filled-form.pdf")

doc, err := gpdf.Open(pdfBytes)
if err != nil {
    log.Fatal(err)
}

// すべてのフォームフィールドを静的コンテンツにフラット化
if err := doc.FlattenForms(); err != nil {
    log.Fatal(err)
}

result, _ := doc.Save()
os.WriteFile("flattened.pdf", result, 0644)

フラット化される要素

FlattenForms() はアピアランスストリームを持つすべてのウィジェットアノテーション(フォームフィールドウィジェット)を処理します:

  • テキストフィールド (Tx) — 入力されたテキストが静的コンテンツとしてレンダリングされます
  • チェックボックスとラジオボタン (Btn) — 選択された状態がレンダリングされます
  • その他のウィジェットタイプ — アピアランスストリーム(/AP 辞書)を持つすべてのウィジェット

保持される要素

ウィジェット以外のアノテーションは削除されません:

  • リンクアノテーション(ハイパーリンク)
  • テキストアノテーション(コメント、付箋)
  • その他のフォーム以外のアノテーション

任意のPDFで安全に呼び出し可能

PDFにAcroFormフィールドがない場合、FlattenForms() は何も行わず nil を返します:

doc, _ := gpdf.Open(regularPDFBytes)

// 安全 — フォームが存在しない場合は何もしない
if err := doc.FlattenForms(); err != nil {
    log.Fatal(err)
}

result, _ := doc.Save()

フラット化 + オーバーレイ

フラット化とオーバーレイを組み合わせて、フラット化後にスタンプや透かしを追加します:

doc, _ := gpdf.Open(filledFormPDF)

// Step 1: フォームフィールドをフラット化
doc.FlattenForms()

// Step 2: 「PROCESSED」スタンプを追加
doc.Overlay(0, func(p *template.PageBuilder) {
    p.Absolute(document.Mm(130), document.Mm(15), func(c *template.ColBuilder) {
        c.Text("PROCESSED",
            template.FontSize(24),
            template.Bold(),
            template.TextColor(pdf.RGB(0, 0.5, 0)),
        )
    })
})

result, _ := doc.Save()

APIリファレンス

メソッド説明
doc.FlattenForms()すべてのAcroFormフィールドを静的ページコンテンツにフラット化

次のステップ