PDF генерация в Go: Обзор библиотек и практическое руководство

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

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

Начать курс

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 (слияние, разбиение,

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