gofpdf是Go中生成PDF的轻量开源首选,适合报表等结构化文档;需注意单位设置、中文字体注册与路径、MultiCell换行不分页等问题;unidoc功能强但v4+闭源商用需授权。

Go 本身不带 PDF 生成能力,gofpdf 和 unidoc 是目前最常用的选择,但二者定位和许可差异极大:前者完全开源免费、轻量够用;后者功能强但商用需授权,且 v4+ 版本已闭源。
用 gofpdf 快速写入文字和简单表格
gofpdf 是最稳妥的入门选择,API 简洁,无外部依赖,适合生成报表、票据、导出文档等场景。它不支持复杂排版(如自动分页文字流、CSS 样式),但对结构化内容足够可靠。
安装:
go get github.com/jung-kurt/gofpdf
基础写法要点:
立即学习“go语言免费学习笔记(深入)”;
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
New创建 PDF 实例时,注意单位(pt/mm/cm)会影响后续坐标和字体大小计算,推荐统一用pt - 调用
AddPage后必须紧接着SetFont,否则中文会显示为方块(默认字体不支持 UTF-8) - 中文需提前注册 TTF 字体:
AddFont+SetFont,字体文件路径要可读,且不能是相对路径(建议用embed.FS或绝对路径) -
Cell和MultiCell的宽度参数是绝对值(单位同初始化设置),不是百分比;MultiCell自动换行但不自动分页,超长内容需手动检测GetY并调用AddPage
处理中文乱码:字体注册与编码边界
Go 源文件用 UTF-8 编码,但 gofpdf 默认只认 Latin-1。中文显示异常不是代码问题,而是字体链断裂——没注册字体,或注册了但路径错误,或字体本身不包含所需汉字字形。
正确做法:
- 用支持中文的 TTF(如 NotoSansCJK、思源黑体),确认该字体文件能正常打开并显示中文
- 注册时路径必须准确:
pdf.AddFont("simhei", "", "fonts/simhei.ttf"),其中"fonts/simhei.ttf"是运行时可访问路径,非编译时路径 - 注册后必须显式调用
pdf.SetFont("simhei", "", 12),仅注册不生效 - 避免在字符串中混用 \uXXXX 和字面中文,统一用原生中文字符串,防止编码转换意外截断
unidoc 能做什么?什么情况下不该碰
unidoc(v3 及更早)曾是 Go 生态最强 PDF 库,支持模板填充、数字签名、加密、表单字段、PDF/A 等。但它从 v4 开始转为商业授权,开源版功能受限(如生成超过 5 页 PDF 会加水印),且不再维护旧版本安全更新。
当前现实:
- 如果你只是导出订单、日志、配置摘要,
gofpdf更轻、更稳、无法律风险 - 若需解析已有 PDF、填表、加签、合并/拆分,
unidoc商业版是少数可行方案,但必须签协议并付费 - 别试图用
go:embed+unidoc开源版绕过限制——水印逻辑在底层库中硬编码,无法规避 - 社区有
pdfcpu等替代品,但专注 PDF 处理(读/改/验),不擅长从零生成
真正卡住人的往往不是语法,而是字体路径是否真实可读、中文是否落在所选字体的 Unicode 范围内、以及 MultiCell 高度估算偏差导致内容被裁切——这些都得靠打印 GetY 和实际 PDF 文件逐像素验证。


















