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

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

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

Начать курс

Генерация PDF-отчётов на Go (Golang): обзор библиотек и практические примеры

Go (Golang) — это современный компилируемый язык, который идеально подходит для создания высоконагруженных серверных приложений, микросервисов и утилит командной строки. Одной из частых задач в веб-разработке является генерация отчётов в формате PDF: счета, накладные, аналитические дашборды или сертификаты. В этой статье мы рассмотрим три популярные библиотеки для работы с PDF на Go, их возможности и приведём рабочие примеры кода.

Почему Go для генерации PDF?

Go предлагает несколько преимуществ: высокая производительность, простота развёртывания (один бинарник), встроенная поддержка конкурентности и богатая стандартная библиотека. Для генерации PDF не требуется устанавливать громоздкие рантаймы (как Java или .NET), что делает решения на Go компактными и быстрыми. Однако в отличие от Python, где есть мощные библиотеки вроде ReportLab, экосистема Go для PDF более разнообразна, и выбор инструмента зависит от сложности отчёта.

1. gofpdf — базовая генерация PDF

gofpdf — это порт известной PHP-библиотеки FPDF. Она позволяет создавать PDF-документы «с нуля»: добавлять текст, изображения, линии, таблицы и шрифты. Библиотека не поддерживает HTML-шаблоны, поэтому вся разметка задаётся программно.

Установка:

go get github.com/jung-kurt/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, "Счёт №123")
    pdf.Ln(12)
    pdf.SetFont("Arial", "", 12)
    pdf.Cell(40, 10, "Дата: 2024-01-15")
    pdf.Ln(10)
    pdf.Cell(40, 10, "Товар: Ноутбук")
    pdf.Ln(10)
    pdf.Cell(40, 10, "Сумма: 50 000 руб.")
    
    err := pdf.OutputFileAndClose("invoice.pdf")
    if err != nil {
        panic(err)
    }
}

Плюсы: лёгкий вес, полный контроль над позиционированием, поддержка Unicode через TTF-шрифты.
Минусы: отсутствие встроенной поддержки HTML, сложность при создании сложных макетов.

2. maroto — упрощённое создание отчётов

Maroto построен поверх gofpdf, но предоставляет высокоуровневый API для создания отчётов. Вы работаете с понятиями «сетка», «строки», «колонки», «таблицы». Это напоминает работу с CSS-фреймворками.

Установка:

go get github.com/johnfercher/maroto/v2

Пример: таблица с данными

package main

import (
    "github.com/johnfercher/maroto/v2/pkg/core"
    "github.com/johnfercher/maroto/v2/pkg/props"
    "github.com/johnfercher/maroto/v2"
)

func main() {
    m := maroto.NewMaroto(maroto.WithPageSize("A4"))
    m.RegisterHeader(func() {
        m.Row(20, func() {
            m.Col(12, func() {
                m.Text("Отчёт по продажам", props.Text{Bold: true, Size: 16})
            })
        })
    })

    headers := []string{"Товар", "Кол-во", "Цена"}
    contents := [][]string{
        {"Ноутбук", "2", "100000"},
        {"Мышь", "5", "2500"},
    }

    m.Table(headers, contents, props.Table{})
    
    document, _ := m.Generate()
    _ = document.Save("report.pdf")
}

Плюсы: декларативный стиль, автоматическое выравнивание, встроенная поддержка таблиц и графиков.
Минусы: меньше гибкости для нестандартных макетов, чем gofpdf.

3. wkhtmltopdf — HTML в PDF

Если вам нужно превратить HTML-шаблон в PDF (например, с CSS-стилями), используйте wkhtmltopdf — обёртку над утилитой wkhtmltopdf (WebKit). Это не чистая Go-библиотека, но она позволяет использовать всю мощь HTML/CSS для дизайна отчётов.

Установка:

go get github.com/SebastiaanKlippert/go-wkhtmltopdf

Также необходимо установить сам wkhtmltopdf (скачать с официального сайта или через пакетный менеджер).

Пример: генерация из

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