Генерация PDF-отчётов в Go
Хорошо. Теперь генерируем PDF в GO!
Программная генерация PDF-документов может стать важной функцией вашего приложения. Здесь мы рассматриваем и кратко обзор с примерами библиотек, доступных в языке программирования Go (Golang) для генерации PDF-файлов.
Подходящие решения могут различаться, например, для создания простых документов или сложной и функционально насыщенной генерации 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, предоставляя разработчикам разнообразие инструментов на выбор в соответствии с их конкретными требованиями.