PDF-rapporten genereren in GO

OK. Nu PDF's genereren in GO!

Inhoud

Programmatisch PDF-documenten genereren kan een belangrijke functie zijn in uw toepassing. Hieronder bespreken we en geven we een korte overzicht met voorbeelden van de bibliotheken beschikbaar in de Go-programmeertaal (Golang) voor het genereren van PDF-bestanden.

Aanbevolen oplossingen kunnen verschillen, afhankelijk van of het gaat om het maken van eenvoudige documenten of het genereren van complexe en functierijke PDF’s.

go, pdf! Ja, het beeld is AI-generatie, het model is Flux1.Dev.

Bibliotheken en Tools

gofpdf

GoPdf is een eenvoudige bibliotheek voor het maken van PDF’s. Het stelt u in staat om tekst, afbeeldingen, vormen, tabellen toe te voegen en meerdere pagina’s te beheren. Geschikt voor eenvoudige tot matig complexe PDF-opdrachten.

Beheerder: Jung Kurt (verlaten, maar nog steeds gebruikt).

Beperking: Gebrek aan updates, hoewel de huidige gebruikte versie nog steeds in gebruik is.

Voorbeeld:

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

Beheerder: signintech (actief onderhouden).

In de Go-programmeertaal is één van de bibliotheken die opvallen voor dit doel gopdf, ontwikkeld door SignInTech. Deze bibliotheek biedt een eenvoudige manier om PDF’s programmatisch te genereren zonder afhankelijk te zijn van externe bibliotheken of C-bibliotheken.

gopdf is een pure Go-bibliotheek die specifiek is ontworpen voor het maken van PDF-documenten. Het biedt een eenvoudige en efficiënte API die zich vooral richt op PDF-generatie, waardoor het makkelijker te gebruiken is voor basisopdrachten, terwijl het de flexibiliteit behoudt die nodig is voor complexere operaties.

Belangrijke functies:

  • Pure Go-implementatie: Geen externe afhankelijkheden of C-bibliotheken vereist.
  • Eenvoudige API: Makkelijk te gebruiken functies voor het genereren van PDF’s.
  • Efficiënte prestaties: Optimaliseerd voor snelle en efficiënte PDF-generatie.

Voorbeeldgebruik

Om te laten zien hoe gopdf kan worden gebruikt, kijken we naar een eenvoudig voorbeeld van het maken van een PDF-document:

package main

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

func main() {
    // Maak een nieuw PDF-exemplaar
    pdf := gopdf.New()

    // Stel de paginaformaat en marges in
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Voeg tekst toe aan de PDF
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Sla de PDF op als bestand
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dit voorbeeld laat zien hoe u een nieuw PDF-document kunt maken, tekst kunt toevoegen en het als bestand kunt opslaan.

Geavanceerde functies van gopdf:

  • Afbeeldingen toevoegen: U kunt afbeeldingen in uw PDF-documenten invoegen met behulp van de AddImage-methode.
  • Vormen tekenen: De bibliotheek biedt functies om lijnen, rechthoeken en andere vormen te tekenen.
  • PDF-beveiliging: U kunt wachtwoordbeveiliging instellen op uw PDF’s om toegang te beperken.

pdfcpu

Een andere krachtige bibliotheek beschikbaar voor PDF-manipulatie in Go is pdfcpu. Deze bibliotheek biedt een uitgebreid pakket functies voor het maken, wijzigen en inspecteren van PDF-bestanden via zowel een API als een opdrachtregelinterface (CLI). Hieronder bespreken we de beschrijving, gebruikvoorbeelden en belangrijke functionaliteiten van pdfcpu.

pdfcpu is een Go-gestuurde PDF-verwerkingsbibliotheek die encryptie ondersteunt en robuuste tools biedt voor het beheren van verschillende aspecten van PDF-documenten. Het is compatibel met alle PDF-versies, inclusief voortdurende verbeteringen voor PDF 2.0 (ISO-32000-2). De bibliotheek richt zich erop om een uitgebreid bereik aan PDF-verwerkingsfunctionaliteiten te bieden, waardoor het geschikt is voor zowel eenvoudige als complexe toepassingen.

Belangrijke functies

  • Encryptie-ondersteuning: pdfcpu ondersteunt encryptie, waardoor ontwikkelaars hun PDF-documenten effectief kunnen beveiligen.
  • API en CLI: Het biedt zowel een API voor programma-toegang als een opdrachtregelinterface (CLI) voor snelle bewerkingen.
  • Batchverwerking: Sterke ondersteuning voor batchverwerking via de rijke opdrachtregel maakt het efficiënt voor het verwerken van meerdere bestanden tegelijk.
  • Compatibiliteit: Compatibel met alle PDF-versies, inclusief basisondersteuning en voortdurende verbeteringen voor PDF 2.0.

Om aan de slag te gaan met pdfcpu, moet u het installeren via Go’s pakketbeheersysteem:

go get github.com/pdfcpu/pdfcpu

Basisopdrachtregelbewerkingen

pdfcpu biedt een verscheidenheid aan opdrachten voor verschillende bewerkingen. Hier zijn enkele voorbeelden:

Een PDF maken vanaf afbeeldingen

U kunt één of meer afbeeldingsbestanden converteren naar een PDF-bestand met de volgende opdracht:

pdfcpu img2pdf out.pdf image1.jpg image2.png

Deze opdracht maakt een PDF waarin elke afbeelding op een aparte pagina wordt weergegeven.

Om meerdere PDF-bestanden samen te voegen tot één document, gebruikt u de merge-opdracht:

pdfcpu merge output.pdf file1.pdf file2.pdf

Voorbeeldgebruik van pdfcpu

Voor complexere bewerkingen kunt u de API van pdfcpu gebruiken. Hier is een voorbeeld van hoe u een nieuwe PDF kunt maken en tekst kunt toevoegen met behulp van Go-code:

package main

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

func main() {
    // Maak een nieuw PDF-document
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Voeg een pagina toe aan het document
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Voeg tekst toe aan de pagina
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

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

Dit voorbeeld laat zien hoe u een nieuw PDF-document kunt maken, een pagina kunt toevoegen en tekst kunt schrijven met behulp van de API van pdfcpu.

Maroto

  • Beheerder: go-playground-team (https://github.com/go-playground/maroto).
  • Toepassingen: Ontwikkelaars die een design-first aanpak voorkeuren (vergelijkbaar met Bootstrap).
  • Geïnspireerd door Bootstrap; ontworpen om eenvoudig te gebruiken met een declaratieve stijl vergelijkbaar met HTML/CSS.
  • Opgebouwd op gofpdf, vereenvoudigt het de aanmaakproces terwijl het krachtige aanpassingsmogelijkheden behoudt.

Maroto is een andere Go-bibliotheek voor het maken van PDF’s, maar richt zich op het vereenvoudigen van het proces door laag niveau details te abstracteren. Het bouwt op de gofpdf-bibliotheek en biedt een gebruikersvriendelijker API voor het genereren van documenten.

Voorbeeldgebruik van Maroto

Hier is een voorbeeld van hoe u Maroto kunt gebruiken om een eenvoudige PDF te maken:

package main

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

func main() {
    // Maak een nieuw PDF-document met opgegeven afmetingen
    m := maroto.NewPDF(595, 842) // A4-grootte in punten

    // Voeg tekst toe aan de eerste pagina
    m.AddText("Hello, Maroto!", 0, 0)

    // Sla de PDF op als bestand
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dit voorbeeld laat zien hoe u een nieuw PDF-document kunt maken met één pagina en tekst kunt toevoegen met behulp van Maroto.

Unipdf

UniPDF is een andere krachtige en uitgebreide bibliotheek voor het maken en verwerken van PDF-bestanden in Golang (Go). Het biedt een breed scala aan functies die het populair maken onder ontwikkelaars die PDF’s moeten genereren, wijzigen en inhoud uit PDF-documenten moeten extraheren.

  • Beheerder: UnidocLib (https://unidoc.io).
  • Toepassingen: Geavanceerde PDF-verwerking (versleuteling, samenvoegen, scripten).
  • Krachtige bibliotheek voor het maken en verwerken van PDF’s (pure Go).
  • Biedt uitgebreide functies, waaronder interactieve elementen zoals links, bladwijzers, samenvoegen/splitsen, versleuteling en meer.
  • Uitgebreide API voor het lezen en schrijven van PDF-objecten (dictionaries, streams).
  • Geschikt voor toepassingen die robuuste PDF-generatiefunctionaliteiten nodig hebben.

UniPDF-installatie

Om aan de slag te gaan met UniPDF, moet u de bibliotheek installeren. Volg deze stappen:

# Maak een nieuwe map:
mkdir go-pdf-generator cd go-pdf-generator
# Initialiseer de Go-module:
go mod init go-pdf-generator
# Installeer de UniPDF-bibliotheek:
go get github.com/unidoc/unipdf/v3

Dit stelt uw project op en installeert de benodigde afhankelijkheden.

Voorbeeld van basisgebruik

Hier is een eenvoudig voorbeeld om een PDF-document te maken met behulp van UniPDF:

package main

import (
    "github.com/unidoc/unipdf/v3/core"
    "github.com/unidoc/unipdf/v3/model"
    "github.com/unidoc/unipdf/v3/creator"
)

func main() {
    // Maak een nieuw PDF-document
    pdf := creator.New()

    // Voeg een pagina toe aan de PDF
    page := pdf.NewPage()

    // Stel de inhoudsstroom voor de pagina in
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Voeg tekst toe aan de pagina
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Sla het PDF-document op
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dit voorbeeld laat zien hoe u een nieuw PDF-document kunt maken, een pagina kunt toevoegen en tekst kunt schrijven. Het resulterende bestand example.pdf bevat de tekst “Hello, UniPDF!”.

wkhtmltopdf Wrapper

Kenmerken:

  • Converteert HTML-sjablonen (gerenderd met Go’s html/template) naar PDF.
  • Aanpasbare marges, pagina-oriëntatie en koppen/voetnoten.
  • Geschikt wanneer de documentopmaak complex is en HTML/CSS-styling bevat.
  • Gebruikt wkhtmltopdf als backend om HTML-inhoud om te zetten naar PDF-formaat.

go-wkhtmltopdf gebruiksvoorbeeld

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 (van EndFirstCorp):

  • Een opdrachtregelprogramma voor verschillende PDF-bewerkingen zoals validatie, optimalisatie, splitsen/verenigen.
  • Nuttig voor batchverwerking en administratieve taken gerelateerd aan PDF-documenten.

Overzicht van pdflib

De pdflib-bibliotheek is ontworpen als een uitgebreid PDF-verwerker voor de Go-programmeertaal. Het ondersteunt verschillende functionaliteiten zoals validatie, optimalisatie, splitsen, verenigen, inhoud extraheren en trimmen van PDF’s. De bibliotheek volgt de PDF 32000-1:2008 (PDF 1.7) standaard, waardoor het compatibel is met een breed scala aan PDF-documenten.

Belangrijke kenmerken

  • Validatie: Zorgt ervoor dat PDF-bestanden voldoen aan de PDF 1.7 standaard.
  • Optimalisatie: Vermindert bestandsgrootte door redundante bronnen te verwijderen.
  • Splitsen en verenigen: Stelt u in staat om meerpagina PDF’s in enkelvoudige PDF’s te splitsen of meerdere PDF’s in één te verenigen.
  • Inhoud extraheren: Extrahert afbeeldingen, lettertypen, inhoud en pagina’s uit een PDF.
  • Trimmen: Maakt gecensureerde versies van PDF-documenten.

Installatie

Om pdflib te gebruiken, moet u het installeren via Go’s pakketbeheersysteem. U kunt dit doen door de volgende opdracht uit te voeren:

go get github.com/EndFirstCorp/pdflib

Voorbeeldgebruik - Validatie van een PDF

Hier is een eenvoudig voorbeeld dat laat zien hoe u de pdflib-bibliotheek kunt gebruiken om basisbewerkingen met PDF’s uit te voeren:

Om een PDF te valideren tegen de PDF 1.7 standaard, kunt u de volgende code gebruiken:

package main

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

func main() {
   // Valideer een PDF-bestand
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validatie is mislukt:", err)
   } else {
     fmt.Println("PDF is geldig.")
   }
}

Conclusie

Voor het genereren van PDF’s in Go, hangt de keuze van bibliotheek af van de complexiteit en specifieke eisen van uw project. De volgende aanbevelingen worden gegeven:

  • Eenvoudige documenten: Gebruik gofpdf of Maroto. Deze bibliotheken bieden eenvoudigheid en gemak voor eenvoudige taken.
  • Complexe ontwerpen met HTML/CSS: Gebruik de wkhtmltopdf Wrapper, die gebruikmaakt van wkhtmltopdf om complexe HTML-inhoud en styling te verwerken.
  • Geavanceerde PDF-verwerking: Kies voor Unipdf of pdfcpu wanneer uw toepassing geavanceerde functies zoals encryptie, interactieve elementen, gedetailleerde opmaak en uitgebreide manipulatiefunctionaliteiten vereist.

Elke van deze bibliotheken biedt unieke sterktes die voldoen aan verschillende behoeften bij het genereren van PDF’s, waardoor ontwikkelaars een breed scala aan tools hebben om te kiezen op basis van hun specifieke eisen.