Go(Golang)中的PDF生成:库与工具完整概览
创建PDF文档是Web开发、报表自动化和电子文档流转中的常见任务之一。Go语言(Golang)为此提供了几个成熟的解决方案。在本文中,我们将详细分析主要的库、它们的功能、使用示例,并帮助您为项目选择合适的工具。
为什么选择Go进行PDF生成?
Go结合了编译型语言的高性能和开发的简便性。凭借内置的并发支持(goroutine)和高效的内存管理,即使处理大量数据,PDF生成也能快速完成。此外,静态类型和丰富的标准库使代码可靠且可预测。
Go中用于PDF生成的主要库
1. gofpdf — 简单轻量的库
gofpdf 是著名的PHP库FPDF的一个移植版本。它提供了从零开始创建PDF的基本API:添加页面、字体、图像、表格和简单的图形基元。
安装:
go get github.com/jung-kurt/gofpdf示例:创建包含文本和图像的简单PDF
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, PDF World!") pdf.ImageOptions("logo.png", 10, 20, 30, 0, false, gofpdf.ImageOptions{ImageType: "PNG"}, 0, "") err := pdf.OutputFileAndClose("output.pdf") if err != nil { panic(err) }}优点: API简洁,体积小,无需外部依赖,支持Unicode(UTF-8)。
缺点: 对复杂布局的支持有限,没有内置的HTML渲染。
2. maroto — 用于报表的高级库
Maroto 构建在gofpdf之上,并添加了“网格”(grid)概念,用于创建复杂布局:表格、列、标题和徽标。非常适合发票、运单和报表。
安装:
go get github.com/johnfercher/maroto/v2示例:创建带表格的发票
package main
import ( "github.com/johnfercher/maroto/v2" "github.com/johnfercher/maroto/v2/pkg/components/col" "github.com/johnfercher/maroto/v2/pkg/components/row" "github.com/johnfercher/maroto/v2/pkg/components/text" "github.com/johnfercher/maroto/v2/pkg/core")
func main() { m := maroto.New() m.AddRow(20, text.NewCol(12, "Invoice No.123")) m.AddRow(10, text.NewCol(12, "Date: 2024-01-15")) // Table headers := []string{"Product", "Qty", "Price", "Total"} rows := [][]string{ {"Laptop", "2", "50000", "100000"}, {"Mouse", "5", "1500", "7500"}, } m.AddRow(10, col.New(12).Add(text.New("Product Table"))) // For table, use the table component // m.AddTable(headers, rows) doc, _ := m.Build() doc.Save("invoice.pdf")}优点: 声明式风格,现成组件(表格、二维码、图表),自动对齐。
缺点: 比gofpdf有更多依赖,在复杂布局上性能略有下降。
3. unipdf — 功能丰富的商业库
UniPDF(来自UniDoc公司)是一个专业的PDF处理解决方案:创建、编辑、数据提取、签名、加密。支持HTML到PDF的转换(通过WebKit)。
安装:
go get github.com/unidoc/unipdf/v3示例: