PDF генерация в Go (Golang): Полный обзор инструментов и библиотек
Современные веб-приложения и микросервисы часто требуют генерации PDF-документов: отчёты, счета, накладные, сертификаты или просто экспорт данных. Язык Go предлагает несколько зрелых решений для этой задачи. В этой статье мы подробно разберём основные библиотеки, их возможности, примеры использования и поможем выбрать подходящий инструмент для вашего проекта на pythonlib.ru.
Зачем использовать Go для генерации PDF?
Go (Golang) — это компилируемый, статически типизированный язык, который славится своей производительностью и простотой. При генерации PDF это даёт следующие преимущества:
- Высокая скорость — бинарные файлы Go работают быстро и эффективно используют память.
- Простота развёртывания — один исполняемый файл без внешних зависимостей (кроме случаев с wkhtmltopdf).
- Встроенная поддержка конкурентности — можно обрабатывать несколько запросов на генерацию PDF одновременно.
- Кроссплатформенность — соберите один раз и запускайте на Linux, Windows, macOS.
Основные библиотеки для работы с PDF в Go
Рассмотрим три популярных подхода: чистая реализация на Go (gofpdf), профессиональная коммерческая библиотека (uniPDF) и конвертация HTML в PDF (wkhtmltopdf).
1. gofpdf — простая и лёгкая библиотека
gofpdf (теперь github.com/jung-kurt/gofpdf) — это одна из первых и самых распространённых библиотек для создания PDF на чистом Go. Она не требует внешних зависимостей и позволяет программно рисовать текст, линии, изображения и таблицы.
Пример создания простого 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.ImageOptions("logo.png", 10, 20, 50, 0, false, gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true}, 0, "")
// Сохраняем в файл
err := pdf.OutputFileAndClose("output.pdf")
if err != nil {
panic(err)
}
}
Плюсы:
- Полностью на Go — никаких внешних программ.
- Лёгкий вес и простая установка.
- Поддержка Unicode (включая кириллицу) через встроенные шрифты.
Минусы:
- Ограниченная поддержка сложных макетов (например, нет готовых решений для сложных таблиц).
- Ручное позиционирование элементов — подходит для простых документов.
2. UniPDF — профессиональное решение для сложных задач
UniPDF (от github.com/unidoc/unipdf/v3) — это мощная коммерческая библиотека, которая предоставляет практически полный контроль над PDF. Она поддерживает создание, редактирование, конвертацию и извлечение данных из PDF. Для образовательных и некоммерческих проектов существует бесплатная версия с ограничениями.
Пример создания отчёта с таблицей:
package main
import (
"github.com/unidoc/unipdf/v3/common/license"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
// Укажите лицензию (бесплатная для тестирования)
license.SetMeteredKey("ваш_ключ")
c := creator.New()
c.NewPage()
// Заголовок
chapter := c.NewChapter("Отчёт за месяц")
chapter.Add(c.NewParagraph("Данные по продажам"))
// Таблица
table := c.NewTable(3)
table.SetColumnWidths(100, 100, 100)
headers := []string{"Товар", "Количество", "Сумма"}
for _, h := range headers {
cell := table.NewCell()
cell.SetBackgroundColor(creator.ColorRGBFromHex("#4CAF50"))
cell.SetContent(h)
}
data := [][]string{{"Ноутбук", "5", "450000"}, {"Мышь", "20", "20000"}}
for _, row := range data {
for _, val := range row {
cell := table.NewCell()
cell.SetContent(val)
}
}
chapter.Add(table)
c.Draw(chapter)
c.WriteToFile("report.pdf")
}
Плюсы:
- Поддержка сложных структур: таблицы, водяные знаки, формы, аннотации.
- Работа с существующими PDF (слияние, разбиение,
Также в библиотеке
Valgrind для C++: полное руководство с примерами
Отправка SMS на TypeScript: API библиотеки sms-client-ts
Кэширование в Go (Golang): Redis и альтернативные инструменты
GraphQL на Go: Полное руководство по библиотекам и инструментам
PDF генерация в JavaScript (Node.js): библиотеки и инструменты для создания PDF