Генерация PDF-отчётов на Go (Golang): обзор библиотек и практические примеры
Go (Golang) — это современный компилируемый язык, который идеально подходит для создания высоконагруженных серверных приложений, микросервисов и утилит командной строки. Одной из частых задач в веб-разработке является генерация отчётов в формате PDF: счета, накладные, аналитические дашборды или сертификаты. В этой статье мы рассмотрим три популярные библиотеки для работы с PDF на Go, их возможности и приведём рабочие примеры кода.
Почему Go для генерации PDF?
Go предлагает несколько преимуществ: высокая производительность, простота развёртывания (один бинарник), встроенная поддержка конкурентности и богатая стандартная библиотека. Для генерации PDF не требуется устанавливать громоздкие рантаймы (как Java или .NET), что делает решения на Go компактными и быстрыми. Однако в отличие от Python, где есть мощные библиотеки вроде ReportLab, экосистема Go для PDF более разнообразна, и выбор инструмента зависит от сложности отчёта.
1. gofpdf — базовая генерация PDF
gofpdf — это порт известной PHP-библиотеки FPDF. Она позволяет создавать PDF-документы «с нуля»: добавлять текст, изображения, линии, таблицы и шрифты. Библиотека не поддерживает HTML-шаблоны, поэтому вся разметка задаётся программно.
Установка:
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, "Счёт №123")
pdf.Ln(12)
pdf.SetFont("Arial", "", 12)
pdf.Cell(40, 10, "Дата: 2024-01-15")
pdf.Ln(10)
pdf.Cell(40, 10, "Товар: Ноутбук")
pdf.Ln(10)
pdf.Cell(40, 10, "Сумма: 50 000 руб.")
err := pdf.OutputFileAndClose("invoice.pdf")
if err != nil {
panic(err)
}
}
Плюсы: лёгкий вес, полный контроль над позиционированием, поддержка Unicode через TTF-шрифты.
Минусы: отсутствие встроенной поддержки HTML, сложность при создании сложных макетов.
2. maroto — упрощённое создание отчётов
Maroto построен поверх gofpdf, но предоставляет высокоуровневый API для создания отчётов. Вы работаете с понятиями «сетка», «строки», «колонки», «таблицы». Это напоминает работу с CSS-фреймворками.
Установка:
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.WithPageSize("A4"))
m.RegisterHeader(func() {
m.Row(20, func() {
m.Col(12, func() {
m.Text("Отчёт по продажам", props.Text{Bold: true, Size: 16})
})
})
})
headers := []string{"Товар", "Кол-во", "Цена"}
contents := [][]string{
{"Ноутбук", "2", "100000"},
{"Мышь", "5", "2500"},
}
m.Table(headers, contents, props.Table{})
document, _ := m.Generate()
_ = document.Save("report.pdf")
}
Плюсы: декларативный стиль, автоматическое выравнивание, встроенная поддержка таблиц и графиков.
Минусы: меньше гибкости для нестандартных макетов, чем gofpdf.
3. wkhtmltopdf — HTML в PDF
Если вам нужно превратить HTML-шаблон в PDF (например, с CSS-стилями), используйте wkhtmltopdf — обёртку над утилитой wkhtmltopdf (WebKit). Это не чистая Go-библиотека, но она позволяет использовать всю мощь HTML/CSS для дизайна отчётов.
Установка:
go get github.com/SebastiaanKlippert/go-wkhtmltopdf
Также необходимо установить сам wkhtmltopdf (скачать с официального сайта или через пакетный менеджер).
Пример: генерация из