Génération de rapports PDF en GO

OK. Génération de PDF en GO !

Sommaire

Générer des documents PDF de manière programmatoire peut être une fonctionnalité importante dans votre application. Ici, nous explorons et donnons un court aperçu avec des exemples des bibliothèques disponibles dans le langage de programmation Go (Golang) pour la génération de fichiers PDF.

Des solutions adaptées peuvent varier selon qu’il s’agit de la création de documents simples ou de la génération de PDF complexes et riches en fonctionnalités.

go, pdf! 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 simples à modérément complexes.

Mainteneur : Jung Kurt (discontinu mais encore utilisé).

Limitation : Manque de mises à jour, bien que l’utilisation existante 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 distinguent à cet égard est gopdf, développée par SignInTech. Cette bibliothèque propose une manière simple de créer des PDF de manière programmatoire sans dépendre d’autres bibliothèques ou de bibliothèques C.

gopdf est une bibliothèque pure Go conçue spécifiquement pour la création de documents PDF. Elle offre une API simple et efficace axée principalement sur la génération de PDF, ce qui la rend plus facile à utiliser pour les tâches basiques tout en maintenant la flexibilité nécessaire pour les opérations plus complexes.

Fonctionnalités clés :

  • Implémentation pure Go : Aucune dépendance externe ou bibliothèque C requise.
  • API simple : Fonctions faciles à utiliser pour générer des PDF.
  • Performance efficace : Optimisée pour une création rapide et efficace de PDF.

Exemple d’utilisation

Pour illustrer comment gopdf peut être utilisé, examinons un exemple simple de création d’un document PDF :

package main

import (
    "github.com/signintech/gopdf"
)

func main() {
    // Créer une nouvelle instance PDF
    pdf := gopdf.New()

    // Définir la taille de la page et les marges
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Ajouter du texte au PDF
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Enregistrer le PDF dans un fichier
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Cet exemple montre comment créer un nouveau document PDF, ajouter du texte à celui-ci et l’enregistrer sous forme de fichier.

Fonctionnalités avancées de gopdf :

  • Ajout d’images : Vous pouvez insérer des images dans vos documents PDF à l’aide de 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 définir une protection par mot de passe sur vos PDF pour limiter l’accès.

pdfcpu

Une autre bibliothèque puissante disponible pour la manipulation de PDF en Go est pdfcpu. Cette bibliothèque propose un ensemble complet 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 détaillons 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 propose 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 en cours pour PDF 2.0 (ISO-32000-2). La bibliothèque vise à offrir une gamme complète de fonctionnalités de traitement de PDF, la rendant adaptée à la fois pour des cas d’utilisation simples et complexes.

Fonctionnalités clés

  • Support du chiffrement : pdfcpu prend en charge le chiffrement, permettant aux développeurs de sécuriser efficacement leurs documents PDF.
  • API et CLI : Elle propose à la fois une API pour un accès programmatoire et une interface en ligne de commande (CLI) pour des opérations rapides.
  • Traitement par lots : Un bon support du traitement par lots via la ligne de commande permet de gérer efficacement plusieurs fichiers à la fois.
  • Compatibilité : Compatible avec toutes les versions de PDF, y compris un support de base et des améliorations en cours pour PDF 2.0.

Pour commencer avec pdfcpu, vous devez l’installer à l’aide du système de gestion de paquets Go :

go get github.com/pdfcpu/pdfcpu

Opérations de base en ligne de commande

pdfcpu propose une variété de commandes pour différentes opérations. Voici quelques exemples :

Créer un PDF à partir d’images

Vous pouvez convertir un ou plusieurs fichiers d’images en un 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 distincte.

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 création d’un nouveau PDF et d’ajout de texte à l’aide du code Go :

package main

import (
    "github.com/pdfcpu/pdfcpu"
    "log"
)

func main() {
    // Créer un nouveau document PDF
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Ajouter une page au document
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Ajouter du texte à la page
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // Enregistrer le document
    err := doc.Save("output.pdf")
    if err != nil {
        log.Fatal(err)
    }
}

Cet exemple montre comment créer un nouveau PDF, ajouter une page et écrire du texte dessus à l’aide de 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é par Bootstrap ; conçu pour être facile à utiliser avec un style déclaratif similaire à HTML/CSS.
  • Construit sur gofpdf, il simplifie le processus de création tout en maintenant des options de personnalisation puissantes.

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 de bas niveau. Elle s’appuie sur la bibliothèque gofpdf et propose une API plus conviviale pour la génération de documents.

Exemple d’utilisation de Maroto

Voici un exemple de la manière dont vous pouvez utiliser Maroto pour créer un PDF simple :

package main

import (
    "github.com/andreyhoffmann1103/maroto"
)

func main() {
    // Créer un nouveau document PDF avec des dimensions spécifiées
    m := maroto.NewPDF(595, 842) // Taille A4 en points

    // Ajouter du texte à la première page
    m.AddText("Hello, Maroto!", 0, 0)

    // Enregistrer le PDF dans un fichier
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

Cet exemple montre comment créer un nouveau document PDF avec une page et 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 propose une large gamme de fonctionnalités qui en font un choix populaire parmi les développeurs qui ont besoin de générer, modifier et extraire du contenu à partir de documents PDF.

  • Mainteneur : UnidocLib (https://unidoc.io).
  • Cas d’utilisation : Traitement avancé de PDF (chiffrement, fusion, scriptage).
  • Bibliothèque puissante pour la création et le traitement de PDF (pure Go).
  • Propose des fonctionnalités étendues, notamment des éléments interactifs comme les liens, les signets, la fusion/séparation, le 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 de génération de PDF robustes.

Installation d’UniPDF

Pour commencer avec UniPDF, vous devez installer la bibliothèque. Suivez ces étapes :

# Créer un nouveau répertoire :
mkdir go-pdf-generator cd go-pdf-generator
# Initialiser le module Go :
go mod init go-pdf-generator
# Installer la bibliothèque UniPDF :
go get github.com/unidoc/unipdf/v3

Cela configurera votre projet et installera les dépendances nécessaires.

Exemple d’utilisation de base

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() {
    // Créer un nouveau document PDF
    pdf := creator.New()

    // Ajouter une page au PDF
    page := pdf.NewPage()

    // Configurer le flux de contenu pour la page
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Ajouter du texte à la page
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Enregistrer le document PDF
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Cet exemple montre comment créer un nouveau document PDF, ajouter une page et écrire du texte dessus. Le fichier résultant example.pdf contiendra le texte “Hello, UniPDF!”.

Wrapper wkhtmltopdf

Fonctionnalités :

  • Convertit des modèles HTML (rendus avec html/template de Go) en PDF.
  • Marges, orientation de page et en-têtes/pieds personnalisables.
  • Adapté lorsque la conception du document est complexe et implique un style HTML/CSS.
  • Utilise wkhtmltopdf comme backend pour convertir le contenu HTML en 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 (de EndFirstCorp):

  • Outil en ligne de commande pour diverses opérations PDF comme la validation, l’optimisation, la séparation/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 séparation, la fusion, l’extraction de contenu et le troncage de PDF. La bibliothèque suit la norme PDF 32000-1:2008 (PDF 1.7), assurant la compatibilité avec une large gamme de documents PDF.

Fonctionnalités clés

  • Validation : Assure que les fichiers PDF respectent la norme PDF 1.7.
  • Optimisation : Réduit la taille du fichier en éliminant les ressources redondantes.
  • Séparation et fusion : Permet de séparer des PDF multipages en des PDF individuels ou de fusionner plusieurs PDF en un seul.
  • Extraction : Extrait des images, des polices, du contenu et des pages à partir d’un PDF.
  • Troncage : Crée des versions tronqué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 de base - Validation d’un PDF

Voici un exemple simple démontrant comment utiliser la bibliothèque pdflib pour effectuer des opérations de base sur des PDF :

Pour valider un PDF contre la norme PDF 1.7, vous pouvez utiliser le code suivant :

package main

import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )

func main() {
   // Valider un fichier PDF
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validation échouée :", err)
   } else {
     fmt.Println("Le PDF est valide.")
   }
}

Conclusion

Pour générer des PDF en Go, le choix de la bibliothèque dépend de la complexité et des exigences spécifiques de votre projet. Les recommandations suivantes sont fournies :

  • Documents simples : Utilisez gofpdf ou Maroto. Ces bibliothèques offrent simplicité et facilité d’utilisation pour les tâches simples.
  • Conceptions complexes avec HTML/CSS : Utilisez le wkhtmltopdf Wrapper, qui exploite wkhtmltopdf pour gérer le contenu HTML complexe et le style.
  • Traitement avancé de PDF : Optez pour Unipdf ou pdfcpu lorsque votre application nécessite des fonctionnalités avancées telles que le chiffrement, les éléments interactifs, le formatage détaillé et les capacités de manipulation complète.

Chacune de ces bibliothèques offre des forces uniques qui répondent à différents besoins dans la génération de PDF, offrant aux développeurs une variété d’outils à choisir selon leurs besoins spécifiques.

Liens des bibliothèques

Autres liens utiles