Go (Golang) 中的PDF生成:工具与库完整概览
现代Web应用程序和微服务通常需要生成PDF文档:报告、账单、发票、证书或简单的数据导出。Go语言为这项任务提供了几个成熟的解决方案。在本文中,我们将详细分析主要的库、它们的功能、使用示例,并帮助您为pythonlib.ru上的项目选择合适的工具。
为什么使用Go生成PDF?
Go (Golang) 是一种编译型、静态类型语言,以其高性能和简洁性而闻名。在生成PDF时,它具有以下优势:
- 高速 — Go二进制文件运行速度快,内存使用效率高。
- 部署简单 — 单个可执行文件,无外部依赖(wkhtmltopdf情况除外)。
- 内置并发支持 — 可以同时处理多个PDF生成请求。
- 跨平台 — 一次构建,即可在Linux、Windows、macOS上运行。
Go中用于处理PDF的主要库
我们将探讨三种流行的方法:纯Go实现(gofpdf)、专业商业库(uniPDF)以及HTML转PDF(wkhtmltopdf)。
1. gofpdf — 简单轻量的库
gofpdf(现在为github.com/jung-kurt/gofpdf)是最早且最流行的纯Go创建PDF的库之一。它不需要外部依赖,允许以编程方式绘制文本、线条、图像和表格。
创建包含文本和图像的简单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, "你好,世界!") // 添加图像(Logo) pdf.ImageOptions("logo.png", 10, 20, 50, 0, false, gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true}, 0, "") // 保存到文件 err := pdf.OutputFileAndClose("output.pdf") if err != nil { panic(err) }}优点:
- 完全基于Go — 无需外部程序。
- 轻量且安装简单。
- 通过内置字体支持Unicode(包括西里尔字母)。
缺点:
- 对复杂布局的支持有限(例如,没有现成的复杂表格解决方案)。
- 手动定位元素 — 适用于简单文档。
2. UniPDF — 适用于复杂任务的专业解决方案
UniPDF(来自github.com/unidoc/unipdf/v3)是一个强大的商业库,提供对PDF几乎完全的控制。它支持创建、编辑、转换和从PDF中提取数据。对于教育性和非商业性项目,存在一个有限制的免费版本。
创建带表格的报告示例:
package main
import ( "github.com/unidoc/unipdf/v3/common/license" "github.com/unidoc/unipdf/v3/creator")
func main() { // 指定许可证(免费用于测试) license.SetMeteredKey("您的密钥") c := creator.New() c.NewPage() // 标题 chapter := c.NewChapter("月度报告") chapter.Add(c.NewParagraph("销售数据")) // 表格 table := c.NewTable(3) table.SetColumnWidths(100, 100, 100) headers := []string{"产品", "数量", "金额"} for _, h := range headers { cell := table.NewCell() cell.SetBackgroundColor(creator.Col