go 语言生成 pdf 需明确内容类型,gofpdf 必须调用 addpage() 才能写入内容,中文需 addfont 和 setfont 配合,wkhtmltopdf 依赖系统二进制且路径需显式配置,pdfgen 和 gopdf 已不兼容新版 go。

Go 语言本身不直接“转换文件成 PDF”——它需要你明确:是要把文本内容写进 PDF,还是把 HTML 渲染成 PDF,或是填充已有 PDF 模板?选错路径,轻则中文乱码、表格错位,重则编译失败或生产环境权限报错。
gofpdf.New 后必须调用 AddPage 才能写内容
常见错误是初始化 gofpdf.New() 就立刻调用 Cell() 或 MultiCell(),结果输出为空白页或 panic。这是因为 gofpdf.New() 只创建对象,不创建页面实体。
-
AddPage()必须在任何内容写入前调用,且每页都要显式添加 - 单位(如
"mm")、纸张(如"A4")、语言(如"zh-CN")必须在New()时定死,后续无法修改 - 坐标原点在左上角,Y 值增大 = 向下移动,画表格时容易把行高和 Y 坐标逻辑搞反
中文显示方块?AddFont 和 SetFont 缺一不可
gofpdf 默认只带 Latin 字体(Helvetica 等),不支持 UTF-8 中文。注册字体不是“可选项”,而是硬性前提。跳过 AddFont() 或漏掉 SetFont(),中文就必然变方块、空格或静默截断。
-
AddFont("simhei", "", "fonts/simhei.ttf")的第三个参数是运行时可读的 TTF 路径,不是编译路径;推荐用filepath.Join(filepath.Dir(os.Executable()), "fonts", "simhei.ttf")构造绝对路径 -
SetFont("simhei", "", 12)的第一个参数必须与AddFont()的第一个参数完全一致,大小写、下划线都不能错 - 别用 Windows 自带
simhei.ttf——有版权限制;生产环境建议换NotoSansCJKsc-Regular.ttf或SourceHanSansSC-Normal.otf(注意:gofpdf不支持 OTF,得转成 TTF)
wkhtmltopdf 需要系统级二进制依赖,PATH 或 ExecPath 必须显式处理
用 go-wkhtmltopdf 看似简单,但它的底层是调用系统命令。CI/CD 构建、Docker 容器、无 root 权限的服务器上,90% 的失败都卡在这一步。
-
NewPDFGenerator()默认从PATH查找wkhtmltopdf,若未命中会 panic;Linux 容器里常需apt install wkhtmltopdf,Alpine 则要用apk add wkhtmltopdf - Windows 下路径含空格或中文时,
exec.LookPath可能失败;稳妥做法是用wkhtml.NewPDFGeneratorOptions(&wkhtml.WkHtmlToPdfOptions{BinPath: "C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"}) - HTML 字符串里如果含
<script></script>或外部资源(如<img src="https://...?x-oss-process=image/resize,p_40">),默认会阻塞渲染;需显式设置pdfg.AddOptions(&wkhtml.PageOptions{LoadErrorHandling: "ignore", JavaScriptDelay: 500})
别碰 pdfgen 和 gopdf:兼容性已断裂
这两个库表面活跃,实际在 Go 1.21+ 环境下基本不可用。它们不是“不好用”,而是“根本跑不起来”。
-
pdfgen最后更新是 2021 年,Go 1.21 下NewPDF()返回类型变更,编译直接报undefined: pdf.New -
gopdf依赖 CGO 和libharu,Docker 构建时要装libhpdf-dev+ GCC,Windows 上还得配 VS Build Tools;CI 日志里出现cgo: exec gcc: exec: "gcc": executable file not found就是它 - 两者的文档和示例代码全把
SetPageSize写成SetPageSizes(多了一个 s),照抄必报错
真正麻烦的从来不是“怎么写第一行代码”,而是字体路径在不同部署环境是否可达、wkhtmltopdf 的二进制版本是否与内核兼容、gofpdf 的坐标计算是否被动态内容高度反向影响——这些细节不会报错,只会让 PDF 在某台机器上少半页内容,或者中文突然变成方块。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











