Generazione di report PDF in GO

OK. Ora generazione di PDF in GO!

Indice

Generare documenti PDF in modo programmatico può essere un’importante funzionalità nel tuo’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 potrebbero essere diverse, ad esempio per la creazione di documenti semplici, o per la generazione di PDF complessi e ricchi di funzionalità.

go, pdf! Sì, l’immagine è generata tramite AI, 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 di gestire più pagine. Adatta per compiti di creazione di PDF semplici o di complessità moderata.

Manutentore: Jung Kurt (discontinuato ma ancora utilizzato).

Limitazione: Mancanza di aggiornamenti, anche se l’utilizzo esiste ancora.

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 (mantenuta attivamente).

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

gopdf è una libreria puramente in Go progettata specificamente per la creazione di documenti PDF. Offre un’API semplice ed efficiente concentrata principalmente sulla generazione di PDF, rendendola più facile da utilizzare per compiti basilari, mantenendo tuttavia la flessibilità necessaria per operazioni più complesse.

Funzionalità Principali:

  • Implementazione puramente in Go: non richiede dipendenze esterne o librerie C.
  • API semplice: funzioni facili da utilizzare per la generazione di PDF.
  • Prestazioni efficienti: ottimizzata per la creazione rapida ed efficiente di PDF.

Esempio di Utilizzo

Per illustrare come si può utilizzare gopdf, guardiamo a un esempio base per creare un documento PDF semplice:

package main

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

func main() {
    // Creare un'istanza PDF nuova
    pdf := gopdf.New()

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

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

    // Salvare il PDF in 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: è possibile inserire immagini nei documenti PDF utilizzando il metodo AddImage.
  • Disegno di forme: la libreria fornisce funzioni per disegnare linee, rettangoli e altre forme.
  • Protezione PDF: è possibile impostare una protezione con password sui PDF per limitare l’accesso.

pdfcpu

Un’altra delle potenti librerie disponibili per la manipolazione di PDF in Go è pdfcpu. Questa libreria offre un insieme completo di funzionalità per creare, modificare e ispezionare file PDF tramite un’API e un’interfaccia a riga di comando (CLI). Di seguito, approfondiamo la descrizione, gli esempi di utilizzo e le funzionalità principali di pdfcpu.

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

Funzionalità Principali

  • Supporto per l’encryption: pdfcpu supporta l’encryption, permettendo agli sviluppatori di proteggere efficacemente i propri documenti PDF.
  • API e CLI: offre sia un’API per l’accesso programmatico che un’interfaccia a riga di comando (CLI) per operazioni rapide.
  • Elaborazione in batch: forte supporto per l’elaborazione in batch tramite la riga di comando rendendola efficiente per la gestione di molti file contemporaneamente.
  • Compatibilità: compatibile con tutte le versioni di PDF, inclusi il supporto 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 tramite Interfaccia a Riga di Comando

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

Creare un PDF da Immagini

È possibile 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 verrà visualizzata su una pagina separata.

Per unire diversi file PDF in un unico documento, utilizza il comando merge:

pdfcpu merge output.pdf file1.pdf file2.pdf

Esempio di utilizzo di pdfcpu

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

package main

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

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

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

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

    // Salvare 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 basato sul design (simile a Bootstrap).
  • Ispirata a Bootstrap; progettata per essere facile da utilizzare con uno stile dichiarativo simile a HTML/CSS.
  • Costruita 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 astrattando i dettagli di 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 si può utilizzare Maroto per creare un PDF semplice:

package main

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

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

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

    // Salvare il PDF in 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 la gestione di file PDF in Golang (Go). Offre una vasta gamma di funzionalità che la rendono popolare tra gli sviluppatori che necessitano di generare, modificare e estrarre contenuti da documenti PDF.

  • Manutentore: UnidocLib (https://unidoc.io).
  • Casi d’uso: Elaborazione avanzata di PDF (criptografia, fusione, scripting).
  • Potente libreria per la creazione e l’elaborazione di PDF (puramente in Go).
  • Offre funzionalità estese, tra cui elementi interattivi come link, segnalibri, fusione/suddivisione, criptografia e altro.
  • API completa per la lettura e la scrittura di oggetti PDF (dizionari, flussi).
  • Adatta per applicazioni che necessitano di capacità avanzate di generazione di PDF.

Installazione di UniPDF

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

# Creare una nuova directory:
mkdir go-pdf-generator cd go-pdf-generator
# Inizializzare il modulo Go:
go mod init go-pdf-generator
# Installare la libreria UniPDF:
go get github.com/unidoc/unipdf/v3

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

Esempio di utilizzo base

Ecco un esempio semplice 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() {
    // Creare un nuovo documento PDF
    pdf := creator.New()

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

    // Configurare lo stream del contenuto per la pagina
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

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

    // Salvare 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 per wkhtmltopdf

Funzionalità:

  • Converte modelli HTML (renderizzati con html/template di Go) in PDF.
  • Margini personalizzabili, orientamento della pagina, intestazioni/piedi di pagina.
  • Adatto quando il design del documento è complesso e coinvolge stili HTML/CSS.
  • Utilizza wkhtmltopdf come backend per convertire il contenuto 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 (da EndFirstCorp):

  • Uno strumento a riga di comando per varie operazioni su PDF come validazione, ottimizzazione, suddivisione/fusione.
  • Utile per l’elaborazione in batch e compiti amministrativi relativi ai documenti PDF.

Panoramica su pdflib

La libreria pdflib è progettata per essere un elaboratore completo di PDF per il linguaggio di programmazione Go. Supporta varie funzionalità come la validazione, l’ottimizzazione, la suddivisione, la fusione, l’estrazione di contenuti e la riduzione di PDF. La libreria si adatta allo standard PDF 32000-1:2008 (PDF 1.7), assicurando la compatibilità con una vasta gamma di documenti PDF.

Funzionalità Principali

  • Validazione: Assicura che i file PDF rispettino lo standard PDF 1.7.
  • Ottimizzazione: Riduce la dimensione del file eliminando risorse ridondanti.
  • Suddivisione e fusione: Permette di suddividere PDF multi-pagina in PDF singoli o di unire diversi PDF in uno.
  • Estrazione: Estrae immagini, font, contenuti e pagine da un PDF.
  • Riduzione: Crea versioni ridotte di documenti PDF.

Installazione

Per utilizzare pdflib, è necessario installarlo tramite il sistema di gestione dei pacchetti di Go. Puoi farlo eseguendo:

go get github.com/EndFirstCorp/pdflib

Esempio di utilizzo base - Validazione di un PDF

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

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

package main

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

func main() {
   // Validare un file PDF
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validazione fallita:", err)
   } else {
     fmt.Println("PDF valido.")
   }
}

Conclusione

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

  • Documenti semplici: Utilizza gofpdf o Maroto. Queste librerie offrono semplicità e facilità d’uso per compiti basilari.
  • Disegni complessi con HTML/CSS: Utilizza il Wrapper per wkhtmltopdf, che sfrutta wkhtmltopdf per gestire contenuti HTML complessi e stili.
  • Elaborazione avanzata di PDF: Scegli Unipdf o pdfcpu quando l’applicazione richiede funzionalità avanzate come criptografia, elementi interattivi, formattazione dettagliata e capacità di manipolazione comprensive.

Ogni una di queste librerie offre forze uniche che si adattano a diverse esigenze nella generazione di PDF, fornendo agli sviluppatori una varietà di strumenti da scegliere in base ai propri requisiti specifici.