Генерация PDF отчётов на Go (Golang): обзор библиотек и примеры кода
Go (Golang) — это современный компилируемый язык, который всё чаще выбирают для создания высоконагруженных серверных приложений и микросервисов. Одна из типовых задач в таких системах — формирование PDF-отчётов (счета, акты, статистические дашборды). В этой статье мы рассмотрим три популярные библиотеки для генерации PDF на Go, их сильные стороны и приведём готовые примеры кода.
1. gofpdf — классика для создания PDF с нуля
Библиотека gofpdf (ныне развивается как jung-kurt/gofpdf или форк go-pdf/fpdf) — это порт известной PHP-библиотеки FPDF. Она позволяет создавать 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.SetFont("Arial", "B", 16)
pdf.AddPage()
pdf.CellFormat(190, 10, "Счёт №123 от 01.01.2025", "0", 1, "C", false, 0, "")
pdf.SetFont("Arial", "", 12)
pdf.Ln(10)
pdf.CellFormat(190, 10, "Товар: Ноутбук", "1", 1, "L", false, 0, "")
pdf.CellFormat(190, 10, "Цена: 120 000 руб.", "1", 1, "L", false, 0, "")
pdf.CellFormat(190, 10, "Итого: 120 000 руб.", "1", 1, "L", false, 0, "")
err := pdf.OutputFileAndClose("invoice.pdf")
if err != nil {
panic(err)
}
}
Плюсы: минимальные зависимости, полный контроль над каждым элементом, поддержка Unicode (через AddUTF8Font).
Минусы: низкоуровневый API — для сложных отчётов придётся много кодить вручную.
2. maroto — высокоуровневая генерация с таблицами и стилями
Maroto построена поверх gofpdf, но предлагает более удобный API: таблицы, гриды, автоматическое выравнивание и встроенную поддержку шрифтов. Идеально для типовых отчётов: инвойсы, списки, прайс-листы.
Установка
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.New()
m.SetPageMargins(10, 10, 10)
// Заголовок
m.Row(10, func() {
m.Col(12, func() {
m.Text("Отчёт по продажам", props.Text{
Style: props.Bold,
Size: 16,
Align: props.Center,
})
})
})
// Таблица
header := []string{"Товар", "Кол-во", "Цена"}
data := [][]string{
{"Монитор", "2", "30 000"},
{"Клавиатура", "5", "7 500"},
}
m.TableList(header, data, props.TableList{
HeaderProp: props.TableListContent{
Style: props.Bold,
Size: 10,
},
ContentProp: props.TableListContent{
Size: 9,
},
})
document, _ := m.Generate()
document.Save("report.pdf")
}
Плюсы: быстрая разработка, встроенные стили, автоматическая разбивка на страницы.
Минусы: меньше гибкости для нестандартной вёрстки.
3. wkhtmltopdf — конвертация HTML в PDF через Go-обёртку
Если у вас уже есть HTML-шаблоны (например, на Bootstrap), проще всего использовать wkhtmltopdf. Это не библиотека Go, а утилита командной строки, но для Go есть обёртка go-wkhtmltopdf. Она принимает HTML-строку и возвращает PDF.
Установка
# Сначала установите wkhtmltopdf: https://wkhtmltopdf.org/downloads.html
go get github.com/SebastiaanKlippert/go-wkhtmltopdf
Пример: из HTML в PDF
package main
import (
"bytes"
"fmt" Также в библиотеке
Работа с Excel в C++: библиотеки и инструменты для чтения и записи
Работа с S3 и облачными хранилищами в Node.js: библиотека @aws-sdk/client-s3
spdlog для C++: полное руководство с примерами
Мониторинг приложений Rust с библиотекой tracing
HTTP-клиент для Swift (iOS/macOS): топ библиотек для работы с сетью