Génération de rapports PDF en Go (Golang) : aperçu des bibliothèques et exemples de code
Go (Golang) est un langage compilé moderne de plus en plus choisi pour créer des applications serveur à forte charge et des microservices. L'une des tâches typiques dans ces systèmes est la génération de rapports PDF (factures, actes, tableaux de bord statistiques). Dans cet article, nous examinerons trois bibliothèques populaires pour la génération de PDF en Go, leurs points forts et fournirons des exemples de code prêts à l'emploi.
1. gofpdf — la classique pour créer des PDF à partir de zéro
La bibliothèque gofpdf (actuellement développée sous jung-kurt/gofpdf ou le fork go-pdf/fpdf) est un port de la célèbre bibliothèque PHP FPDF. Elle permet de créer des documents PDF sans dépendances externes, en utilisant uniquement les outils standards de Go.
Installation
go get github.com/jung-kurt/gofpdfExemple : une facture 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, "Facture n°123 du 01.01.2025", "0", 1, "C", false, 0, "") pdf.SetFont("Arial", "", 12) pdf.Ln(10) pdf.CellFormat(190, 10, "Produit : Ordinateur portable", "1", 1, "L", false, 0, "") pdf.CellFormat(190, 10, "Prix : 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) }}Avantages : dépendances minimales, contrôle total sur chaque élément, prise en charge Unicode (via AddUTF8Font).
Inconvénients : API de bas niveau — pour des rapports complexes, il faudra coder beaucoup manuellement.
2. maroto — génération de haut niveau avec tableaux et styles
Maroto est construite au-dessus de gofpdf, mais propose une API plus pratique : tableaux, grilles, alignement automatique et prise en charge intégrée des polices. Idéal pour les rapports standards : factures, listes, tarifs.
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.New() m.SetPageMargins(10, 10, 10) // Titre m.Row(10, func() { m.Col(12, func() { m.Text("Rapport de ventes", props.Text{ Style: props.Bold, Size: 16, Align: props.Center, }) }) }) // Tableau header := []string{"Produit", "Quantité", "Prix"} data := [][]string{ {"Moniteur", "2", "30 000"}, {"Clavier", "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")}Avantages : développement rapide, styles intégrés, saut de page automatique.
Inconvénients : moins de flexibilité pour une mise en page non standard.
3. wkhtmltopdf — conversion HTML en PDF via une enveloppe Go
Si vous avez déjà des modèles HTML (par exemple, avec Bootstrap), le plus simple est d'utiliser wkhtmltopdf. Ce n'est pas une bibliothèque Go, mais un utilitaire en ligne de commande, pour lequel il existe une enveloppe Go go-wkhtmltopdf. Elle prend une chaîne HTML et retourne un PDF.
Installation
# Installez d'abord wkhtmltopdf : https://wkhtmltopdf.org/downloads.htmlgo get github.com/SebastiaanKlippert/go-wkhtmltopdf