PDF-Berichte in GO generieren

OK. Jetzt wird PDFs in GO! generiert.

Inhaltsverzeichnis

Das programmgesteuerte Erstellen von PDF-Dokumenten kann eine wichtige Funktion in Ihrer Anwendung sein. Hier untersuchen wir kurz mit Beispielen die in der Programmiersprache Go (Golang) verfügbaren Bibliotheken zum Erstellen von PDF-Dateien.

Geeignete Lösungen können sich je nach Anwendungsfall unterscheiden, sei es die Erstellung einfacher Dokumente oder die komplexe, funktionsreiche PDF-Generierung.

go, pdf! Ja, das Bild ist KI-generiert; das Modell ist Flux1.Dev.

Bibliotheken und Tools

gofpdf

GoPdf ist eine unkomplizierte Bibliothek zum Erstellen von PDFs. Sie ermöglicht das Hinzufügen von Text, Bildern, Formen und Tabellen sowie die Verarbeitung mehrerer Seiten. Geeignet für einfache bis mittelkomplexe Aufgaben im Bereich der PDF-Erstellung.

Betreuer: Jung Kurt (nicht mehr aktiv weiterentwickelt, aber weiterhin in Verwendung).

Einschränkung: Fehlen von Updates, obwohl bestehende Nutzungen bestehen bleiben.

Beispiel:

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

Betreuer: signintech (aktiv weiterentwickelt).

In der Programmiersprache Go ist gopdf, entwickelt von SignInTech, eine der herausragenden Bibliotheken für diesen Zweck. Diese Bibliothek bietet eine unkomplizierte Möglichkeit, PDFs programmgesteuert zu erstellen, ohne auf externe Abhängigkeiten oder C-Bibliotheken angewiesen zu sein.

gopdf ist eine reine Go-Bibliothek, die speziell für die Erstellung von PDF-Dokumenten konzipiert wurde. Sie bietet eine einfache und effiziente API, die sich vor allem auf die PDF-Generierung konzentriert. Dies macht sie für grundlegende Aufgaben einfacher zu verwenden, während sie die Flexibilität für komplexere Operationen beibehält.

Hauptmerkmale:

  • Reine Go-Implementierung: Keine externen Abhängigkeiten oder C-Bibliotheken erforderlich.
  • Einfache API: Benutzerfreundliche Funktionen zum Erstellen von PDFs.
  • Effiziente Leistung: Optimiert für schnelles und effizientes Erstellen von PDFs.

Beispielhafte Verwendung

Um zu veranschaulichen, wie gopdf verwendet werden kann, betrachten wir hier ein grundlegendes Beispiel für die Erstellung eines einfachen PDF-Dokuments:

package main

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

func main() {
    // Erstelle eine neue PDF-Instanz
    pdf := gopdf.New()

    // Setze die Seitengröße und Ränder
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Füge Text in das PDF ein
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Speichere das PDF in eine Datei
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dieses Beispiel demonstriert, wie eine neue PDF-Dokumentdatei erstellt, ihr Text hinzugefügt und sie als Datei gespeichert wird.

Fortgeschrittene Funktionen von gopdf:

  • Hinzufügen von Bildern: Sie können Bilder in Ihre PDF-Dokumente einfügen, indem Sie die Methode AddImage verwenden.
  • Zeichnen von Formen: Die Bibliothek bietet Funktionen zum Zeichnen von Linien, Rechtecken und anderen Formen.
  • PDF-Schutz: Sie können Ihren PDFs einen Passwortschutz zuweisen, um den Zugriff zu beschränken.

pdfcpu

Eine weitere leistungsfähige Bibliothek für die PDF-Manipulation in Go ist pdfcpu. Diese Bibliothek bietet einen umfassenden Funktionsumfang zum Erstellen, Ändern und Untersuchen von PDF-Dateien über sowohl eine API als auch eine Befehlszeilenschnittstelle (CLI). Im Folgenden gehen wir auf die Beschreibung, Verwendungsbeispiele und die wichtigsten Funktionen von pdfcpu ein.

pdfcpu ist eine auf Go basierende PDF-Verarbeitungsbibliothek, die Verschlüsselung unterstützt und robuste Werkzeuge zur Bearbeitung verschiedener Aspekte von PDF-Dokumenten bietet. Sie ist mit allen PDF-Versionen kompatibel, einschließlich laufender Verbesserungen für PDF 2.0 (ISO-32000-2). Das Ziel der Bibliothek ist es, einen umfassenden Bereich an PDF-Verarbeitungsfunktionen bereitzustellen, was sie sowohl für einfache als auch für komplexe Anwendungsfälle geeignet macht.

Hauptmerkmale

  • Verschlüsselungsunterstützung: pdfcpu unterstützt die Verschlüsselung und ermöglicht es Entwicklern, ihre PDF-Dokumente effektiv zu sichern.
  • API und CLI: Es werden sowohl eine API für den programmgesteuerten Zugriff als auch eine Befehlszeilenschnittstelle (CLI) für schnelle Operationen angeboten.
  • Stapelverarbeitung: Starke Unterstützung für die Stapelverarbeitung über die umfangreiche Befehlszeile macht es effizient, mehrere Dateien gleichzeitig zu verarbeiten.
  • Kompatibilität: Kompatibel mit allen PDF-Versionen, einschließlich grundlegender Unterstützung und laufender Verbesserungen für PDF 2.0.

Um mit pdfcpu zu beginnen, müssen Sie es über das Paketverwaltungssystem von Go installieren:

go get github.com/pdfcpu/pdfcpu

Grundlegende Befehlszeilenoperationen

pdfcpu bietet eine Vielzahl von Befehlen für verschiedene Operationen. Hier sind einige Beispiele:

Erstellen eines PDFs aus Bildern

Sie können eine oder mehrere Bilddateien in eine PDF-Datei umwandeln, indem Sie den folgenden Befehl verwenden:

pdfcpu img2pdf out.pdf image1.jpg image2.png

Dieser Befehl erstellt ein PDF, bei dem jedes Bild auf eine separate Seite gerendert wird.

Um mehrere PDF-Dateien in ein einzelnes Dokument zusammenzuführen, verwenden Sie den merge-Befehl:

pdfcpu merge output.pdf file1.pdf file2.pdf

Verwendungsbeispiel für pdfcpu

Für komplexere Operationen können Sie die von pdfcpu bereitgestellte API verwenden. Hier ist ein Beispiel, wie Sie ein neues PDF erstellen und Text hinzufügen, indem Sie Go-Code verwenden:

package main

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

func main() {
    // Erstelle ein neues PDF-Dokument
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Füge eine Seite zum Dokument hinzu
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Füge Text zur Seite hinzu
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // Speichere das Dokument
    err := doc.Save("output.pdf")
    if err != nil {
        log.Fatal(err)
    }
}

Dieses Beispiel demonstriert, wie mit der API von pdfcpu ein neues PDF erstellt, eine Seite hinzugefügt und Text darauf geschrieben wird.

Maroto

  • Betreuer: go-playground-Team (https://github.com/go-playground/maroto).
  • Anwendungsfälle: Entwickler, die einen designorientierten Ansatz bevorzugen (ähnlich wie Bootstrap).
  • Von Bootstrap inspiriert; so konzipiert, dass sie mit einem deklarativen Stil, ähnlich wie HTML/CSS, einfach zu verwenden ist.
  • Basiert auf gofpdf und vereinfacht den Erstellungsprozess, während sie leistungsfähige Anpassungsoptionen beibehält.

Maroto ist eine weitere Go-Bibliothek zum Erstellen von PDFs, die sich jedoch darauf konzentriert, den Prozess zu vereinfachen, indem sie niedrige Ebenendetails abstrahiert. Sie baut auf der Bibliothek gofpdf auf und bietet eine benutzerfreundlichere API für die Dokumentgenerierung.

Verwendungsbeispiel für Maroto

Hier ist ein Beispiel, wie Sie Maroto verwenden können, um ein einfaches PDF zu erstellen:

package main

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

func main() {
    // Erstelle ein neues PDF-Dokument mit angegebenen Dimensionen
    m := maroto.NewPDF(595, 842) // A4-Größe in Punkten

    // Füge Text auf der ersten Seite hinzu
    m.AddText("Hello, Maroto!", 0, 0)

    // Speichere das PDF in eine Datei
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dieses Beispiel zeigt, wie man ein neues PDF-Dokument mit einer Seite erstellt und ihr Text mit Maroto hinzufügt.

Unipdf

UniPDF ist eine weitere leistungsfähige und umfassende Bibliothek zum Erstellen und Verarbeiten von PDF-Dateien in Golang (Go). Sie bietet eine Reihe von Funktionen, die sie unter Entwicklern, die Inhalte aus PDF-Dokumenten generieren, ändern und extrahieren müssen, beliebt machen.

  • Betreuer: UnidocLib (https://unidoc.io).
  • Anwendungsfälle: Fortgeschrittene PDF-Verarbeitung (Verschlüsselung, Zusammenführen, Skripting).
  • Leistungsstarke Bibliothek zum Erstellen und Verarbeiten von PDFs (reines Go).
  • Bietet umfangreiche Funktionen, darunter interaktive Elemente wie Links, Lesezeichen, Zusammenführen/Aufteilen, Verschlüsselung und vieles mehr.
  • Umfassende API zum Lesen und Schreiben von PDF-Objekten (Dictionarys, Streams).
  • Geeignet für Anwendungen, die robuste PDF-Generierungsfähigkeiten benötigen.

Installation von UniPDF

Um mit UniPDF zu beginnen, müssen Sie die Bibliothek installieren. Befolgen Sie diese Schritte:

# Erstellen Sie ein neues Verzeichnis:
mkdir go-pdf-generator cd go-pdf-generator
# Initialisieren Sie das Go-Modul:
go mod init go-pdf-generator
# Installieren Sie die UniPDF-Bibliothek:
go get github.com/unidoc/unipdf/v3

Damit wird Ihr Projekt eingerichtet und die erforderlichen Abhängigkeiten installiert.

Beispiel für grundlegende Verwendung

Hier ist ein einfaches Beispiel zum Erstellen eines PDF-Dokuments mit UniPDF:

package main

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

func main() {
    // Erstelle ein neues PDF-Dokument
    pdf := creator.New()

    // Füge eine Seite zum PDF hinzu
    page := pdf.NewPage()

    // Richte den Inhaltsstrom für die Seite ein
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Füge Text zur Seite hinzu
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Speichere das PDF-Dokument
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dieses Beispiel demonstriert, wie ein neues PDF-Dokument erstellt, eine Seite hinzugefügt und Text darauf geschrieben wird. Die resultierende Datei example.pdf wird den Text „Hello, UniPDF!" enthalten.

wkhtmltopdf Wrapper

Funktionen:

  • Wandelt HTML-Vorlagen (gerendert mit Golangs html/template) in PDF um.
  • Anpassbare Ränder, Seitenorientierung und Kopf-/Fußzeilen.
  • Geeignet, wenn das Design des Dokuments komplex ist und HTML/CSS-Styling beinhaltet.
  • Verwendet wkhtmltopdf als Backend, um HTML-Inhalte in das PDF-Format zu konvertieren.

Verwendungsbeispiel für 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 (von EndFirstCorp):

  • Ein Befehlszeilenwerkzeug für verschiedene PDF-Operationen wie Validierung, Optimierung, Aufteilen/Zusammenführen.
  • Nützlich für Stapelverarbeitung und administrative Aufgaben im Zusammenhang mit PDF-Dokumenten.

Überblick über pdflib

Die pdflib-Bibliothek ist so konzipiert, dass sie ein umfassender PDF-Processor für die Programmiersprache Go ist. Sie unterstützt verschiedene Funktionen wie die Validierung, Optimierung, das Aufteilen, Zusammenführen, Extrahieren von Inhalten aus und Kürzen von PDFs. Die Bibliothek richtet sich nach dem Standard PDF 32000-1:2008 (PDF 1.7) und gewährleistet die Kompatibilität mit einem breiten Spektrum an PDF-Dokumenten.

Wichtige Funktionen

  • Validierung: Stellt sicher, dass PDF-Dateien dem Standard PDF 1.7 entsprechen.
  • Optimierung: Reduziert die Dateigröße, indem sie redundante Ressourcen eliminiert.
  • Aufteilen und Zusammenführen: Ermöglicht das Aufteilen mehrseitiger PDFs in Ein-Seiten-PDFs oder das Zusammenführen mehrerer PDFs in eines.
  • Extraktion: Extrahiert Bilder, Schriften, Inhalte und Seiten aus einem PDF.
  • Kürzen: Erstellt gekürzte Versionen von PDF-Dokumenten.

Installation

Um pdflib zu verwenden, müssen Sie es über das Paketverwaltungssystem von Go installieren. Dies können Sie tun, indem Sie Folgendes ausführen:

go get github.com/EndFirstCorp/pdflib

Beispiel für grundlegende Verwendung – Validierung eines PDFs

Hier ist ein einfaches Beispiel, das demonstriert, wie die pdflib-Bibliothek für grundlegende PDF-Operationen verwendet werden kann:

Um ein PDF gegen den Standard PDF 1.7 zu validieren, können Sie den folgenden Code verwenden:

package main

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

func main() {
   // Validiere eine PDF-Datei
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validierung fehlgeschlagen:", err)
   } else {
     fmt.Println("PDF ist gültig.")
   }
}

Fazit

Beim Erstellen von PDFs in Go hängt die Wahl der Bibliothek von der Komplexität und den spezifischen Anforderungen Ihres Projekts ab. Die folgenden Empfehlungen werden gegeben:

  • Einfache Dokumente: Verwenden Sie gofpdf oder Maroto. Diese Bibliotheken bieten Einfachheit und Benutzerfreundlichkeit für unkomplizierte Aufgaben.
  • Komplexe Designs mit HTML/CSS: Nutzen Sie den wkhtmltopdf Wrapper, der wkhtmltopdf verwendet, um komplexe HTML-Inhalte und Stile zu verarbeiten.
  • Fortgeschrittene PDF-Verarbeitung: Wählen Sie Unipdf oder pdfcpu, wenn Ihre Anwendung fortgeschrittene Funktionen wie Verschlüsselung, interaktive Elemente, detaillierte Formatierung und umfassende Manipulationsfähigkeiten erfordert.

Jede dieser Bibliotheken bietet einzigartige Stärken, die verschiedenen Bedürfnissen bei der PDF-Generierung gerecht werden und Entwicklern eine Vielzahl von Werkzeugen zur Auswahl auf der Grundlage ihrer spezifischen Anforderungen bietet.

Abonnieren

Neue Beiträge zu Systemen, Infrastruktur und KI-Engineering.