Генерация PDF на Go: обзор библиотек и примеры кода

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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                    

Рекомендаций