Generación de informes PDF en Go (Golang): descripción general de bibliotecas y ejemplos de código
Go (Golang) es un lenguaje compilado moderno que se elige cada vez más para crear aplicaciones de servidor de alta carga y microservicios. Una de las tareas típicas en dichos sistemas es la generación de informes PDF (facturas, actas, paneles estadísticos). En este artículo, revisaremos tres bibliotecas populares para generar PDF en Go, sus puntos fuertes y proporcionaremos ejemplos de código listos para usar.
1. gofpdf — el clásico para crear PDF desde cero
La biblioteca gofpdf (actualmente desarrollada como jung-kurt/gofpdf o el fork go-pdf/fpdf) es un puerto de la conocida biblioteca PHP FPDF. Permite crear documentos PDF sin dependencias externas, utilizando solo las capacidades estándar de Go.
Instalación
go get github.com/jung-kurt/gofpdfEjemplo: factura simple
package main
import ( "github.com/jung-kurt/gofpdf")
func main() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetFont("Arial", "B", 16) pdf.AddPage() pdf.CellFormat(190, 10, "Factura Nº123 del 01/01/2025", "0", 1, "C", false, 0, "") pdf.SetFont("Arial", "", 12) pdf.Ln(10) pdf.CellFormat(190, 10, "Producto: Portátil", "1", 1, "L", false, 0, "") pdf.CellFormat(190, 10, "Precio: 120 000 RUB", "1", 1, "L", false, 0, "") pdf.CellFormat(190, 10, "Total: 120 000 RUB", "1", 1, "L", false, 0, "") err := pdf.OutputFileAndClose("invoice.pdf") if err != nil { panic(err) }}Ventajas: dependencias mínimas, control total sobre cada elemento, soporte Unicode (a través de AddUTF8Font).
Desventajas: API de bajo nivel — para informes complejos, se necesita mucho código manual.
2. maroto — generación de alto nivel con tablas y estilos
Maroto está construida sobre gofpdf, pero ofrece una API más conveniente: tablas, cuadrículas, alineación automática y soporte de fuentes integrado. Ideal para informes típicos: facturas, listas, listas de precios.
Instalación
go get github.com/johnfercher/maroto/v2Ejemplo: tabla con datos
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.New() m.SetPageMargins(10, 10, 10) // Título m.Row(10, func() { m.Col(12, func() { m.Text("Informe de ventas", props.Text{ Style: props.Bold, Size: 16, Align: props.Center, }) }) }) // Tabla header := []string{"Producto", "Cantidad", "Precio"} data := [][]string{ {"Monitor", "2", "30 000"}, {"Teclado", "5", "7 500"}, } m.TableList(header, data, props.TableList{ HeaderProp: props.TableListContent{ Style: props.Bold, Size: 10, }, ContentProp: props.TableListContent{ Size: 9, }, }) document, _ := m.Generate() document.Save("report.pdf")}Ventajas: desarrollo rápido, estilos integrados, división automática de páginas.
Desventajas: menos flexibilidad para diseños no estándar.
3. wkhtmltopdf — conversión de HTML a PDF mediante un wrapper de Go
Si ya tiene plantillas HTML (por ejemplo, con Bootstrap), la forma más sencilla es usar wkhtmltopdf. No es una biblioteca de Go, sino una utilidad de línea de comandos, pero para Go existe el wrapper go-wkhtmltopdf. Toma una cadena HTML y devuelve un PDF.
Instalación
# Primero instale wkhtmltopdf: https://wkhtmltopdf.org/downloads.htmlgo get github.com/SebastiaanKlippert/go-wkhtmltopdf