PDF Генерация в Go (Golang): Полный обзор библиотек и инструментов
Создание PDF-документов — одна из частых задач в веб-разработке, автоматизации отчетности и создании электронного документооборота. Язык Go (Golang) предлагает несколько зрелых решений для этой задачи. В этой статье мы подробно разберем основные библиотеки, их возможности, примеры использования и поможем выбрать подходящий инструмент для вашего проекта.
Почему Go для генерации PDF?
Go сочетает высокую производительность компилируемого языка с простотой разработки. Благодаря встроенной поддержке конкурентности (горутины) и эффективному управлению памятью, генерация PDF даже на больших объемах данных происходит быстро. Кроме того, статическая типизация и богатая стандартная библиотека делают код надежным и предсказуемым.
Основные библиотеки для генерации PDF в Go
1. gofpdf — простая и легковесная библиотека
gofpdf — это порт известной PHP-библиотеки FPDF. Она предоставляет базовый API для создания PDF с нуля: добавление страниц, шрифтов, изображений, таблиц и простых графических примитивов.
Установка:
go get github.com/jung-kurt/gofpdf
Пример: создание простого PDF с текстом и изображением
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!")
pdf.ImageOptions("logo.png", 10, 20, 30, 0, false, gofpdf.ImageOptions{ImageType: "PNG"}, 0, "")
err := pdf.OutputFileAndClose("output.pdf")
if err != nil {
panic(err)
}
}
Плюсы: минималистичный API, малый размер, не требует внешних зависимостей, поддержка Unicode (UTF-8).
Минусы: ограниченная поддержка сложных макетов, нет встроенного HTML-рендеринга.
2. maroto — высокоуровневая библиотека для отчетов
Maroto построена поверх gofpdf и добавляет концепцию "сетки" (grid) для создания сложных макетов: таблиц, колонок, подписей и логотипов. Идеально подходит для счетов, накладных и отчетов.
Установка:
go get github.com/johnfercher/maroto/v2
Пример: создание счета-фактуры с таблицей
package main
import (
"github.com/johnfercher/maroto/v2"
"github.com/johnfercher/maroto/v2/pkg/components/col"
"github.com/johnfercher/maroto/v2/pkg/components/row"
"github.com/johnfercher/maroto/v2/pkg/components/text"
"github.com/johnfercher/maroto/v2/pkg/core"
)
func main() {
m := maroto.New()
m.AddRow(20, text.NewCol(12, "Счет №123"))
m.AddRow(10, text.NewCol(12, "Дата: 2024-01-15"))
// Таблица
headers := []string{"Товар", "Кол-во", "Цена", "Сумма"}
rows := [][]string{
{"Ноутбук", "2", "50000", "100000"},
{"Мышь", "5", "1500", "7500"},
}
m.AddRow(10, col.New(12).Add(text.New("Таблица товаров")))
// Для таблицы используйте компонент table
// m.AddTable(headers, rows)
doc, _ := m.Build()
doc.Save("invoice.pdf")
}
Плюсы: декларативный стиль, готовые компоненты (таблицы, QR-коды, графики), автоматическое выравнивание.
Минусы: больше зависимостей, чем gofpdf, некоторое снижение производительности на сложных макетах.
3. unipdf — коммерческая библиотека с расширенными возможностями
UniPDF (от компании UniDoc) — профессиональное решение для работы с PDF: создание, редактирование, извлечение данных, подпись, шифрование. Поддерживает HTML-to-PDF конвертацию (черед WebKit).
Установка:
go get github.com/unidoc/unipdf/v3
Пример: создание PDF из HTML
package main
import (
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
c := creator.New()
html := `<h1>Заголовок</h1><p>Текст с <b>жирным</b> выделением.</p>`
err := c.Add Также в библиотеке
Конфигурация приложений Kotlin: библиотеки и инструменты для управления настройками
Валидация данных в Go (Golang): библиотеки, подходы и примеры кода
Тестирование в JavaScript (Node.js): фреймворки и инструменты
Обработка Markdown в TypeScript: библиотеки, парсеры и практическое применение