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

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

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

Начать курс

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

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

1. gofpdf — классика для создания PDF с нуля

Библиотека gofpdf (ныне развивается как jung-kurt/gofpdf или форк go-pdf/fpdf) — это порт известной PHP-библиотеки FPDF. Она позволяет создавать PDF-документы без внешних зависимостей, используя только стандартные средства Go.

Установка

go get github.com/jung-kurt/gofpdf

Пример: простой счёт-фактура

package main

import (
    "github.com/jung-kurt/gofpdf"
)

func main() {
    pdf := gofpdf.New("P", "mm", "A4", "")
    pdf.SetFont("Arial", "B", 16)
    pdf.AddPage()
    pdf.CellFormat(190, 10, "Счёт №123 от 01.01.2025", "0", 1, "C", false, 0, "")
    
    pdf.SetFont("Arial", "", 12)
    pdf.Ln(10)
    pdf.CellFormat(190, 10, "Товар: Ноутбук", "1", 1, "L", false, 0, "")
    pdf.CellFormat(190, 10, "Цена: 120 000 руб.", "1", 1, "L", false, 0, "")
    pdf.CellFormat(190, 10, "Итого: 120 000 руб.", "1", 1, "L", false, 0, "")
    
    err := pdf.OutputFileAndClose("invoice.pdf")
    if err != nil {
        panic(err)
    }
}

Плюсы: минимальные зависимости, полный контроль над каждым элементом, поддержка Unicode (через AddUTF8Font).
Минусы: низкоуровневый API — для сложных отчётов придётся много кодить вручную.

2. maroto — высокоуровневая генерация с таблицами и стилями

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

Установка

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.New()
    m.SetPageMargins(10, 10, 10)
    
    // Заголовок
    m.Row(10, func() {
        m.Col(12, func() {
            m.Text("Отчёт по продажам", props.Text{
                Style: props.Bold,
                Size:  16,
                Align: props.Center,
            })
        })
    })
    
    // Таблица
    header := []string{"Товар", "Кол-во", "Цена"}
    data := [][]string{
        {"Монитор", "2", "30 000"},
        {"Клавиатура", "5", "7 500"},
    }
    
    m.TableList(header, data, props.TableList{
        HeaderProp: props.TableListContent{
            Style: props.Bold,
            Size:  10,
        },
        ContentProp: props.TableListContent{
            Size: 9,
        },
    })
    
    document, _ := m.Generate()
    document.Save("report.pdf")
}

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

3. wkhtmltopdf — конвертация HTML в PDF через Go-обёртку

Если у вас уже есть HTML-шаблоны (например, на Bootstrap), проще всего использовать wkhtmltopdf. Это не библиотека Go, а утилита командной строки, но для Go есть обёртка go-wkhtmltopdf. Она принимает HTML-строку и возвращает PDF.

Установка

# Сначала установите wkhtmltopdf: https://wkhtmltopdf.org/downloads.html
go get github.com/SebastiaanKlippert/go-wkhtmltopdf

Пример: из HTML в PDF

package main

import (
    "bytes"
    "fmt"                    

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