[go: up one dir, main page]

写 Go,得到 PDF。

gpdf 是只依赖标准库的 Go PDF 库。用 12 列网格排版页面,嵌入中文、日文、韩文字体,约 13 µs 渲染一页。

$go get github.com/gpdf-dev/gpdf
工作方式
invoice.go
doc := template.New(template.WithPageSize(document.A4))
page := doc.AddPage()

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("ACME Corporation", template.FontSize(24),
            template.Bold(), template.TextColor(navy))
    })
    r.Col(6, func(c *template.ColBuilder) {
        c.Text("INVOICE", template.FontSize(28),
            template.Bold(), template.AlignRight())
    })
})

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(12, func(c *template.ColBuilder) {
        c.Table(header, items,
            template.ColumnWidths(40, 15, 20, 25),
            template.TableStripe(pdf.RGBHex(0xF5F5F5)),
        )
    })
})

data, err := doc.Generate()
invoice.pdf打开 PDF
gpdf 生成的发票 PDF:公司抬头、收款方信息、条纹明细表和合计

纯 Go,别无其他。

go.mod 里只有 Go 本身。无需 cgo、无头浏览器,也无需在服务旁边部署原生二进制。

熟悉的布局方式。

行和 12 列网格自动排到页面上。表格跨页拆分,文字自动换行。

任何文字都能嵌入。

TrueType 字体只子集化用到的字形,中日韩文字在任何服务器上都一样。

基准测试

快到可以在请求中直接生成。

用 gpdf、go-pdf/fpdf、signintech/gopdf 和 maroto v2 生成相同的 4 份文档。每份文档的时间和内存,越低越好。

单页
一页带标题和段落的 A4
gpdf
x
13 µs
fpdf
x
132 µs
gopdf
x
423 µs
maroto v2
x
237 µs
快 10–33 倍时间
表格(4×10)
带表头的样式表格
gpdf
x
108 µs
fpdf
x
241 µs
gopdf
x
835 µs
maroto v2
x
8,600 µs
快 2–80 倍时间
100 页
同一页重复 100 次
gpdf
x
683 µs
fpdf
x
11,700 µs
gopdf
x
8,600 µs
maroto v2
x
19,800 µs
快 13–29 倍时间
复杂文档
标题、表格和文字混排的文档
gpdf
x
133 µs
fpdf
x
254 µs
gopdf
x
997 µs
maroto v2
x
10,400 µs
快 2–78 倍时间
单页内存
构建一页时分配的内存
gpdf
x
16 KB
fpdf
x
1,200 KB
gopdf
x
1,800 KB
maroto v2
x
61 KB
内存少 4–113 倍内存
100 页内存
构建 100 页时分配的内存
gpdf
x
909 KB
fpdf
x
121,000 KB
gopdf
x
83,000 KB
maroto v2
x
4,000 KB
内存少 4–133 倍内存

5 次运行的中位数,每次 100 次迭代。Apple M1,Go 1.25。基准代码在 gpdf 仓库中。

查看基准代码

Go 原生架构

用 Go 构建,无需运行其他东西。

很多 Go 的 PDF 方案依赖语言之外的东西:边车里的无头浏览器、通过 HTTP 调用的 HTML 转 PDF 服务,或原生库的绑定。每一种都多了一个需要部署、打补丁和监控的运行时。

gpdf 从第一行起就用 Go 编写。它编译进你的二进制,在任何能运行 Go 的地方运行,整个依赖树只有标准库——安全团队无需额外审计。

一次 go get,一个二进制,开发与生产输出一致。

常见方案

你的 Go 应用

HTTP 调用或 cgo 绑定

无头浏览器 · JVM · 原生库

又多了一个需要部署、打补丁和监控的运行时。

gpdf

你的 Go 应用

go get

github.com/gpdf-dev/gpdf

单一二进制 · 仅标准库 · 无 cgo

运行环境

LinuxmacOSWindowsDockerServerless

CJK 优先

中文、日文、韩文,所写即所得。

很多 PDF 库把 CJK 放在最后考虑。gpdf 从第一天起就为它而设计。

  • 可嵌入任何 TrueType 字体,文件中只写入用到的字形。

  • 在同一段落或表格中混排中文、日文、韩文和拉丁文字。

  • 没有豆腐块(□),没有乱码,不依赖服务器上安装的字体。

阅读字体指南
gpdf 嵌入 Noto Sans JP 子集渲染的日文混排中文、日文、韩文的 gpdf 表格

日本語 · 中文 · 한국어

不止于排版。

归档、安全和后处理都在同一个模块里——依然只用 Go 标准库。

PDF/A

带 XMP 元数据的 PDF/A-1b 和 PDF/A-2b,适合需要保存数十年的文档。

AES-256 加密

所有者和用户密码,可控制打印、复制和编辑权限。

数字签名

为生成好的 PDF 加上带 RFC 3161 时间戳的 PKCS#7 签名。

页眉和页脚

每页重复的页眉、页脚和页码。

二维码和条形码

原生生成 QR 和 Code 128,可与 PNG、JPEG 图片并排。

合并与拆分

在 Go 中合并 PDF 或提取页面范围。

还有更多…

在现有 PDF 上叠加内容,将已填写的 AcroForm 字段扁平化。

浏览示例

gpdf 与其他方案

选择 PDF 库不只是看功能。

要部署什么、为什么付费、需要持续维护什么。

gpdf商业 Go SDKHTML 转 PDF(无头浏览器)
许可MIT,商用免费付费许可或按量密钥开源,但需自行运行浏览器
依赖仅 Go 标准库厂商模块每个镜像都带浏览器
部署在你的 Go 二进制中Go 二进制加许可密钥边车或独立服务
CJK 文字内置,子集嵌入取决于字体配置取决于镜像中的字体
单页约 13 µs因产品而异每个请求一次浏览器渲染

从 go get 到生产环境。

选择适合你技术栈的入口。三者都走同一个渲染引擎。

一行安装

go get github.com/gpdf-dev/gpdf。支持 Go 1.22 及以上。

Builder API

流畅、类型安全的 Go:PageBuilder → RowBuilder → ColBuilder。

JSON Schema

用 JSON 描述文档,可从任何服务或语言发送。

Go 模板

用 text/template 驱动 JSON Schema,一份源生成成千上万的文档。

现成模板

可复制修改的发票、收据和报价单。

可运行的示例

每个示例都是渲染真实 PDF 的测试,从表格到签名。

黄金文件测试

每次发布前,每个示例都会与保存的 PDF 逐字节比对。

规范符合性检查

CI 会按 PDF 规范验证生成的文件。

Go 1.22 到 1.26

CI 在每个支持的 Go 版本上开启竞态检测运行全部测试。

FAQ

上线前的常见问题

gpdf 是用纯 Go 编写、零外部依赖、MIT 许可的 PDF 生成库。它用 12 列网格排版,并可嵌入包括中日韩在内的 TrueType 字体。

今天就生成你的第一个 PDF。

一次 go get,再写几行 Go。