Generazione di report PDF in GO
OK. Ora generazione di PDF in GO!
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à.
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
- Manutentore: Team pdfcpu (https://github.com/pdfcpu/pdfcpu).
- Casi d’uso: Manipolazione e analisi di PDF su larga scala.
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
- https://github.com/SebastiaanKlippert/go-wkhtmltopdf
- Dipendenza: Richiede
wkhtmltopdf
installato tramitebrew
oapt-get
. - Casi d’uso: Generazione di PDF da contenuti HTML dinamici (es. fatture, report).
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
oMaroto
. 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
opdfcpu
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.