PDF генерация в Go (Golang): обзор библиотек и инструментов
Создание PDF-документов — одна из частых задач в веб-разработке. В экосистеме Go (Golang) существует несколько зрелых библиотек, которые позволяют генерировать PDF как для простых отчётов, так и для сложных многостраничных документов с таблицами, графикой и шрифтами. В этой статье мы рассмотрим основные инструменты, их возможности и приведём практические примеры кода.
Почему Go для генерации PDF?
Go — компилируемый язык с отличной производительностью и простой моделью конкурентности. Для задач генерации PDF это означает:
- Быструю обработку больших объёмов данных
- Лёгкую интеграцию с веб-серверами (net/http)
- Возможность распараллеливать генерацию нескольких документов
- Отсутствие внешних зависимостей (бинарник включает всё необходимое)
Основные библиотеки для работы с PDF в Go
1. gofpdf — простая и популярная библиотека
gofpdf — это порт известной PHP-библиотеки FPDF на Go. Она предоставляет простой API для создания PDF с базовыми элементами: текст, линии, прямоугольники, изображения и таблицы. Библиотека не требует внешних зависимостей и поддерживает Unicode через встраивание шрифтов.
Пример создания простого PDF с 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.OutputFileAndClose("hello.pdf")
}
Основные возможности gofpdf:
- Поддержка UTF-8 (требуется встраивание шрифтов TrueType)
- Автоматические разрывы страниц
- Векторная графика (линии, кривые, заливки)
- Встраивание изображений (JPEG, PNG, GIF)
- Таблицы с динамическими данными
2. UniPDF — коммерческая мощная библиотека
UniPDF (ранее FoxyUtils) — профессиональное решение для работы с PDF на Go. Библиотека имеет открытый исходный код, но для коммерческого использования требуется лицензия. UniPDF поддерживает не только создание, но и редактирование, конвертацию и извлечение данных из PDF.
Пример создания PDF с UniPDF:
package main
import (
"os"
"github.com/unidoc/unipdf/v3/creator"
)
func main() {
c := creator.New()
c.NewPage()
// Добавление текста
text := c.NewStyledParagraph()
text.Append("Пример документа UniPDF")
text.SetFontSize(18)
c.Draw(text)
// Сохранение
c.WriteToFile("unipdf_example.pdf")
}
Уникальные возможности UniPDF:
- Полный парсинг и редактирование существующих PDF
- Поддержка форм, аннотаций и закладок
- Конвертация HTML в PDF
- Работа с цифровыми подписями
- Извлечение текста и изображений
3. Maroto — генератор PDF на основе визуальных компонентов
Maroto построен поверх gofpdf и предлагает более высокоуровневый подход с использованием концепции "сетки" (grid). Это удобно для создания отчётов, счетов и других структурированных документов.
Пример с Maroto:
package main
import (
"fmt"
"github.com/johnfercher/maroto/v2/pkg/consts/align"
"github.com/johnfercher/maroto/v2/pkg/consts/fontstyle"
"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.Row(20, func() {
m.Col(12, func() {
m.Text("Счёт №123", props.Text{
Style: fontstyle.Bold,
Align: align.Center,
})
})
})
document, err := m.Generate()
if err != nil {
panic(err)
}
err = document.Save("invoice.pdf")
if err != nil {
panic(err)
}
fmt.Println("PDF создан успешно!")
}
Преимущества Maroto:
- Декларативный стиль — легко читать и поддерживать
- Автоматическое выравнивание и перенос строк
- Встроенная поддержка таблиц, списков, QR-кодов
- Гибкая система цветов и стилей
4. PDFcpu — для обработки и модификации PDF
<