Génération de rapports PDF en Go (Golang) : aperçu des bibliothèques et exemples pratiques
Go (Golang) est un langage compilé moderne, idéal pour créer des applications serveur à forte charge, des microservices et des utilitaires en ligne de commande. L'une des tâches fréquentes en développement web est la génération de rapports au format PDF : factures, bons de livraison, tableaux de bord analytiques ou certificats. Dans cet article, nous examinerons trois bibliothèques populaires pour travailler avec les PDF en Go, leurs fonctionnalités et fournirons des exemples de code fonctionnels.
Pourquoi Go pour la génération de PDF ?
Go offre plusieurs avantages : hautes performances, simplicité de déploiement (un seul binaire), prise en charge intégrée de la concurrence et une riche bibliothèque standard. Pour la génération de PDF, il n'est pas nécessaire d'installer des environnements d'exécution volumineux (comme Java ou .NET), ce qui rend les solutions en Go compactes et rapides. Cependant, contrairement à Python, qui dispose de bibliothèques puissantes comme ReportLab, l'écosystème Go pour les PDF est plus diversifié, et le choix de l'outil dépend de la complexité du rapport.
1. gofpdf — génération PDF de base
gofpdf est un portage de la célèbre bibliothèque PHP FPDF. Elle permet de créer des documents PDF « à partir de zéro » : ajouter du texte, des images, des lignes, des tableaux et des polices. La bibliothèque ne prend pas en charge les modèles HTML, donc toute la mise en page est définie par programmation.
Installation :
go get github.com/jung-kurt/gofpdfExemple : création d'une facture simple
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, "Facture n°123") pdf.Ln(12) pdf.SetFont("Arial", "", 12) pdf.Cell(40, 10, "Date : 2024-01-15") pdf.Ln(10) pdf.Cell(40, 10, "Produit : Ordinateur portable") pdf.Ln(10) pdf.Cell(40, 10, "Montant : 50 000 roubles.") err := pdf.OutputFileAndClose("invoice.pdf") if err != nil { panic(err) }}Avantages : léger, contrôle total du positionnement, prise en charge Unicode via les polices TTF.
Inconvénients : absence de prise en charge intégrée du HTML, complexité pour la création de mises en page complexes.
2. maroto — création simplifiée de rapports
Maroto est construit au-dessus de gofpdf, mais fournit une API de haut niveau pour la création de rapports. Vous travaillez avec des concepts de « grille », « lignes », « colonnes », « tableaux ». Cela rappelle le travail avec des frameworks CSS.
Installation :
go get github.com/johnfercher/maroto/v2Exemple : tableau avec données
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("Rapport de ventes", props.Text{Bold: true, Size: 16}) }) }) })
headers := []string{"Produit", "Qté", "Prix"} contents := [][]string{ {"Ordinateur portable", "2", "100000"}, {"Souris", "5", "2500"}, }
m.Table(headers, contents, props.Table{}) document, _ := m.Generate() _ = document.Save("report.pdf")}Avantages : style déclaratif, alignement automatique, prise en charge intégrée des tableaux et graphiques.
Inconvénients : moins de flexibilité pour les mises en page non standard par rapport à gofpdf.
3. wkhtmltopdf — HTML en PDF
Si vous devez transformer un modèle HTML en PDF (par exemple, avec des styles CSS), utilisez wkhtmltopdf — une enveloppe autour de l'utilitaire wkhtmltopdf (WebKit). Ce n'est pas une bibliothèque Go pure, mais elle permet d'utiliser toute la puissance du HTML/CSS pour la conception de rapports.