Geração de relatórios PDF em Go (Golang): visão geral das bibliotecas e exemplos práticos
Go (Golang) é uma linguagem compilada moderna, ideal para criar aplicações servidoras de alta carga, microsserviços e utilitários de linha de comando. Uma das tarefas comuns no desenvolvimento web é a geração de relatórios em formato PDF: faturas, notas fiscais, dashboards analíticos ou certificados. Neste artigo, veremos três bibliotecas populares para trabalhar com PDF em Go, suas funcionalidades e exemplos de código funcionais.
Por que Go para geração de PDF?
Go oferece várias vantagens: alta performance, simplicidade de implantação (um único binário), suporte nativo a concorrência e uma biblioteca padrão rica. Para gerar PDF, não é necessário instalar runtimes pesados (como Java ou .NET), tornando as soluções em Go compactas e rápidas. No entanto, ao contrário do Python, que possui bibliotecas poderosas como ReportLab, o ecossistema Go para PDF é mais diversificado, e a escolha da ferramenta depende da complexidade do relatório.
1. gofpdf — geração básica de PDF
gofpdf é um port da conhecida biblioteca PHP FPDF. Ela permite criar documentos PDF "do zero": adicionar texto, imagens, linhas, tabelas e fontes. A biblioteca não suporta templates HTML, portanto toda a marcação é feita programaticamente.
Instalação:
go get github.com/jung-kurt/gofpdfExemplo: criação de uma fatura simples
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, "Fatura nº 123") pdf.Ln(12) pdf.SetFont("Arial", "", 12) pdf.Cell(40, 10, "Data: 2024-01-15") pdf.Ln(10) pdf.Cell(40, 10, "Produto: Notebook") pdf.Ln(10) pdf.Cell(40, 10, "Valor: R$ 50.000,00") err := pdf.OutputFileAndClose("invoice.pdf") if err != nil { panic(err) }}Prós: leve, controle total sobre o posicionamento, suporte a Unicode via fontes TTF.
Contras: falta de suporte nativo a HTML, complexidade na criação de layouts elaborados.
2. maroto — criação simplificada de relatórios
Maroto é construído sobre o gofpdf, mas fornece uma API de alto nível para criar relatórios. Você trabalha com conceitos como "grade", "linhas", "colunas", "tabelas". Isso lembra o trabalho com frameworks CSS.
Instalação:
go get github.com/johnfercher/maroto/v2Exemplo: tabela com dados
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.WithPageSize("A4")) m.RegisterHeader(func() { m.Row(20, func() { m.Col(12, func() { m.Text("Relatório de Vendas", props.Text{Bold: true, Size: 16}) }) }) })
headers := []string{"Produto", "Qtd", "Preço"} contents := [][]string{ {"Notebook", "2", "100000"}, {"Mouse", "5", "2500"}, }
m.Table(headers, contents, props.Table{}) document, _ := m.Generate() _ = document.Save("report.pdf")}Prós: estilo declarativo, alinhamento automático, suporte nativo a tabelas e gráficos.
Contras: menos flexibilidade para layouts não padronizados em comparação com gofpdf.
3. wkhtmltopdf — HTML para PDF
Se você precisa transformar um template HTML em PDF (por exemplo, com estilos CSS), use wkhtmltopdf — um wrapper para o utilitário wkhtmltopdf (WebKit). Não é uma biblioteca Go pura, mas permite usar todo o poder do HTML/CSS para o design dos relatórios.
Também na biblioteca
bcrypt em Go: guia completo com exemplos práticos
Container de Injeção de Dependência em C++: biblioteca Fruit para injeção de dependências
Trabalho com imagens em PHP: redimensionamento e corte (resize, crop)
cobra/pflag para Go: guia completo com exemplos práticos