Geração de relatórios PDF em Go (Golang): guia completo
A criação de documentos PDF é uma das tarefas comuns no desenvolvimento web, especialmente na construção de sistemas corporativos, aplicações financeiras ou plataformas educacionais. A linguagem Go (Golang) oferece várias bibliotecas poderosas para geração de PDF, que permitem criar desde relatórios de texto simples até documentos complexos de várias páginas com tabelas, gráficos e imagens. Neste artigo, veremos três abordagens populares: gofpdf, maroto e integração com wkhtmltopdf.
1. Biblioteca gofpdf — controle de baixo nível do PDF
gofpdf é uma das bibliotecas mais antigas e flexíveis para geração de PDF em Go. Ela fornece controle total sobre cada elemento da página, mas requer mais código para layouts complexos.
Instalação
go get github.com/jung-kurt/gofpdfExemplo: relatório simples com título e tabela
package main
import ( "github.com/jung-kurt/gofpdf")
func main() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "B", 16) pdf.Cell(40, 10, "Relatório de Vendas") pdf.Ln(12)
// Cabeçalhos da tabela pdf.SetFont("Arial", "B", 12) headers := []string{"Produto", "Quantidade", "Preço"} for _, h := range headers { pdf.CellFormat(40, 10, h, "1", 0, "C", false, 0, "") } pdf.Ln(-1)
// Dados pdf.SetFont("Arial", "", 12) data := [][]string{{"Notebook", "5", "45000"}, {"Mouse", "12", "1500"}} for _, row := range data { for _, cell := range row { pdf.CellFormat(40, 10, cell, "1", 0, "C", false, 0, "") } pdf.Ln(-1) }
err := pdf.OutputFileAndClose("report.pdf") if err != nil { panic(err) }}Prós: dependências mínimas, controle total, suporte a Unicode (fontes TrueType).
Contras: falta de componentes prontos (tabelas, gráficos), necessidade de calcular posições manualmente.
2. Biblioteca maroto — geração de alto nível com grade
maroto é construída sobre gofpdf e oferece uma abordagem baseada em componentes com grade, simplificando a criação de layouts complexos. Ideal para relatórios padrão: faturas, notas fiscais, listas de preços.
Instalação
go get github.com/johnfercher/maroto/v2Exemplo: relatório com logotipo e tabela
package main
import ( "github.com/johnfercher/maroto/v2/pkg/core" "github.com/johnfercher/maroto/v2/pkg/props" "github.com/johnfercher/maroto/v2")
func main() { m := maroto.NewMaroto(maroto.WithMaxGridSize(12)) m.RegisterHeader(func() { m.Row(20, func() { m.Col(3, func() { m.FileImage("logo.png", props.Rect{ Percent: 80, Center: true, }) }) m.Col(9, func() { m.Text("TecnoService Ltda.", props.Text{ Style: props.Bold, Size: 16, }) }) }) })
m.Row(10, func() { m.Col(12, func() { m.Table([]string{"Nome", "Qtd", "Valor"}, [][]string{ {"Monitor 24\\"", "2", "40000"}, {"Teclado", "5", "7500"}, }, props.Table{ Content: props.TableContent{ GridSizes: []uint{6, 3, 3}, }, }) }) })
document, _ := m.Generate() _ = document.Save("invoice.pdf")}Prós: desenvolvimento rápido, alinhamento automático, suporte integrado para tabelas, QR codes e códigos de barras.
Contras: mais
Também na biblioteca
Validação de dados em Java: visão geral de bibliotecas e ferramentas
Geração de PDF em Java: visão geral das bibliotecas iText, Apache PDFBox, OpenPDF
Geração Swagger/OpenAPI para Go (Golang): guia completo