Génération de rapports PDF en Go (Golang) : guide complet
La création de documents PDF est l'une des tâches courantes en développement web, notamment pour la construction de systèmes d'entreprise, d'applications financières ou de plateformes éducatives. Le langage Go (Golang) propose plusieurs bibliothèques puissantes pour la génération de PDF, permettant de créer à la fois des rapports textuels simples et des documents complexes de plusieurs pages avec tableaux, graphiques et images. Dans cet article, nous examinerons trois approches populaires : gofpdf, maroto et l'intégration avec wkhtmltopdf.
1. Bibliothèque gofpdf — gestion de bas niveau du PDF
gofpdf est l'une des bibliothèques les plus anciennes et les plus flexibles pour la génération de PDF en Go. Elle offre un contrôle total sur chaque élément de la page, mais nécessite plus de code pour les mises en page complexes.
Installation
go get github.com/jung-kurt/gofpdfExemple : rapport simple avec titre et tableau
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, "Rapport de ventes") pdf.Ln(12)
// En-têtes du tableau pdf.SetFont("Arial", "B", 12) headers := []string{"Produit", "Quantité", "Prix"} for _, h := range headers { pdf.CellFormat(40, 10, h, "1", 0, "C", false, 0, "") } pdf.Ln(-1)
// Données pdf.SetFont("Arial", "", 12) data := [][]string{{"Ordinateur portable", "5", "45000"}, {"Souris", "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) }}Avantages : dépendances minimales, contrôle total, prise en charge Unicode (polices TrueType).
Inconvénients : absence de composants prêts à l'emploi (tableaux, graphiques), nécessité de calculer manuellement les positions.
2. Bibliothèque maroto — génération de haut niveau avec grille
maroto est construite au-dessus de gofpdf et propose une approche par composants avec une grille, ce qui simplifie la création de mises en page complexes. Idéale pour les rapports types : factures, bons de livraison, listes de prix.
Installation
go get github.com/johnfercher/maroto/v2Exemple : rapport avec logo et tableau
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("SARL «TechnoService»", props.Text{ Style: props.Bold, Size: 16, }) }) }) })
m.Row(10, func() { m.Col(12, func() { m.Table([]string{"Désignation", "Qté", "Montant"}, [][]string{ {"Moniteur 24\\"", "2", "40000"}, {"Clavier", "5", "7500"}, }, props.Table{ Content: props.TableContent{ GridSizes: []uint{6, 3, 3}, }, }) }) })
document, _ := m.Generate() _ = document.Save("invoice.pdf")}Avantages : développement rapide, alignement automatique, prise en charge intégrée des tableaux, codes QR et codes-barres.
Inconvénients : plus
Aussi dans la bibliothèque
Traitement JSON en Swift : Codable, JSONSerialization et exemples pratiques
Bouncy Castle Java : guide complet avec exemples pratiques
Configuration d'applications Swift : la bibliothèque SwiftyConfig
Envoi de SMS en C++ : API des bibliothèques libcurl et cpprestsdk