Creare PDF in Go con Maroto

Mattepuffo's logo
Creare PDF in Go con Maroto

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!


Condividi

Commentami!