Go (Golang) 中的 PDF 生成:库与工具概述
创建 PDF 文档是 Web 开发中的常见任务之一。在 Go (Golang) 生态系统中,有多个成熟的库,可用于生成从简单报告到包含表格、图形和字体的复杂多页文档的 PDF。在本文中,我们将介绍主要工具、它们的功能,并提供实用的代码示例。
为什么选择 Go 进行 PDF 生成?
Go 是一种编译型语言,具有出色的性能和简单的并发模型。对于 PDF 生成任务,这意味着:
- 快速处理大量数据
- 易于与 Web 服务器集成 (net/http)
- 能够并行生成多个文档
- 无外部依赖(二进制文件包含所有必需内容)
Go 中用于处理 PDF 的主要库
1. gofpdf — 简单且流行的库
gofpdf 是著名的 PHP 库 FPDF 在 Go 中的移植版本。它提供了一个简单的 API,用于创建包含基本元素的 PDF:文本、线条、矩形、图像和表格。该库无需外部依赖,并通过嵌入字体支持 Unicode。
使用 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, "你好,世界!") pdf.OutputFileAndClose("hello.pdf")}gofpdf 的主要功能:
- 支持 UTF-8(需要嵌入 TrueType 字体)
- 自动分页
- 矢量图形(线条、曲线、填充)
- 嵌入图像 (JPEG, PNG, GIF)
- 动态数据表格
2. UniPDF — 功能强大的商业库
UniPDF(前身为 FoxyUtils)是一个用于在 Go 中处理 PDF 的专业解决方案。该库是开源的,但商业使用需要许可证。UniPDF 不仅支持创建,还支持编辑、转换和从 PDF 中提取数据。
使用 UniPDF 创建 PDF 的示例:
package main
import ( "os" "github.com/unidoc/unipdf/v3/creator")
func main() { c := creator.New() c.NewPage() // 添加文本 text := c.NewStyledParagraph() text.Append("UniPDF 文档示例") text.SetFontSize(18) c.Draw(text) // 保存 c.WriteToFile("unipdf_example.pdf")}UniPDF 的独特功能:
- 完全解析和编辑现有 PDF
- 支持表单、注释和书签
- 将 HTML 转换为 PDF
- 处理数字签名
- 提取文本和图像
3. Maroto — 基于可视化组件的 PDF 生成器
Maroto 构建在 gofpdf 之上,并提供了一种更高级的方法,使用“网格”概念。这对于创建报告、发票和其他结构化文档非常方便。
使用 Maroto 的示例:
package main
import ( "fmt" "github.com/johnfercher/maroto/v2/pkg/consts/align" "github.com/johnfercher/maroto/v2/pkg/consts/fontstyle" "github.com/johnfercher/maroto/v2/pkg/core" "github.com/johnfercher/maroto/v2/pkg/props" "github.com/johnfercher/maroto/v2")
func main() { m := maroto.New() m.Row(20, func() { m.Col(12, func() { m.Text("发票号 #123", props.Text{ Style: fontstyle.Bold, Align: align.Center, }) }) }) document, err := m.Generate() if err != nil {