Генерация PDF-отчётов в Go

Хорошо. Теперь генерируем PDF в GO!

Содержимое страницы

Программная генерация PDF-документов может стать важной функцией вашего приложения. Здесь мы рассматриваем и кратко обзор с примерами библиотек, доступных в языке программирования Go (Golang) для генерации PDF-файлов.

Подходящие решения могут различаться, например, для создания простых документов или сложной и функционально насыщенной генерации PDF.

go, pdf! Да, изображение создано с помощью ИИ, моделью является Flux1.Dev.

Библиотеки и инструменты

gofpdf

GoPdf — это простая библиотека для создания PDF. Она позволяет добавлять текст, изображения, фигуры, таблицы и обрабатывать несколько страниц. Подходит для задач создания простых и умеренно сложных PDF-файлов.

Разработчик: Jung Kurt (разработка прекращена, но библиотека все еще используется).

Ограничение: Отсутствие обновлений, хотя существующие внедрения продолжают работать.

Пример:

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, "Hello World!")
    err := pdf.OutputFileAndClose("hello.pdf")
    if err != nil {
        panic(err)
    }
}

gopdf

Разработчик: signintech (активно поддерживается).

В языке программирования Go одной из выделяющихся библиотек для этой цели является gopdf, разработанная SignInTech. Эта библиотека предоставляет простой способ создания PDF программно, не опираясь на внешние зависимости или C-библиотеки.

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

Ключевые возможности:

  • Реализация на чистом Go: не требуются внешние зависимости или C-библиотеки.
  • Простой API: удобные функции для генерации PDF.
  • Высокая производительность: оптимизирована для быстрого и эффективного создания PDF.

Пример использования

Чтобы продемонстрировать, как можно использовать gopdf, рассмотрим базовый пример создания простого PDF-документа:

package main

import (
    "github.com/signintech/gopdf"
)

func main() {
    // Create a new PDF instance
    pdf := gopdf.New()

    // Set the page size and margins
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Add some text to the PDF
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Save the PDF to a file
    err := pdf.SaveToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Этот пример демонстрирует, как создать новый PDF-документ, добавить в него текст и сохранить его в файл.

Расширенные возможности gopdf:

  • Добавление изображений: вы можете вставлять изображения в ваши PDF-документы с помощью метода AddImage.
  • Рисование фигур: библиотека предоставляет функции для рисования линий, прямоугольников и других фигур.
  • Защита PDF: вы можете установить парольную защиту для ваших PDF, чтобы ограничить доступ.

pdfcpu

  • Разработчик: команда PDFCPU (https://github.com/pdfcpu/pdfcpu).
  • Сценарии использования: Манипуляции и анализ PDF в масштабе.

Ещё одной мощной библиотекой, доступной для манипуляций с PDF на Go, является pdfcpu. Эта библиотека предлагает комплексный набор функций для создания, изменения и проверки PDF-файлов через API и командную строку (CLI). Ниже мы подробно опишем её назначение, примеры использования и ключевые функциональные возможности.

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

Ключевые возможности

  • Поддержка шифрования: pdfcpu поддерживает шифрование, позволяя разработчикам эффективно защищать свои PDF-документы.
  • API и CLI: она предлагает как API для программного доступа, так и командный интерфейс (CLI) для быстрого выполнения операций.
  • Пакетная обработка: сильная поддержка пакетной обработки через богатую командную строку делает её эффективной для обработки нескольких файлов одновременно.
  • Совместимость: совместима со всеми версиями PDF, включая базовую поддержку и продолжающиеся улучшения для PDF 2.0.

Чтобы начать работу с pdfcpu, необходимо установить её с помощью системы управления пакетами Go:

go get github.com/pdfcpu/pdfcpu

Базовые операции командной строки

pdfcpu предоставляет различные команды для разных операций. Вот несколько примеров:

Создание PDF из изображений

Вы можете преобразовать одно или несколько изображений в PDF-файл следующей командой:

pdfcpu img2pdf out.pdf image1.jpg image2.png

Эта команда создаст PDF, где каждое изображение будет отображено на отдельной странице.

Чтобы объединить несколько PDF-файлов в один документ, используйте команду merge:

pdfcpu merge output.pdf file1.pdf file2.pdf

Пример использования pdfcpu

Для более сложных операций можно использовать API, предоставленный pdfcpu. Вот пример того, как создать новый PDF и добавить текст с помощью кода на Go:

package main

import (
    "github.com/pdfcpu/pdfcpu"
    "log"
)

func main() {
    // Create a new PDF document
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Add a page to the document
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Add text to the page
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // Save the document
    err := doc.Save("output.pdf")
    if err != nil {
        log.Fatal(err)
    }
}

Этот пример демонстрирует, как создать новый PDF, добавить страницу и написать на неё текст с помощью API pdfcpu.

Maroto

  • Разработчик: команда go-playground (https://github.com/go-playground/maroto).
  • Сценарии использования: Разработчики, предпочитающие подход, ориентированный на дизайн (похожий на Bootstrap).
  • Вдохновлен Bootstrap; разработан так, чтобы быть удобным в использовании с декларативным стилем, похожим на HTML/CSS.
  • Построен на базе gofpdf, упрощает процесс создания, сохраняя при этом мощные возможности настройки.

Maroto — это еще одна библиотека на Go для создания PDF, но она сосредоточена на упрощении процесса, абстрагируя низкоуровневые детали. Она строится на основе библиотеки gofpdf и предлагает более удобный API для генерации документов.

Пример использования Maroto

Вот пример того, как можно использовать Maroto для создания простого PDF:

package main

import (
    "github.com/andreyhoffmann1103/maroto"
)

func main() {
    // Create a new PDF document with specified dimensions
    m := maroto.NewPDF(595, 842) // A4 size in points

    // Add some text to the first page
    m.AddText("Hello, Maroto!", 0, 0)

    // Save the PDF to a file
    err := m.OutputFileAndClose("example.pdf")
    if err != nil {
        panic(err)
    }
}

Этот пример показывает, как создать новый PDF-документ с одной страницей и добавить на него текст с помощью Maroto.

Unipdf

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

  • Разработчик: UnidocLib (https://unidoc.io).
  • Сценарии использования: Расширенная обработка PDF (шифрование, слияние, скриптинг).
  • Мощная библиотека для создания и обработки PDF (чистый Go).
  • Предлагает обширные функции, включая интерактивные элементы, такие как ссылки, закладки, слияние/разделение, шифрование и многое другое.
  • Комплексный API для чтения и записи объектов PDF (словари, потоки).
  • Подходит для приложений, которым нужны надежные возможности генерации PDF.

Установка UniPDF

Чтобы начать работу с UniPDF, необходимо установить библиотеку. Выполните следующие шаги:

# Create a New Directory:
mkdir go-pdf-generator cd go-pdf-generator
# Initialize the Go Module:
go mod init go-pdf-generator
# Install UniPDF Library:
go get github.com/unidoc/unipdf/v3

Это настроит ваш проект и установит необходимые зависимости.

Пример базового использования

Вот простой пример создания PDF-документа с использованием UniPDF:

package main

import (
    "github.com/unidoc/unipdf/v3/core"
    "github.com/unidoc/unipdf/v3/model"
    "github.com/unidoc/unipdf/v3/creator"
)

func main() {
    // Create a new PDF document
    pdf := creator.New()

    // Add a page to the PDF
    page := pdf.NewPage()

    // Set up the content stream for the page
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Add text to the page
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Save the PDF document
    err := pdf.WriteToFile("example.pdf")
    if err != nil {
        panic(err)
    }
}

Этот пример демонстрирует, как создать новый PDF-документ, добавить страницу и написать на неё текст. Полученный файл example.pdf будет содержать текст “Hello, UniPDF!”.

Обёртка для wkhtmltopdf

  • https://github.com/SebastiaanKlippert/go-wkhtmltopdf
  • Зависимость: требует установки wkhtmltopdf через brew или apt-get.
  • Сценарии использования: Генерация PDF из динамического HTML-содержимого (например, счета, отчеты).

Возможности:

  • Преобразует HTML-шаблоны (отрендеренные с помощью html/template на Go) в PDF.
  • Настраиваемые поля, ориентация страницы и колонтитулы/нижние колонтитулы.
  • Подходит, когда дизайн документа сложен и включает стилизацию HTML/CSS.
  • Использует wkhtmltopdf как backend для преобразования HTML-содержимого в формат PDF.

Пример использования go-wkhtmltopdf

import (
    "bytes"
    "github.com/SebastiaanKlippert/go-wkhtmltopdf"
    "html/template"
)

type PDFService struct {}

func NewPDFService() *PDFService {
    return &PDFService{}
}

func (p PDFService) GeneratePDF(data interface{}) ([]byte, error) {
    var templ *template.Template
    var err error

    if templ, err = template.ParseFiles("pdf-template.html"); err != nil {
        return nil, err
    }

    var body bytes.Buffer
    if err := templ.Execute(&body, data); err != nil {
        return nil, err
    }

    pdfg, err := wkhtmltopdf.NewPDFGenerator()
    if err != nil {
        return nil, err
    }

    page := wkhtmltopdf.NewPageReader(bytes.NewReader(body.Bytes()))
    page.EnableLocalFileAccess.Set(true)

    pdfg.AddPage(page)
    pdfg.MarginLeft.Set(0)
    pdfg.MarginRight.Set(0)
    pdfg.Dpi.Set(300)
    pdfg.PageSize.Set(wkhtmltopdf.PageSizeA4)
    pdfg.Orientation.Set(wkhtmltopdf.OrientationLandscape)

    err = pdfg.Create()
    if err != nil {
        return nil, err
    }

    return pdfg.Bytes(), nil
}

pdflib (от EndFirstCorp):

  • Инструмент командной строки для различных операций с PDF, таких как валидация, оптимизация, разделение/слияние.
  • Полезен для пакетной обработки и административных задач, связанных с PDF-документами.

Обзор pdflib

Библиотека pdflib разработана как комплексный процессор PDF для языка программирования Go. Она поддерживает различные функции, такие как валидация, оптимизация, разделение, слияние, извлечение содержимого из PDF и обрезка. Библиотека соответствует стандарту PDF 32000-1:2008 (PDF 1.7), обеспечивая совместимость с широким спектром PDF-документов.

Ключевые возможности

  • Валидация: обеспечивает, чтобы PDF-файлы соответствовали стандарту PDF 1.7.
  • Оптимизация: уменьшает размер файла, устраняя избыточные ресурсы.
  • Разделение и слияние: позволяет разделять многостраничные PDF на одностраничные или сливать несколько PDF в один.
  • Извлечение: извлекает изображения, шрифты, содержимое и страницы из PDF.
  • Обрезка: создает обрезанные версии PDF-документов.

Установка

Чтобы использовать pdflib, необходимо установить её через систему управления пакетами Go. Вы можете сделать это, выполнив:

go get github.com/EndFirstCorp/pdflib

Пример базового использования — валидация PDF

Вот простой пример, демонстрирующий, как использовать библиотеку pdflib для выполнения базовых операций с PDF:

Чтобы проверить PDF на соответствие стандарту PDF 1.7, можно использовать следующий код:

package main

import ( "fmt" "github.com/EndFirstCorp/pdflib/cmd/pdflib" )

func main() {
   // Validate a PDF file
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Validation failed:", err)
   } else {
     fmt.Println("PDF is valid.")
   }
}

Заключение

Для генерации PDF на Go выбор библиотеки зависит от сложности и конкретных требований вашего проекта. Предоставлены следующие рекомендации:

  • Простые документы: используйте gofpdf или Maroto. Эти библиотеки предлагают простоту и удобство использования для несложных задач.
  • Сложные дизайны с HTML/CSS: используйте wkhtmltopdf Wrapper, который использует wkhtmltopdf для обработки сложного HTML-содержимого и стилизации.
  • Расширенная обработка PDF: выбирайте Unipdf или pdfcpu, если ваше приложение требует расширенных функций, таких как шифрование, интерактивные элементы, детальное форматирование и комплексные возможности манипуляций.

Каждая из этих библиотек обладает уникальными преимуществами, отвечающими различным потребностям в генерации PDF, предоставляя разработчикам разнообразие инструментов на выбор в соответствии с их конкретными требованиями.

Ссылки на библиотеки

Другие полезные ссылки

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.