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

Хорошо. Теперь генерирую PDF-файлы в GO!

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

Генерация PDF-документов программным способом может быть важной функцией в вашем приложении. Здесь мы рассмотрим и дадим краткий обзор с примерами библиотек, доступных в языке программирования Go (Golang) для создания 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() {
    // Создание нового экземпляра PDF
    pdf := gopdf.New()

    // Установка размера страницы и полей
    pdf.SetPageSize(gopdf.PageSizeA4)
    pdf.AddPage()

    // Добавление текста в PDF
    pdf.SetFont("Arial", "", 12)
    pdf.Write(50, 50, "Hello, World!")

    // Сохранение PDF в файл
    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.

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() {
    // Создание нового PDF-документа
    doc := pdfcpu.NewPDF(0, 0)
    defer doc.Close()

    // Добавление страницы в документ
    page := doc.AddPage()
    page.SetMediaBox(pdfcpu.MediaBox{
        LLX: 0,
        LLY: 0,
        URX: 612,
        URY: 792,
    })

    // Добавление текста на страницу
    content := "Hello, World!"
    font := pdfcpu.NewFont("Helvetica", "")
    page.AddText(content, font, 12, 100, 750)

    // Сохранение документа
    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() {
    // Создание нового PDF-документа с указанными размерами
    m := maroto.NewPDF(595, 842) // размер A4 в точках

    // Добавление текста на первую страницу
    m.AddText("Hello, Maroto!", 0, 0)

    // Сохранение PDF в файл
    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, вам нужно установить библиотеку. Следуйте этим шагам:

# Создание новой директории:
mkdir go-pdf-generator cd go-pdf-generator
# Инициализация модуля Go:
go mod init go-pdf-generator
# Установка библиотеки UniPDF:
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() {
    // Создание нового PDF-документа
    pdf := creator.New()

    // Добавление страницы в PDF
    page := pdf.NewPage()

    // Настройка потока содержимого для страницы
    contentStream := model.NewContentStream()
    page.SetContents(contentStream)

    // Добавление текста на страницу
    text := "Hello, UniPDF!"
    font := creator.NewStandardFont(creator.FontHelvetica)
    textObject := model.NewText(text, font, 12)
    contentStream.Add(textObject)

    // Сохранение PDF-документа
    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 в качестве бэкенда для конвертации 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.
  • Обрезка: создаёт обрезанные версии 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() {
   // Проверка PDF-файла
   err := pdflib.Validate("example.pdf")
   if err != nil {
     fmt.Println("Проверка не удалась:", err)
   } else {
     fmt.Println("PDF действителен.")
   }
}

Заключение

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

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

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

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

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