Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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/gofpdf


Ejemplo: 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/v2


Ejemplo: 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

Recommendations