Achatamento de formularios

Visao Geral

Since v1.0.4

O gpdf pode achatar campos AcroForm interativos (campos de texto, caixas de selecao, botoes de radio, etc.) em conteudo de pagina estatico. Apos o achatamento, os campos do formulario nao sao mais editaveis — sua aparencia visual e incorporada na pagina.

Casos de uso comuns:

  • Arquivar formularios preenchidos como documentos estaticos
  • Impedir edicoes adicionais em formularios enviados
  • Preparar formularios para impressao ou distribuicao
  • Converter PDFs interativos em PDFs estaticos

Achatamento Basico

Use FlattenForms() em um documento existente aberto com gpdf.Open():

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

// Ler um PDF com campos de formulario preenchidos
pdfBytes, _ := os.ReadFile("filled-form.pdf")

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

// Achatar todos os campos de formulario em conteudo estatico
if err := doc.FlattenForms(); err != nil {
    log.Fatal(err)
}

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

O Que e Achatado

FlattenForms() processa todas as anotacoes widget (widgets de campos de formulario) que possuem fluxos de aparencia:

  • Campos de texto (Tx) — o texto inserido e renderizado como conteudo estatico
  • Caixas de selecao e botoes de radio (Btn) — o estado selecionado e renderizado
  • Outros tipos de widget — qualquer widget com um fluxo de aparencia (dicionario /AP)

O Que e Preservado

Anotacoes que nao sao widget nao sao removidas:

  • Anotacoes de link (hyperlinks)
  • Anotacoes de texto (comentarios, notas adesivas)
  • Outras anotacoes que nao sao de formulario

Seguro para Chamar em Qualquer PDF

Se o PDF nao possui campos AcroForm, FlattenForms() e um no-op e retorna nil:

doc, _ := gpdf.Open(regularPDFBytes)

// Seguro — nao faz nada se nao existem formularios
if err := doc.FlattenForms(); err != nil {
    log.Fatal(err)
}

result, _ := doc.Save()

Achatamento + Sobreposicao

Combine achatamento com overlay para adicionar carimbos ou marcas d'agua apos o achatamento:

doc, _ := gpdf.Open(filledFormPDF)

// Passo 1: Achatar campos de formulario
doc.FlattenForms()

// Passo 2: Adicionar um carimbo "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()

Referencia da API

MetodoDescricao
doc.FlattenForms()Achatar todos os campos AcroForm em conteudo de pagina estatico

Proximos Passos