Generazione di report PDF in Go

OK. Ora genero i PDF in Go!

Indice

La generazione di documenti PDF in modo programmatico può essere una funzionalità importante nella tua applicazione. Qui esploriamo e forniamo una breve panoramica con esempi delle librerie disponibili nel linguaggio di programmazione Go (Golang) per la generazione di file PDF.

Le soluzioni adatte possono essere diverse, ad esempio per la creazione di documenti semplici o per una generazione di PDF complessa e ricca di funzionalità.

go, pdf! Sì, l’immagine è generata dall’IA, il modello è Flux1.Dev.

Librerie e Strumenti

gofpdf

GoPdf è una libreria semplice per la creazione di PDF. Permette di aggiungere testo, immagini, forme, tabelle e gestire pagine multiple. Idonea per task di creazione di PDF da semplici a moderatamente complessi.

Manutentore: Jung Kurt (discontinua ma ancora utilizzata).

Limitazione: Mancanza di aggiornamenti, sebbene l’utilizzo esistente persista.

Esempio:

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

Manutentore: signintech (attivamente mantenuta).

Nel linguaggio di programmazione Go, una delle librerie che spicca per questo scopo è gopdf, sviluppata da SignInTech. Questa libreria fornisce un modo semplice per creare PDF in modo programmatico senza fare affidamento su dipendenze esterne o librerie C.

gopdf è una libreria in Go pura progettata specificamente per la creazione di documenti PDF. Offre un’API semplice ed efficiente focalizzata principalmente sulla generazione di PDF, rendendola più facile da usare per task di base mantenendo la flessibilità necessaria per operazioni più complesse.

Funzionalità principali:

  • Implementazione in Go Puro: Nessun requisito di dipendenze esterne o librerie C.
  • API Semplice: Funzioni facili da usare per la generazione di PDF.
  • Prestazioni Efficienti: Ottimizzata per una creazione rapida ed efficiente di PDF.

Esempio di utilizzo

Per illustrare come gopdf possa essere utilizzata, diamo un’occhiata a un esempio base per la creazione di un semplice documento PDF:

package main

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

func main() {
    // Crea una nuova istanza PDF
    pdf := gopdf.New()

    // Imposta le dimensioni della pagina e i margini
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Aggiungi del testo al PDF
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Salva il PDF su un file
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Questo esempio dimostra come creare un nuovo documento PDF, aggiungere del testo e salvarlo come file.

Funzionalità avanzate di gopdf:

  • Aggiunta di Immagini: Puoi inserire immagini nei tuoi documenti PDF utilizzando il metodo AddImage.
  • Disegno di Forme: La libreria fornisce funzioni per disegnare linee, rettangoli e altre forme.
  • Protezione PDF: Puoi impostare una protezione con password sui tuoi PDF per limitare l’accesso.

pdfcpu

Un’altra potente libreria disponibile per la manipolazione di PDF in Go è pdfcpu. Questa libreria offre una suite completa di funzionalità per la creazione, la modifica e l’ispezione di file PDF tramite sia un’API sia un’interfaccia da riga di comando (CLI). Di seguito, approfondiamo la descrizione, gli esempi di utilizzo e le funzionalità principali di pdfcpu.

pdfcpu è una libreria di elaborazione PDF basata su Go che supporta la crittografia e offre strumenti robusti per gestire vari aspetti dei documenti PDF. È compatibile con tutte le versioni dei PDF, inclusi miglioramenti in corso per PDF 2.0 (ISO-32000-2). La libreria mira a fornire un’ampia gamma di funzionalità di elaborazione PDF, rendendola adatta sia a casi d’uso semplici che complessi.

Funzionalità principali

  • Supporto Crittografia: pdfcpu supporta la crittografia, consentendo agli sviluppatori di proteggere efficacemente i propri documenti PDF.
  • API e CLI: Offre sia un’API per l’accesso programmatico sia un’interfaccia da riga di comando (CLI) per operazioni rapide.
  • Elaborazione in Batch: Forte supporto per l’elaborazione in batch tramite la ricca riga di comando, rendendola efficiente per la gestione di più file contemporaneamente.
  • Compatibilità: Compatibile con tutte le versioni dei PDF, incluso il supporto di base e i miglioramenti in corso per PDF 2.0.

Per iniziare con pdfcpu, è necessario installarlo utilizzando il sistema di gestione dei pacchetti di Go:

go get github.com/pdfcpu/pdfcpu

Operazioni di base da riga di comando

pdfcpu fornisce una varietà di comandi per diverse operazioni. Ecco alcuni esempi:

Creazione di un PDF da immagini

Puoi convertire uno o più file immagine in un file PDF con il seguente comando:

pdfcpu img2pdf out.pdf image1.jpg image2.png

Questo comando creerà un PDF in cui ogni immagine viene resa su una pagina separata.

Per unire più file PDF in un unico documento, usa il comando merge:

pdfcpu merge output.pdf file1.pdf file2.pdf

Esempio di utilizzo di pdfcpu

Per operazioni più complesse, puoi usare l’API fornita da pdfcpu. Ecco un esempio di come creare un nuovo PDF e aggiungere testo utilizzando codice Go:

package main

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

func main() {
    // Crea un nuovo documento PDF
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Aggiungi una pagina al documento
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Aggiungi testo alla pagina
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // Salva il documento
    err := doc.Save("output.pdf")
    if err != nil {
        log.Fatal(err)
    }
}

Questo esempio dimostra come creare un nuovo PDF, aggiungere una pagina e scrivere del testo su di essa utilizzando l’API di pdfcpu.

Maroto

  • Manutentore: Team go-playground (https://github.com/go-playground/maroto).
  • Casi d’uso: Sviluppatori che preferiscono un approccio design-first (simile a Bootstrap).
  • Ispirato a Bootstrap; progettato per essere facile da usare con uno stile dichiarativo simile a HTML/CSS.
  • Basato su gofpdf, semplifica il processo di creazione mantenendo opzioni di personalizzazione potenti.

Maroto è un’altra libreria Go per la creazione di PDF, ma si concentra sulla semplificazione del processo astraggendo i dettagli a basso livello. Si basa sulla libreria gofpdf e fornisce un’API più user-friendly per la generazione di documenti.

Esempio di utilizzo di Maroto

Ecco un esempio di come puoi usare Maroto per creare un semplice PDF:

package main

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

func main() {
    // Crea un nuovo documento PDF con dimensioni specificate
    m := maroto.NewPDF(595, 842) // Dimensione A4 in punti

    // Aggiungi del testo alla prima pagina
    m.AddText("Hello, Maroto!", 0, 0)

    // Salva il PDF su un file
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

Questo esempio mostra come creare un nuovo documento PDF con una pagina e aggiungere del testo utilizzando Maroto.

Unipdf

UniPDF è un’altra potente e completa libreria per la creazione e l’elaborazione di file PDF in Golang (Go). Offre un’ampia gamma di funzionalità che la rendono popolare tra gli sviluppatori che devono generare, modificare ed estrarre contenuti da documenti PDF.

  • Manutentore: UnidocLib (https://unidoc.io).
  • Casi d’uso: Elaborazione avanzata di PDF (crittografia, unione, scripting).
  • Libreria potente per la creazione e l’elaborazione di PDF (Go puro).
  • Offre funzionalità estese, inclusi elementi interattivi come link, segnalibri, unione/divisione, crittografia e altro.
  • API completa per la lettura e la scrittura di oggetti PDF (dizionari, flussi).
  • Adatta per applicazioni che richiedono capacità di generazione PDF robuste.

Installazione di UniPDF

Per iniziare con UniPDF, è necessario installare la libreria. Segui questi passaggi:

# Crea un Nuovo Directory:
mkdir go-pdf-generator cd go-pdf-generator
# Inizializza il Modulo Go:
go mod init go-pdf-generator
# Installa Libreria UniPDF:
go get github.com/unidoc/unipdf/v3

Questo configurerà il tuo progetto e installerà le dipendenze necessarie.

Esempio di utilizzo di base

Ecco un semplice esempio per creare un documento PDF utilizzando UniPDF:

package main

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

func main() {
    // Crea un nuovo documento PDF
    pdf := creator.New()

    // Aggiungi una pagina al PDF
    page := pdf.NewPage()

    // Imposta il flusso di contenuto per la pagina
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Aggiungi testo alla pagina
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Salva il documento PDF
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Questo esempio dimostra come creare un nuovo documento PDF, aggiungere una pagina e scrivere del testo su di essa. Il file risultante example.pdf conterrà il testo “Hello, UniPDF!”.

Wrapper di wkhtmltopdf

Funzionalità:

  • Converte template HTML (resisi con html/template di Go) in PDF.
  • Margini, orientamento della pagina e intestazioni/piè di pagina personalizzabili.
  • Adatto quando il design del documento è complesso e coinvolge stili HTML/CSS.
  • Utilizza wkhtmltopdf come backend per convertire i contenuti HTML in formato PDF.

Esempio di utilizzo di 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 (di EndFirstCorp):

  • Uno strumento da riga di comando per varie operazioni su PDF come validazione, ottimizzazione, divisione/unione.
  • Utile per l’elaborazione in batch e i task amministrativi relativi ai documenti PDF.

Panoramica di pdflib

La libreria pdflib è progettata per essere un processore PDF completo per il linguaggio di programmazione Go. Supporta varie funzionalità come validazione, ottimizzazione, divisione, unione, estrazione di contenuti e potatura di PDF. La libreria aderisce allo standard PDF 32000-1:2008 (PDF 1.7), garantendo compatibilità con un’ampia gamma di documenti PDF.

Funzionalità principali

  • Validazione: Assicura che i file PDF rispettino lo standard PDF 1.7.
  • Ottimizzazione: Riduce le dimensioni dei file eliminando risorse ridondanti.
  • Divisione e Unione: Consente di dividere PDF multipagina in PDF monopagina o di unire più PDF in uno.
  • Estrazione: Estrae immagini, font, contenuti e pagine da un PDF.
  • Potatura: Crea versioni potenzate (trimmed) di documenti PDF.

Installazione

Per usare pdflib, è necessario installarlo tramite il sistema di gestione dei pacchetti di Go. È possibile farlo eseguendo:

go get github.com/EndFirstCorp/pdflib

Esempio di utilizzo di base - Validazione di un PDF

Ecco un semplice esempio che dimostra come usare la libreria pdflib per eseguire operazioni di base su PDF:

Per validare un PDF rispetto allo standard PDF 1.7, puoi usare il seguente codice:

package main

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

func main() {
   // Valida un file PDF
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validation failed:", err)
   } else {
     fmt.Println("PDF is valid.")
   }
}

Conclusione

Per la generazione di PDF in Go, la scelta della libreria dipende dalla complessità e dai requisiti specifici del tuo progetto. Le seguenti raccomandazioni vengono fornite:

  • Documenti Semplici: Usa gofpdf o Maroto. Queste librerie offrono semplicità e facilità d’uso per task lineari.
  • Design Complessi con HTML/CSS: Sfrutta il Wrapper di wkhtmltopdf, che levera wkhtmltopdf per gestire contenuti e stili HTML complessi.
  • Elaborazione Avanzata di PDF: Scegli Unipdf o pdfcpu quando la tua applicazione richiede funzionalità avanzate come crittografia, elementi interattivi, formattazione dettagliata e capacità di manipolazione complete.

Ognuna di queste librerie offre punti di forza unici che soddisfano diverse esigenze nella generazione di PDF, fornendo agli sviluppatori una varietà di strumenti tra cui scegliere in base ai loro requisiti specifici.

Iscriviti

Ricevi nuovi articoli su sistemi, infrastruttura e ingegneria AI.