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