Генерация PDF отчётов на Go (Golang): полное руководство
Создание PDF-документов — одна из частых задач в веб-разработке, особенно при построении корпоративных систем, финансовых приложений или образовательных платформ. Язык Go (Golang) предлагает несколько мощных библиотек для генерации PDF, которые позволяют создавать как простые текстовые отчёты, так и сложные многостраничные документы с таблицами, графиками и изображениями. В этой статье мы рассмотрим три популярных подхода: gofpdf, maroto и интеграцию с wkhtmltopdf.
1. Библиотека gofpdf — низкоуровневое управление PDF
gofpdf — одна из старейших и наиболее гибких библиотек для генерации PDF на Go. Она предоставляет полный контроль над каждым элементом страницы, но требует больше кода для сложных макетов.
Установка
go get github.com/jung-kurt/gofpdf
Пример: простой отчёт с заголовком и таблицей
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, "Отчёт о продажах")
pdf.Ln(12)
// Заголовки таблицы
pdf.SetFont("Arial", "B", 12)
headers := []string{"Товар", "Количество", "Цена"}
for _, h := range headers {
pdf.CellFormat(40, 10, h, "1", 0, "C", false, 0, "")
}
pdf.Ln(-1)
// Данные
pdf.SetFont("Arial", "", 12)
data := [][]string{{"Ноутбук", "5", "45000"}, {"Мышь", "12", "1500"}}
for _, row := range data {
for _, cell := range row {
pdf.CellFormat(40, 10, cell, "1", 0, "C", false, 0, "")
}
pdf.Ln(-1)
}
err := pdf.OutputFileAndClose("report.pdf")
if err != nil {
panic(err)
}
}
Плюсы: минимальные зависимости, полный контроль, поддержка Unicode (шрифты TrueType).
Минусы: отсутствие готовых компонентов (таблицы, графики), нужно вручную рассчитывать позиции.
2. Библиотека maroto — высокоуровневая генерация с сеткой
maroto построена поверх gofpdf и предлагает компонентный подход с сеткой, что упрощает создание сложных макетов. Идеально подходит для типовых отчётов: счета, накладные, прайс-листы.
Установка
go get github.com/johnfercher/maroto/v2
Пример: отчёт с логотипом и таблицей
package main
import (
"github.com/johnfercher/maroto/v2/pkg/core"
"github.com/johnfercher/maroto/v2/pkg/props"
"github.com/johnfercher/maroto/v2"
)
func main() {
m := maroto.NewMaroto(maroto.WithMaxGridSize(12))
m.RegisterHeader(func() {
m.Row(20, func() {
m.Col(3, func() {
m.FileImage("logo.png", props.Rect{
Percent: 80,
Center: true,
})
})
m.Col(9, func() {
m.Text("ООО «ТехноСервис»", props.Text{
Style: props.Bold,
Size: 16,
})
})
})
})
m.Row(10, func() {
m.Col(12, func() {
m.Table([]string{"Наименование", "Кол-во", "Сумма"},
[][]string{
{"Монитор 24\"", "2", "40000"},
{"Клавиатура", "5", "7500"},
},
props.Table{
Content: props.TableContent{
GridSizes: []uint{6, 3, 3},
},
})
})
})
document, _ := m.Generate()
_ = document.Save("invoice.pdf")
}
Плюсы: быстрая разработка, автоматическое выравнивание, встроенная поддержка таблиц, QR-кодов и штрихкодов.
Минусы: более тяжёлая зависимость, сложнее кастомизация отдельных элементов.
3. Интеграция с wkhtmltopdf — конвертация HTML в PDF
Если вам нужно превратить HTML-шаблон в PDF (например, с CSS-стилями и JavaScript-графиками), используйте wkhtmltopdf через обёртку go-wkhtmltopdf. Это даёт возможность применять любые веб-технологии для оформления отчётов.
Установка