Générer des rapports PDF dans Go
D'accord. Génération des PDF en GO !
La génération de documents PDF de manière programmée peut être une fonctionnalité essentielle dans votre application. Ici, nous explorons et présentons une brève revue avec des exemples des bibliothèques disponibles dans le langage de programmation Go (Golang) pour générer des fichiers PDF.
Les solutions appropriées peuvent varier, par exemple, entre la création de documents simples ou la génération de PDF complexes et riches en fonctionnalités.
Oui, l’image est générée par IA, le modèle est Flux1.Dev.
Bibliothèques et Outils
gofpdf
GoPdf est une bibliothèque simple pour la création de PDF. Elle permet d’ajouter du texte, des images, des formes, des tableaux et de gérer plusieurs pages. Adaptée aux tâches de création de PDF allant du simple au modérément complexe.
Mainteneur : Jung Kurt (projet abandonné mais toujours utilisé).
Limitation : Manque de mises à jour, bien que son utilisation persiste.
Exemple :
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, "Hello World!")
err := pdf.OutputFileAndClose("hello.pdf")
if err != nil {
panic(err)
}
}
gopdf
Mainteneur : signintech (activement maintenu).
Dans le langage de programmation Go, l’une des bibliothèques qui se démarque à cet effet est gopdf, développée par SignInTech. Cette bibliothèque offre une manière simple de créer des PDF de façon programmatique, sans recourir à des dépendances externes ni à des bibliothèques C.
gopdf est une bibliothèque Go pure conçue spécifiquement pour la création de documents PDF. Elle propose une API simple et efficace, axée principalement sur la génération de PDF, ce qui la rend facile à utiliser pour les tâches de base tout en conservant la flexibilité nécessaire pour des opérations plus complexes.
Fonctionnalités clés :
- Implémentation Go pure : Aucune dépendance externe ni bibliothèque C requise.
- API simple : Fonctions faciles à utiliser pour générer des PDF.
- Performance efficace : Optimisée pour une création de PDF rapide et efficace.
Exemple d’utilisation
Pour illustrer l’utilisation de gopdf, examinons un exemple basique de création d’un document PDF simple :
package main
import (
"github.com/signintech/gopdf"
)
func main() {
// Create a new PDF instance
pdf := gopdf.New()
// Set the page size and margins
pdf.SetPageSize(gopdf.PageSizeA4)
pdf.AddPage()
// Add some text to the PDF
pdf.SetFont("Arial", "", 12)
pdf.Write(50, 50, "Hello, World!")
// Save the PDF to a file
err := pdf.SaveToFile("example.pdf")
if err != nil {
panic(err)
}
}
Cet exemple démontre comment créer un nouveau document PDF, y ajouter du texte et le sauvegarder sous forme de fichier.
Fonctionnalités avancées de gopdf :
- Ajout d’images : Vous pouvez insérer des images dans vos documents PDF en utilisant la méthode AddImage.
- Dessin de formes : La bibliothèque fournit des fonctions pour dessiner des lignes, des rectangles et d’autres formes.
- Protection PDF : Vous pouvez configurer une protection par mot de passe sur vos PDF pour restreindre l’accès.
pdfcpu
- Mainteneur : Équipe PDFCPU (https://github.com/pdfcpu/pdfcpu).
- Cas d’utilisation : Manipulation et analyse de PDF à grande échelle.
Une autre bibliothèque puissante disponible pour la manipulation de PDF dans Go est pdfcpu. Cette bibliothèque offre une suite complète de fonctionnalités pour créer, modifier et inspecter des fichiers PDF, à la fois via une API et une interface en ligne de commande (CLI). Ci-dessous, nous nous penchons sur la description, les exemples d’utilisation et les fonctionnalités clés de pdfcpu.
pdfcpu est une bibliothèque de traitement de PDF basée sur Go qui prend en charge le chiffrement et offre des outils robustes pour gérer divers aspects des documents PDF. Elle est compatible avec toutes les versions de PDF, y compris les améliorations continues pour la version PDF 2.0 (ISO-32000-2). La bibliothèque vise à fournir une gamme complète de fonctionnalités de traitement de PDF, la rendant adaptée aux cas d’utilisation simples comme complexes.
Fonctionnalités clés
- Prise en charge du chiffrement : pdfcpu prend en charge le chiffrement, permettant aux développeurs de sécuriser efficacement leurs documents PDF.
- API et CLI : Elle offre à la fois une API pour un accès programmatique et une interface en ligne de commande (CLI) pour des opérations rapides.
- Traitement par lots : Un solide support du traitement par lots via la riche ligne de commande le rend efficace pour traiter plusieurs fichiers à la fois.
- Compatibilité : Compatible avec toutes les versions de PDF, y compris la prise en charge de base et les améliorations continues pour la version PDF 2.0.
Pour commencer avec pdfcpu, vous devez l’installer en utilisant le système de gestion de paquets Go :
go get github.com/pdfcpu/pdfcpu
Opérations de base en ligne de commande
pdfcpu fournit une variété de commandes pour différentes opérations. Voici quelques exemples :
Création d’un PDF à partir d’images
Vous pouvez convertir un ou plusieurs fichiers d’image en fichier PDF avec la commande suivante :
pdfcpu img2pdf out.pdf image1.jpg image2.png
Cette commande créera un PDF où chaque image est rendue sur une page séparée.
Pour fusionner plusieurs fichiers PDF en un seul document, utilisez la commande merge :
pdfcpu merge output.pdf file1.pdf file2.pdf
Exemple d’utilisation de pdfcpu
Pour des opérations plus complexes, vous pouvez utiliser l’API fournie par pdfcpu. Voici un exemple de la manière de créer un nouveau PDF et d’ajouter du texte à l’aide de code Go :
package main
import (
"github.com/pdfcpu/pdfcpu"
"log"
)
func main() {
// Create a new PDF document
doc := pdfcpu.NewPDF(0, 0)
defer doc.Close()
// Add a page to the document
page := doc.AddPage()
page.SetMediaBox(pdfcpu.MediaBox{
LLX: 0,
LLY: 0,
URX: 612,
URY: 792,
})
// Add text to the page
content := "Hello, World!"
font := pdfcpu.NewFont("Helvetica", "")
page.AddText(content, font, 12, 100, 750)
// Save the document
err := doc.Save("output.pdf")
if err != nil {
log.Fatal(err)
}
}
Cet exemple démontre comment créer un nouveau PDF, ajouter une page et y écrire du texte en utilisant l’API de pdfcpu.
Maroto
- Mainteneur : Équipe go-playground (https://github.com/go-playground/maroto).
- Cas d’utilisation : Développeurs préférant une approche centrée sur la conception (similaire à Bootstrap).
- Inspiré de Bootstrap ; conçu pour être facile à utiliser avec un style déclaratif similaire à HTML/CSS.
- Construit sur la base de gofpdf, il simplifie le processus de création tout en maintenant d’importantes options de personnalisation.
Maroto est une autre bibliothèque Go pour la création de PDF, mais elle se concentre sur la simplification du processus en abstrayant les détails bas niveau. Elle s’appuie sur la bibliothèque gofpdf et fournit une API plus conviviale pour générer des documents.
Exemple d’utilisation de Maroto
Voici un exemple montrant comment utiliser Maroto pour créer un PDF simple :
package main
import (
"github.com/andreyhoffmann1103/maroto"
)
func main() {
// Create a new PDF document with specified dimensions
m := maroto.NewPDF(595, 842) // A4 size in points
// Add some text to the first page
m.AddText("Hello, Maroto!", 0, 0)
// Save the PDF to a file
err := m.OutputFileAndClose("example.pdf")
if err != nil {
panic(err)
}
}
Cet exemple montre comment créer un nouveau document PDF d’une seule page et y ajouter du texte à l’aide de Maroto.
Unipdf
UniPDF est une autre bibliothèque puissante et complète pour la création et le traitement de fichiers PDF en Golang (Go). Elle offre une large gamme de fonctionnalités qui la rendent populaire auprès des développeurs ayant besoin de générer, modifier et extraire du contenu de documents PDF.
- Mainteneur : UnidocLib (https://unidoc.io).
- Cas d’utilisation : Traitement de PDF avancé (chiffrement, fusion, script).
- Puissante bibliothèque pour la création et le traitement de PDF (Go pur).
- Offre des fonctionnalités étendues incluant des éléments interactifs tels que liens, signets, fusion/fracas, chiffrement, etc.
- API complète pour la lecture et l’écriture d’objets PDF (dictionnaires, flux).
- Adaptée aux applications nécessitant des capacités robustes de génération de PDF.
Installation d’UniPDF
Pour commencer avec UniPDF, vous devez installer la bibliothèque. Suivez ces étapes :
# Create a New Directory:
mkdir go-pdf-generator cd go-pdf-generator
# Initialize the Go Module:
go mod init go-pdf-generator
# Install UniPDF Library:
go get github.com/unidoc/unipdf/v3
Cela configurera votre projet et installera les dépendances nécessaires.
Exemple d’utilisation basique
Voici un exemple simple pour créer un document PDF à l’aide d’UniPDF :
package main
import (
"github.com/unidoc/unipdf/v3/core"
"github.com/unidoc/unipdf/v3/model"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
// Create a new PDF document
pdf := creator.New()
// Add a page to the PDF
page := pdf.NewPage()
// Set up the content stream for the page
contentStream := model.NewContentStream()
page.SetContents(contentStream)
// Add text to the page
text := "Hello, UniPDF!"
font := creator.NewStandardFont(creator.FontHelvetica)
textObject := model.NewText(text, font, 12)
contentStream.Add(textObject)
// Save the PDF document
err := pdf.WriteToFile("example.pdf")
if err != nil {
panic(err)
}
}
Cet exemple démontre comment créer un nouveau document PDF, ajouter une page et y écrire du texte. Le fichier résulta example.pdf contiendra le texte “Hello, UniPDF!”.
wkhtmltopdf Wrapper
- https://github.com/SebastiaanKlippert/go-wkhtmltopdf
- Dépendance : Nécessite
wkhtmltopdfinstallé viabrewouapt-get. - Cas d’utilisation : Génération de PDF à partir de contenu HTML dynamique (p. ex., factures, rapports).
Fonctionnalités :
- Convertit les modèles HTML (rendus avec
html/templatede Go) en PDF. - Marges personnalisables, orientation de la page, en-têtes et pieds de page.
- Adapté lorsque la conception du document est complexe et implique un style HTML/CSS.
- Utilise wkhtmltopdf comme moteur arrière-plan pour convertir le contenu HTML au format PDF.
Exemple d’utilisation de go-wkhtmltopdf
import (
"bytes"
"github.com/SebastiaanKlippert/go-wkhtmltopdf"
"html/template"
)
type PDFService struct {}
func NewPDFService() *PDFService {
return &PDFService{}
}
func (p PDFService) GeneratePDF(data interface{}) ([]byte, error) {
var templ *template.Template
var err error
if templ, err = template.ParseFiles("pdf-template.html"); err != nil {
return nil, err
}
var body bytes.Buffer
if err := templ.Execute(&body, data); err != nil {
return nil, err
}
pdfg, err := wkhtmltopdf.NewPDFGenerator()
if err != nil {
return nil, err
}
page := wkhtmltopdf.NewPageReader(bytes.NewReader(body.Bytes()))
page.EnableLocalFileAccess.Set(true)
pdfg.AddPage(page)
pdfg.MarginLeft.Set(0)
pdfg.MarginRight.Set(0)
pdfg.Dpi.Set(300)
pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
pdfg.Orientation.Set(wkhtmltopdf.OrientationLandscape)
err = pdfg.Create()
if err != nil {
return nil, err
}
return pdfg.Bytes(), nil
}
pdflib (par EndFirstCorp) :
- Un outil en ligne de commande pour diverses opérations PDF telles que la validation, l’optimisation, la scission/fusion.
- Utile pour le traitement par lots et les tâches administratives liées aux documents PDF.
Aperçu de pdflib
La bibliothèque pdflib est conçue pour être un processeur PDF complet pour le langage de programmation Go. Elle prend en charge diverses fonctionnalités telles que la validation, l’optimisation, la scission, la fusion, l’extraction de contenu et la taille des PDF. La bibliothèque respecte la norme PDF 32000-1:2008 (PDF 1.7), garantissant la compatibilité avec un large éventail de documents PDF.
Fonctionnalités clés
- Validation : Assure que les fichiers PDF sont conformes à la norme PDF 1.7.
- Optimisation : Réduit la taille des fichiers en éliminant les ressources redondantes.
- Scission et fusion : Permet de diviser des PDF multipage en PDF monopage ou de fusionner plusieurs PDF en un seul.
- Extraction : Extrait des images, des polices, du contenu et des pages d’un PDF.
- Taille : Crée des versions rognées de documents PDF.
Installation
Pour utiliser pdflib, vous devez l’installer via le système de gestion de paquets Go. Vous pouvez le faire en exécutant :
go get github.com/EndFirstCorp/pdflib
Exemple d’utilisation basique - Validation d’un PDF
Voici un exemple simple illustrant comment utiliser la bibliothèque pdflib pour effectuer des opérations de base sur des PDF :
Pour valider un PDF par rapport à la norme PDF 1.7, vous pouvez utiliser le code suivant :
package main
import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )
func main() {
// Validate a PDF file
err := pdflib.Validate("example.pdf")
if err != nil {
fmt.Println("Validation failed:", err)
} else {
fmt.Println("PDF is valid.")
}
}
Conclusion
Pour générer des PDF dans Go, le choix de la bibliothèque dépend de la complexité et des exigences spécifiques de votre projet. Les recommandations suivantes sont proposées :
- Documents simples : Utilisez
gofpdfouMaroto. Ces bibliothèques offrent simplicité et facilité d’utilisation pour des tâches straightforward. - Conceptions complexes avec HTML/CSS : Exploitez le
wkhtmltopdf Wrapper, qui utilise wkhtmltopdf pour traiter des contenus HTML complexes et leur style. - Traitement de PDF avancé : Optez pour
Unipdfoupdfcpulorsque votre application nécessite des fonctionnalités avancées telles que le chiffrement, les éléments interactifs, le formatage détaillé et des capacités de manipulation complètes.
Chacune de ces bibliothèques offre des forces uniques qui répondent à différents besoins en génération de PDF, offrant aux développeurs une variété d’outils à choisir en fonction de leurs exigences spécifiques.