博客

gpdf 项目的发布说明、渲染器深度解析和社区故事。

gpdf team

在 Go PDF 中正确实现页码、页眉和页脚

用 gpdf 在 Go PDF 中加入页眉、页脚和『Page X of Y』:两个 builder 方法和两阶段分页器自动填充总页数,无需 hack。

tutorialinternals
Taiki Noda

gpdf vs wkhtmltopdf vs Chromium —— 2026 年 PDF 生成方案对比

wkhtmltopdf 已归档。Chromium 每次请求消耗 170 MB。gpdf 用 13 µs 渲染一页,无需浏览器。2026 年的诚实对比。

comparisonbenchmarkmigration
Taiki Noda

如何在 gpdf 的 Col 中嵌套一个 Row?

不能。ColBuilder 上没有 Row 方法,gpdf 的 12 列网格刻意保持扁平。这里给出替代嵌套 Row 的三种惯用写法。

recipetutorialtemplates
Taiki Noda

如何让表格跨多页输出?

什么都不用做。给 gpdf 传一个行数超过一页的表格,它会自动把表体分页,并在每一页顶部重复表头。

recipetutorialtemplates
Taiki Noda

如何在 gpdf 中在同一段落里混用两种字体

在 gpdf 中要在一个段落里混用多种字体,用 c.RichText 并给每个 span 设置 template.FontFamily。c.Text 只能给整个字符串套一种字体。

recipetutorialcjk
Taiki Noda

Go PDF 表格:列宽、斑马纹、分页头

Go 里画 PDF 表格容易翻车。gpdf 把列宽、斑马纹、跨页表头重复压缩到一次 Table 调用。完整 API 与权衡。

tutorialtemplatescomparison
Taiki Noda

从 signintech/gopdf 迁移到 gpdf:少写坐标计算

signintech/gopdf 能用,但每个单元格、每条线、每个页眉都是 (x, y) 计算。本文逐项映射 gopdf API 到 gpdf — 同样是 Go,不再写坐标。

migrationcomparisontutorial
Taiki Noda

如何在 gpdf 中按比例缩放图片以适配列宽?

把字节传给 c.Image 即可。gpdf 默认按列宽等比缩放。需要明确尺寸时再用 FitWidth / FitHeight。

recipetutorial
Taiki Noda

如何在 gpdf 表格中添加斑马条纹行?

传入 template.TableStripe 即可,gpdf 会自动给隔行涂上你指定的背景色,不用写循环、也不用逐格设置样式。

recipetutorialtemplates
Taiki Noda

如何在 gpdf 中添加自定义 TrueType 字体?

读取 TTF 字节,用 gpdf.WithFont 注册字族,再按名称引用即可。Inter、Roboto、图标字体、品牌字体都同样适用。

recipetutorial
Taiki Noda

unipdf 是 AGPL 或付费:迁移到 gpdf 的完整指南

UniDoc 的 unipdf 必须选 AGPL v3 或按开发者收费的商用许可。迁移到 MIT、零依赖、无许可证密钥的 gpdf。

migrationcomparisontutorial
Taiki Noda

把 Bootstrap 思维带进 PDF:gpdf 的 12 栏网格

gpdf 的 PDF 布局借鉴了 Bootstrap 的 12 栏网格——只保留整数 span 模型,丢弃断点、间距、排序等所有响应式包袱。本文剖析这一设计判断。

internalstemplatescomparison
Taiki Noda

如何在 gpdf 表格中设置列宽?

在 c.Table 中传入 template.ColumnWidths(...)。值是相对于父 Col 宽度的百分比。合计 100 占满全宽,未传完的尾部列会自动均分剩余空间。

recipetutorial
Taiki Noda

如何在 gpdf 中嵌入带透明度的 PNG?

把 PNG 字节直接传给 c.Image。gpdf 会把 alpha 通道解码成 PDF 的 SMask 对象,透明背景能正确渲染出来。

recipetutorial
Taiki Noda

如何在 gpdf 中同时使用粗体和斜体

在同一个 span 上传入 template.Bold() 和 template.Italic() 即可。但是 TrueType 字体必须注册全部 4 个变体,否则 BoldItalic 查找会静默回退到基础字体。

recipetutorial
Taiki Noda

用 Go 生成发票 PDF:50 行以下的完整代码

可运行的完整发票 PDF 生成器,50 行 Go 代码。零依赖,不需要 Chromium,不需要 CGO。gpdf 一个包搞定表头、表格、合计。

tutorialtemplates
Taiki Noda

如何在 gpdf 中使用思源黑体 JP(Source Han Sans JP)?

从 Adobe 的 GitHub 发布页下载 TTF 版本的思源黑体 JP,用 gpdf.WithFont 注册。七个字重,SIL OFL,与 Noto Sans JP 同源字形。

recipecjktutorial
Taiki Noda

为什么 gpdf 比其他 Go PDF 库快 10–30 倍

单页 13 µs,100 页报告 683 µs。不是调参,而是三个架构决策的叠加。本文走一遍代码路径。

benchmarkinternalscomparison
Taiki Noda

为什么 gpdf 生成的 PDF 中日文显示为方块(豆腐字)?

日文字符变成空方块(□),通常是字体未注册或族名不匹配。整理 4 种常见原因和最快的修复路径。

recipetroubleshootingcjk
Taiki Noda

如何在 gpdf 中使用 IPAex 哥特体(IPAex Gothic)?

用 gpdf.WithFont 注册 ipaexg.ttf。IPAex 只提供 Regular 一个字重,粗体需要合成或与 Mincho 配对。

recipecjktutorial
Taiki Noda

gpdf 的 12 列网格是怎么工作的?

gpdf 的 12 列网格用 r.Col(span, fn) 接收 1–12 的整数。列宽为 span/12 的比例,没有断点、没有槽宽间距,为 PDF 固定宽度设计。

recipetutorialtemplates
Taiki Noda

go-pdf/fpdf 也归档了。2026 年的 Go PDF 栈长这样。

jung-kurt/gofpdf 2021 年归档,go-pdf/fpdf 2025 年跟进。2026 年我们实际在用的 Go PDF 栈是 gpdf — 原因、权衡与迁移路径。

migrationcomparisonbenchmark
Taiki Noda

用 Go 生成日文 PDF 的 2026 权威指南

用 Go 生成日文 PDF 的完整流程。无 CGO、无 Chromium、无豆腐字。涵盖字体、子集化、混合排版、纵排。

tutorialcjktroubleshooting
Taiki Noda

2026 年 Go PDF 库终极对决

2026 年仍在维护的 Go PDF 库,在 4 种工作负载上基准测试,并对比许可证、依赖与维护状态。

comparisonbenchmark
Taiki Noda

如何在 gpdf 中嵌入日文字体?

将 TTF 字节传给 gpdf.WithFont 即可。自动子集化嵌入、无需 CGO,用 Go 生成日文 PDF 的最短路径。

recipecjktutorial
Taiki Noda

如何在 gpdf 中使用 Noto Sans JP?

用 gpdf.WithFont 注册 static 版 NotoSansJP-Regular.ttf,不要用 variable font。gpdf 会把 17,000 个字形子集化到每份 PDF 不到 40 KB。

recipecjktutorial
Taiki Noda

gofpdf 已归档:迁移到 gpdf 的完整指南

gofpdf 于 2021 年归档,后继 go-pdf/fpdf 也在 2025 年停止。纯 Go、零依赖、原生 CJK 的 gpdf 迁移指南。

migrationcomparisontutorial