表单扁平化

概述

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)

// 步骤 1:扁平化表单字段
doc.FlattenForms()

// 步骤 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 字段扁平化为静态页面内容

下一步