使用 Go (Golang) 生成 PDF 报告:库概览与代码示例
Go (Golang) 是一种现代编译型语言,越来越多地被用于创建高负载服务器应用和微服务。这类系统中的典型任务之一是生成 PDF 报告(如发票、凭证、统计仪表盘)。在本文中,我们将介绍三种流行的 Go PDF 生成库、它们的优势,并提供现成的代码示例。
1. gofpdf —— 从零创建 PDF 的经典库
gofpdf 库(目前以 jung-kurt/gofpdf 或分支 go-pdf/fpdf 的形式发展)是著名 PHP 库 FPDF 的一个移植版本。它无需外部依赖,仅使用 Go 标准库即可创建 PDF 文档。
安装
go get github.com/jung-kurt/gofpdf示例:简单的发票
package main
import ( "github.com/jung-kurt/gofpdf")
func main() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetFont("Arial", "B", 16) pdf.AddPage() pdf.CellFormat(190, 10, "发票编号 #123 日期 2025-01-01", "0", 1, "C", false, 0, "") pdf.SetFont("Arial", "", 12) pdf.Ln(10) pdf.CellFormat(190, 10, "商品:笔记本电脑", "1", 1, "L", false, 0, "") pdf.CellFormat(190, 10, "价格:120,000 卢布", "1", 1, "L", false, 0, "") pdf.CellFormat(190, 10, "总计:120,000 卢布", "1", 1, "L", false, 0, "") err := pdf.OutputFileAndClose("invoice.pdf") if err != nil { panic(err) }}优点:依赖最少,对每个元素有完全控制,支持 Unicode(通过 AddUTF8Font)。
缺点:低级 API —— 对于复杂报告,需要手动编写大量代码。
2. maroto —— 支持表格和样式的高级生成库
Maroto 构建在 gofpdf 之上,但提供了更便捷的 API:表格、网格、自动对齐以及内置字体支持。非常适合典型报告:发票、列表、价目表。
安装
go get github.com/johnfercher/maroto/v2示例:数据表格
package main
import ( "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.SetPageMargins(10, 10, 10) // 标题 m.Row(10, func() { m.Col(12, func() { m.Text("销售报告", props.Text{ Style: props.Bold, Size: 16, Align: props.Center, }) }) }) // 表格 header := []string{"商品", "数量", "价格"} data := [][]string{ {"显示器", "2", "30,000"}, {"键盘", "5", "7,500"}, } m.TableList(header, data, props.TableList{ HeaderProp: props.TableListContent{ Style: props.Bold, Size: 10, }, ContentProp: props.TableListContent{ Size: 9, }, }) document, _ := m.Generate() document.Save("report.pdf")}优点:开发速度快,内置样式,自动分页。
缺点:对于非标准布局,灵活性较低。
3. wkhtmltopdf —— 通过 Go 封装将 HTML 转换为 PDF
如果您已有 HTML 模板(例如基于 Bootstrap 的),最简单的方法是使用 wkhtmltopdf。这不是一个 Go 库,而是一个命令行工具,但 Go 有对应的封装 go-wkhtmltopdf。它接收 HTML 字符串并返回 PDF。
安装
# 首先安装 wkhtmltopdf:https://wkhtmltopdf.org/downloads.htmlgo get github.com/SebastiaanKlippert/go-wkhtmltopdf