Blog

Release notes, renderer deep dives, and community stories from the gpdf project.

gpdf team

Why does my PDF show tofu boxes for Japanese?

Empty rectangles instead of Japanese characters mean your PDF couldn't find glyphs for those codepoints. Here are the four causes and the fixes.

recipetroubleshootingcjk
gpdf team

How do I use IPAex Gothic in gpdf?

Register ipaexg.ttf with gpdf.WithFont. IPAex Gothic ships a single Regular weight under the IPA Font License — bold emphasis has to be synthesized or paired.

recipecjktutorial
gpdf team

How does the 12-column grid work in gpdf?

gpdf's 12-column grid uses r.Col(span, fn) where span is 1–12. Column width is (span/12) of the row. No breakpoints, no gutters, predictable by design.

recipetutorialtemplates
gpdf team

go-pdf/fpdf is archived too. Here's the modern Go PDF stack.

jung-kurt/gofpdf archived in 2021. go-pdf/fpdf followed in 2025. Here's the Go PDF stack we actually use in 2026 — gpdf, the trade-offs, and why.

migrationcomparisonbenchmark
gpdf team

Japanese PDFs in Go: the 2026 definitive guide

How to generate Japanese PDFs in Go in 2026 — fonts, TrueType subsets, mixed kanji/kana/ASCII, and why CGO and Chromium are unnecessary.

tutorialcjktroubleshooting
gpdf team

Go PDF Library Showdown 2026

The Go PDF library landscape in 2026: every active and archived library, benchmarked on 4 workloads, with license and dependency details.

comparisonbenchmark
gpdf team

How do I embed a Japanese font in gpdf?

Register a Japanese TrueType font with gpdf.WithFont at document construction. Three lines, subset embedding happens automatically, no CGO.

recipecjktutorial
gpdf team

How do I use Noto Sans JP with gpdf?

Register the static NotoSansJP-Regular.ttf with gpdf.WithFont. Skip the variable font — gpdf's pure-Go parser does not read fvar tables. Subsetting lands around 30 KB.

recipecjktutorial
gpdf team

gofpdf is archived. Here's how to migrate to gpdf.

jung-kurt/gofpdf was archived in 2021. This guide maps every gofpdf API to gpdf — a pure-Go replacement with native CJK support and zero dependencies.

migrationcomparisontutorial