Creare PDF in Go con Maroto
Maroto è una delle librerie per Go per la creazione di PDF.
Supporta parecchie opzioni, ed è anche in grado di generare barcode.
Per l'esempio di codice sono partito da quello del sito, andandolo poi a modificare.
Per installare la libreria:
go get github.com/johnfercher/maroto/v2@v2
Qui sotto il codice:
package main
import (
"log"
"strconv"
"github.com/johnfercher/maroto/v2"
"github.com/johnfercher/maroto/v2/pkg/components/col"
"github.com/johnfercher/maroto/v2/pkg/components/image"
"github.com/johnfercher/maroto/v2/pkg/components/row"
"github.com/johnfercher/maroto/v2/pkg/components/text"
"github.com/johnfercher/maroto/v2/pkg/config"
"github.com/johnfercher/maroto/v2/pkg/consts/align"
"github.com/johnfercher/maroto/v2/pkg/consts/fontstyle"
"github.com/johnfercher/maroto/v2/pkg/core"
"github.com/johnfercher/maroto/v2/pkg/props"
)
type Libro struct {
Titolo string
Autore string
Prezzo float64
}
func main() {
m := InitMaroto()
document, err := m.Generate()
if err != nil {
log.Fatal(err.Error())
}
err = document.Save("test.pdf")
if err != nil {
log.Fatal(err.Error())
}
}
func InitMaroto() core.Maroto {
cfg := config.NewBuilder().
WithPageNumber().
WithLeftMargin(10).
WithTopMargin(15).
WithRightMargin(10).
Build()
mrt := maroto.New(cfg)
m := maroto.NewMetricsDecorator(mrt)
err := m.RegisterHeader(getPageHeader())
if err != nil {
log.Fatal(err.Error())
}
err = m.RegisterFooter(getPageFooter())
if err != nil {
log.Fatal(err.Error())
}
m.AddRows(text.NewRow(10, "Lista Libri", props.Text{
Top: 3,
Style: fontstyle.Bold,
Align: align.Center,
}))
m.AddRows(getLibri()...)
return m
}
func getPageHeader() core.Row {
return row.New(20).Add(
image.NewFromFileCol(3, "1.jpg", props.Rect{
Center: true,
Percent: 80,
}),
col.New(6),
col.New(3).Add(
text.New("Libreria di Roma", props.Text{
Size: 8,
Align: align.Right,
Color: getRedColor(),
}),
text.New("Tel: +39 64654654654654", props.Text{
Top: 12,
Style: fontstyle.BoldItalic,
Size: 8,
Align: align.Right,
Color: getBlueColor(),
}),
text.New("www.libreria.com", props.Text{
Top: 15,
Style: fontstyle.BoldItalic,
Size: 8,
Align: align.Right,
Color: getBlueColor(),
}),
),
)
}
func getPageFooter() core.Row {
return row.New(20).Add(
col.New(12).Add(
text.New("Tel: +39 64654654654654", props.Text{
Top: 13,
Style: fontstyle.BoldItalic,
Size: 8,
Align: align.Left,
Color: getBlueColor(),
}),
text.New("www.libreria.com", props.Text{
Top: 16,
Style: fontstyle.BoldItalic,
Size: 8,
Align: align.Left,
Color: getBlueColor(),
}),
),
)
}
func getLibri() []core.Row {
rows := []core.Row{
row.New(4).Add(
col.New(3),
text.NewCol(4, "Titolo", props.Text{Size: 9, Align: align.Center, Style: fontstyle.Bold}),
text.NewCol(2, "Autore", props.Text{Size: 9, Align: align.Center, Style: fontstyle.Bold}),
text.NewCol(3, "Prezzo", props.Text{Size: 9, Align: align.Center, Style: fontstyle.Bold}),
),
}
libri := []Libro{
{
Titolo: "IT",
Autore: "Stepehen King",
Prezzo: 10.23,
},
{
Titolo: "Sahara",
Autore: "Clive Cussler",
Prezzo: 99,
},
}
var contentsRow []core.Row
contents := libri
for i, content := range contents {
r := row.New(4).Add(
col.New(3),
text.NewCol(4, content.Titolo, props.Text{Size: 8, Align: align.Center}),
text.NewCol(2, content.Autore, props.Text{Size: 8, Align: align.Center}),
text.NewCol(3, strconv.FormatFloat(content.Prezzo, 'f', -1, 32), props.Text{Size: 8, Align: align.Center}),
)
if i%2 == 0 {
gray := getGrayColor()
r.WithStyle(&props.Cell{BackgroundColor: gray})
}
contentsRow = append(contentsRow, r)
}
rows = append(rows, contentsRow...)
return rows
}
func getGrayColor() *props.Color {
return &props.Color{
Red: 200,
Green: 200,
Blue: 200,
}
}
func getBlueColor() *props.Color {
return &props.Color{
Red: 10,
Green: 10,
Blue: 150,
}
}
func getRedColor() *props.Color {
return &props.Color{
Red: 150,
Green: 10,
Blue: 10,
}
}
Enjoy!
go pdf maroto
Commentami!