Generación de informes PDF en Go (Golang): guía completa
La creación de documentos PDF es una de las tareas frecuentes en el desarrollo web, especialmente al construir sistemas empresariales, aplicaciones financieras o plataformas educativas. El lenguaje Go (Golang) ofrece varias bibliotecas potentes para la generación de PDF, que permiten crear tanto informes de texto simples como documentos complejos de varias páginas con tablas, gráficos e imágenes. En este artículo, analizaremos tres enfoques populares: gofpdf, maroto y la integración con wkhtmltopdf.
1. Biblioteca gofpdf — control de bajo nivel de PDF
gofpdf es una de las bibliotecas más antiguas y flexibles para la generación de PDF en Go. Proporciona control total sobre cada elemento de la página, pero requiere más código para diseños complejos.
Instalación
go get github.com/jung-kurt/gofpdfEjemplo: informe simple con título y tabla
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, "Informe de ventas") pdf.Ln(12)
// Encabezados de tabla pdf.SetFont("Arial", "B", 12) headers := []string{"Producto", "Cantidad", "Precio"} for _, h := range headers { pdf.CellFormat(40, 10, h, "1", 0, "C", false, 0, "") } pdf.Ln(-1)
// Datos pdf.SetFont("Arial", "", 12) data := [][]string{{"Portátil", "5", "45000"}, {"Ratón", "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) }}Ventajas: dependencias mínimas, control total, soporte Unicode (fuentes TrueType).
Desventajas: falta de componentes listos (tablas, gráficos), es necesario calcular las posiciones manualmente.
2. Biblioteca maroto — generación de alto nivel con cuadrícula
maroto está construida sobre gofpdf y ofrece un enfoque basado en componentes con cuadrícula, lo que simplifica la creación de diseños complejos. Ideal para informes típicos: facturas, albaranes, listas de precios.
Instalación
go get github.com/johnfercher/maroto/v2Ejemplo: informe con logotipo y tabla
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 S.L.", props.Text{ Style: props.Bold, Size: 16, }) }) }) })
m.Row(10, func() { m.Col(12, func() { m.Table([]string{"Nombre", "Cantidad", "Importe"}, [][]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")}Ventajas: desarrollo rápido, alineación automática, soporte integrado para tablas, códigos QR y códigos de barras.
Desventajas: más
También en la biblioteca
Trabajo con fechas en Kotlin: bibliotecas y herramientas para el desarrollo
Trabajo con XML en PHP: análisis, creación y procesamiento de datos
Generación de Swagger/OpenAPI para Go (Golang): guía completa
Generación de Swagger/OpenAPI para Swift: herramientas y ejemplos de código