PDF-Berichte in GO generieren

OK. Jetzt werden PDFs in GO generiert!

Inhaltsverzeichnis

Die generische Erstellung von PDF-Dokumenten programmatisch kann eine wichtige Funktion in Ihrer Anwendung sein. Hier untersuchen wir und geben eine kurze Übersicht mit Beispielen der verfügbaren Bibliotheken in der Go-Programmiersprache (Golang) zur Erstellung von PDF-Dateien.

Eignende Lösungen können unterschiedlich sein, beispielsweise für einfache Dokumentenerstellung oder komplexe und funktionsreiche PDF-Generierung.

go, pdf! Ja, das Bild ist künstlich intelligent generiert, das Modell ist Flux1.Dev.

Bibliotheken und Tools

gofpdf

GoPdf ist eine einfache Bibliothek zur Erstellung von PDFs. Sie ermöglicht das Hinzufügen von Text, Bildern, Formen, Tabellen und das Verwalten mehrerer Seiten. Eignet sich für einfache bis mittelkomplexe PDF-Erstellungsaufgaben.

Maintainer: Jung Kurt (eingestellt, aber immer noch genutzt).

Einschränkung: Fehlende Updates, obwohl die Nutzung weiterhin besteht.

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

Maintainer: signintech (aktiv gepflegt).

In der Go-Programmiersprache ist eine der Bibliotheken, die sich hierfür hervorheben, gopdf, entwickelt von SignInTech. Diese Bibliothek bietet eine einfache Möglichkeit, PDFs programmatisch zu erstellen, ohne auf externe Abhängigkeiten oder C-Bibliotheken zu verlassen.

gopdf ist eine reine Go-Bibliothek, die speziell für die Erstellung von PDF-Dokumenten entwickelt wurde. Sie bietet eine einfache und effiziente API, die primär auf die PDF-Generierung fokussiert ist, was die Verwendung für grundlegende Aufgaben erleichtert, 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: Einfach zu verwendende Funktionen zur Erstellung von PDFs.
  • Effiziente Leistung: Optimiert für schnelle und effiziente PDF-Erstellung.

Beispielanwendung

Um zu zeigen, wie gopdf verwendet werden kann, betrachten wir ein einfaches Beispiel zur Erstellung eines einfachen PDF-Dokuments:

package main

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

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

    // Setzen Sie die Seitengröße und -ränder
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Fügen Sie etwas Text zur PDF hinzu
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

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

Dieses Beispiel zeigt, wie Sie eine neue PDF-Datei erstellen, Text hinzufügen und sie als Datei speichern.

Erweiterte Funktionen von gopdf:

  • Hinzufügen von Bildern: Sie können Bilder in Ihre PDF-Dokumente mit der AddImage-Methode einfügen.
  • Zeichnen von Formen: Die Bibliothek bietet Funktionen zum Zeichnen von Linien, Rechtecken und anderen Formen.
  • PDF-Schutz: Sie können Passwortschutz auf Ihre PDFs setzen, um den Zugriff einzuschränken.

pdfcpu

Ein weiterer mächtiger Bibliothek, der für die PDF-Manipulation in Go verfügbar ist, ist pdfcpu. Diese Bibliothek bietet ein umfassendes Suite von Funktionen zur Erstellung, Modifikation und Inspektion von PDF-Dateien über eine API und eine Kommandozeilenschnittstelle (CLI). Unten werden wir die Beschreibung, Beispiele für die Verwendung und die Schlüsselunktionen von pdfcpu erläutern.

pdfcpu ist eine Go-basierte PDF-Verarbeitungsbibliothek, die Verschlüsselung unterstützt und robuste Werkzeuge für die Verarbeitung 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). Die Bibliothek zielt darauf ab, ein umfassendes Spektrum an PDF-Verarbeitungsfunktionen zu bieten, was sie für einfache und komplexe Anwendungsfälle geeignet macht.

Hauptmerkmale

  • Verschlüsselungssupport: pdfcpu unterstützt Verschlüsselung, wodurch Entwickler ihre PDF-Dokumente effektiv sichern können.
  • API und CLI: Sie bietet sowohl eine API für den programmatischen Zugriff als auch eine Kommandozeilenschnittstelle (CLI) für schnelle Operationen.
  • Batch-Verarbeitung: Starke Unterstützung für Batch-Verarbeitung über die reiche Kommandozeile macht sie effizient für das gleichzeitige Verarbeiten mehrerer Dateien.
  • 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 mithilfe des Paketmanagementsystem von Go installieren:

go get github.com/pdfcpu/pdfcpu

Grundlegende Kommandozeilenoperationen

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

PDF aus Bildern erstellen

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

pdfcpu img2pdf out.pdf image1.jpg image2.png

Dieser Befehl erstellt eine PDF, in der jedes Bild auf eine separate Seite gerendert wird.

Um mehrere PDF-Dateien in ein einziges Dokument zu mergen, verwenden Sie den merge-Befehl:

pdfcpu merge output.pdf file1.pdf file2.pdf

Beispiel für die Verwendung von pdfcpu

Für komplexe Operationen können Sie die API, die von pdfcpu bereitgestellt wird, verwenden. Hier ist ein Beispiel, wie Sie eine neue PDF erstellen und Text mit Go-Code hinzufügen können:

package main

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

func main() {
    // Erstellen Sie eine neue PDF-Datei
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

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

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

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

Dieses Beispiel zeigt, wie Sie eine neue PDF erstellen, eine Seite hinzufügen und Text mithilfe der API von pdfcpu darauf schreiben können.

Maroto

  • Maintainer: go-playground-Team (https://github.com/go-playground/maroto).
  • Anwendungsfälle: Entwickler, die einen designorientierten Ansatz bevorzugen (ähnlich wie Bootstrap).
  • Inspiriert von Bootstrap; entworfen, um einfach zu verwenden mit einem deklarativen Stil, ähnlich wie HTML/CSS.
  • Auf gofpdf aufgebaut, vereinfacht den Erstellungsprozess, während sie mächtige Anpassungsoptionen beibehält.

Maroto ist eine weitere Go-Bibliothek zur Erstellung von PDFs, die sich jedoch darauf konzentriert, den Prozess zu vereinfachen, indem sie Details auf niedriger Ebene abstrahiert. Sie baut auf der gofpdf-Bibliothek auf und bietet eine benutzerfreundlichere API zur Erstellung von Dokumenten.

Beispiel für die Verwendung von 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() {
    // Erstellen Sie eine neue PDF-Datei mit den angegebenen Abmessungen
    m := maroto.NewPDF(595, 842) // A4-Größe in Punkten

    // Fügen Sie Text zur ersten Seite hinzu
    m.AddText("Hello, Maroto!", 0, 0)

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

Dieses Beispiel zeigt, wie Sie eine neue PDF-Datei mit einer Seite erstellen und mithilfe von Maroto Text darauf hinzufügen können.

Unipdf

UniPDF ist eine weitere mächtige und umfassende Bibliothek zur Erstellung und Verarbeitung von PDF-Dateien in Golang (Go). Sie bietet eine breite Palette von Funktionen, die sie bei Entwicklern beliebt macht, die PDF-Dokumente generieren, bearbeiten und Inhalte extrahieren müssen.

  • Maintainer: UnidocLib (https://unidoc.io).
  • Anwendungsfälle: Erweiterte PDF-Verarbeitung (Verschlüsselung, Zusammenführung, Skripting).
  • Mächtige Bibliothek zur Erstellung und Verarbeitung von PDFs (reine Go).
  • Bietet umfangreiche Funktionen, einschließlich interaktiver Elemente wie Links, Lesezeichen, Zusammenführung/Teilung, Verschlüsselung und mehr.
  • Umfassende API zur Lesung und Schreibung von PDF-Objekten (Wörterbüchern, Streams).
  • Eignet sich für Anwendungen, die robuste PDF-Generierungsfähigkeiten benötigen.

UniPDF-Installation

Um mit UniPDF zu beginnen, müssen Sie die Bibliothek installieren. Folgen Sie diesen Schritten:

# 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

Dies erstellt Ihr Projekt und installiert die erforderlichen Abhängigkeiten.

Beispiel für die grundlegende Verwendung

Hier ist ein einfaches Beispiel, wie Sie mit UniPDF eine PDF-Datei erstellen können:

package main

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

func main() {
    // Erstellen Sie eine neue PDF-Datei
    pdf := creator.New()

    // Fügen Sie eine Seite zur PDF hinzu
    page := pdf.NewPage()

    // Richten Sie den Inhaltstream für die Seite ein
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

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

    // Speichern Sie die PDF-Datei
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Dieses Beispiel zeigt, wie Sie eine neue PDF-Datei erstellen, eine Seite hinzufügen und Text darauf schreiben können. Die resultierende Datei example.pdf enthält den Text “Hello, UniPDF!”.

wkhtmltopdf Wrapper

Merkmale:

  • Konvertiert HTML-Vorlagen (mit Go’s html/template) in PDF.
  • Anpassbare Ränder, Seitenorientierung und Kopf-/Fußzeilen.
  • Eignet sich, wenn der Dokumententyp komplex ist und HTML/CSS-Stil verwendet.
  • Verwendet wkhtmltopdf als Backend, um HTML-Inhalt in PDF-Format zu konvertieren.

Beispiel für die Verwendung von 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 Kommandozeilentool für verschiedene PDF-Operationen wie Validierung, Optimierung, Aufteilen/Zusammenführen.
  • Nützlich für Batch-Verarbeitung und Verwaltungsaufgaben im Zusammenhang mit PDF-Dokumenten.

Übersicht über pdflib

Die pdflib-Bibliothek ist so konzipiert, um ein umfassender PDF-Verarbeiter für die Go-Programmiersprache zu sein. Sie unterstützt verschiedene Funktionalitäten wie Validierung, Optimierung, Aufteilen, Zusammenführen, Extrahieren von Inhalten und Trimmen von PDFs. Die Bibliothek folgt dem PDF 32000-1:2008 (PDF 1.7)-Standard, was die Kompatibilität mit einer breiten Palette von PDF-Dokumenten gewährleistet.

Hauptmerkmale

  • Validierung: Stellt sicher, dass PDF-Dateien dem PDF 1.7-Standard entsprechen.
  • Optimierung: Reduziert die Dateigröße, indem redundante Ressourcen entfernt werden.
  • Aufteilen und Zusammenführen: Ermöglicht das Aufteilen von mehrseitigen PDFs in Einzelseiten oder das Zusammenführen mehrerer PDFs zu einer.
  • Extraktion: Extrahiert Bilder, Schriften, Inhalte und Seiten aus einer PDF.
  • Trimmen: Erstellt gekürzte Versionen von PDF-Dokumenten.

Installation

Um pdflib zu verwenden, müssen Sie es über das Paketmanagementsystem von Go installieren. Sie können dies durch Ausführen folgenden Befehls tun:

go get github.com/EndFirstCorp/pdflib

Beispiel für die grundlegende Verwendung - Validierung einer PDF

Hier ist ein einfaches Beispiel, das zeigt, wie Sie die pdflib-Bibliothek verwenden können, um grundlegende PDF-Operationen durchzuführen:

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

package main

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

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

Schlussfolgerung

Für die Erstellung 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 einfache Aufgaben.
  • Komplexe Designs mit HTML/CSS: Nutzen Sie den wkhtmltopdf Wrapper, der wkhtmltopdf verwendet, um komplexe HTML-Inhalte und Stilisierungen zu verarbeiten.
  • Erweiterte PDF-Verarbeitung: Wählen Sie Unipdf oder pdfcpu, wenn Ihre Anwendung erweiterte Funktionen wie Verschlüsselung, interaktive Elemente, detaillierte Formatierung und umfassende Manipulationsfunktionen benötigt.

Jede dieser Bibliotheken bietet einzigartige Stärken, die unterschiedlichen Bedürfnissen in der PDF-Erstellung entsprechen und Entwicklern eine Vielzahl von Tools bieten, basierend auf ihren spezifischen Anforderungen.