<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>gpdf Blog</title>
  <subtitle>Release notes, renderer deep dives, and community stories from the gpdf project.</subtitle>
  <link href="https://gpdf.dev/rss.xml" rel="self" type="application/atom+xml" />
  <link href="https://gpdf.dev/blog" rel="alternate" type="text/html" />
  <id>https://gpdf.dev/rss.xml</id>
  <updated>2026-09-02T00:00:00.000Z</updated>
  <generator uri="https://gpdf.dev">gpdf-cloud</generator>
  <entry>
    <title>How do I align a gpdf column to the right edge of a row?</title>
    <link href="https://gpdf.dev/blog/align-column-right-edge" />
    <id>https://gpdf.dev/blog/align-column-right-edge</id>
    <updated>2026-09-02T00:00:00.000Z</updated>
    <published>2026-09-02T00:00:00.000Z</published>
    <summary>Two things need to happen: a filler Col to push the column to the right edge, and template.AlignRight() on the text inside it. Here&apos;s the gpdf code.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>Page numbers, headers, and footers that just work in Go PDFs</title>
    <link href="https://gpdf.dev/blog/page-numbers-headers-footers" />
    <id>https://gpdf.dev/blog/page-numbers-headers-footers</id>
    <updated>2026-05-19T00:00:00.000Z</updated>
    <published>2026-05-19T00:00:00.000Z</published>
    <summary>Add headers, footers, and &apos;Page X of Y&apos; in Go PDFs with gpdf: two builder methods, a two-pass paginator that fills in the totals, no shims required.</summary>
    <author>
      <name>gpdf team</name>
      <uri>https://gpdf.dev</uri>
    </author>
    <category term="tutorial" />
    <category term="internals" />
  </entry>
  <entry>
    <title>gpdf vs wkhtmltopdf vs Chromium-based PDF generation</title>
    <link href="https://gpdf.dev/blog/gpdf-vs-wkhtmltopdf-vs-chromium" />
    <id>https://gpdf.dev/blog/gpdf-vs-wkhtmltopdf-vs-chromium</id>
    <updated>2026-05-18T00:00:00.000Z</updated>
    <published>2026-05-18T00:00:00.000Z</published>
    <summary>wkhtmltopdf is archived. Chromium ships a 170 MB browser per request. gpdf renders a page in 13 µs with no browser. Here&apos;s the honest 2026 comparison.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="comparison" />
    <category term="benchmark" />
    <category term="migration" />
  </entry>
  <entry>
    <title>How do I nest a Row inside a Col in gpdf?</title>
    <link href="https://gpdf.dev/blog/nest-row-in-col" />
    <id>https://gpdf.dev/blog/nest-row-in-col</id>
    <updated>2026-05-16T00:00:00.000Z</updated>
    <published>2026-05-16T00:00:00.000Z</published>
    <summary>You can&apos;t — ColBuilder has no Row method in gpdf. The 12-column grid is flat by design. Here are the three idioms that replace nested rows.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>How do I make a table span multiple pages?</title>
    <link href="https://gpdf.dev/blog/multi-page-table" />
    <id>https://gpdf.dev/blog/multi-page-table</id>
    <updated>2026-05-12T00:00:00.000Z</updated>
    <published>2026-05-12T00:00:00.000Z</published>
    <summary>You don&apos;t do anything. Feed gpdf a table with more rows than fit, and it paginates the body and repeats the header on every page automatically.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>How do I mix two fonts in the same paragraph in gpdf?</title>
    <link href="https://gpdf.dev/blog/mix-two-fonts-in-paragraph" />
    <id>https://gpdf.dev/blog/mix-two-fonts-in-paragraph</id>
    <updated>2026-05-11T00:00:00.000Z</updated>
    <published>2026-05-11T00:00:00.000Z</published>
    <summary>To mix fonts in one paragraph in gpdf, call c.RichText and set template.FontFamily on each span — c.Text only styles the whole string at once.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="cjk" />
  </entry>
  <entry>
    <title>Tables in Go PDFs: column widths, striped rows, page breaks</title>
    <link href="https://gpdf.dev/blog/tables-in-go-pdfs" />
    <id>https://gpdf.dev/blog/tables-in-go-pdfs</id>
    <updated>2026-05-07T00:00:00.000Z</updated>
    <published>2026-05-07T00:00:00.000Z</published>
    <summary>Tables are the hardest part of a Go PDF. gpdf collapses widths, stripes, and multi-page header repeat into one Table call — here is the whole API and what it costs.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="tutorial" />
    <category term="templates" />
    <category term="comparison" />
  </entry>
  <entry>
    <title>From signintech/gopdf to gpdf: less coordinate math</title>
    <link href="https://gpdf.dev/blog/signintech-gopdf-migration" />
    <id>https://gpdf.dev/blog/signintech-gopdf-migration</id>
    <updated>2026-05-06T00:00:00.000Z</updated>
    <published>2026-05-06T00:00:00.000Z</published>
    <summary>signintech/gopdf works, but every cell, line, and header is an (x, y) calculation. This guide maps the gopdf API to gpdf — same Go, no coordinate math.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="migration" />
    <category term="comparison" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How do I scale an image proportionally to fit a column?</title>
    <link href="https://gpdf.dev/blog/scale-image-fit-column" />
    <id>https://gpdf.dev/blog/scale-image-fit-column</id>
    <updated>2026-05-05T00:00:00.000Z</updated>
    <published>2026-05-05T00:00:00.000Z</published>
    <summary>gpdf already does it. c.Image(bytes) fills the column width and preserves aspect ratio. Use FitWidth or FitHeight for explicit bounds, WithFitMode for the non-default behaviors.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How do I create striped (zebra) table rows?</title>
    <link href="https://gpdf.dev/blog/zebra-striped-table-rows" />
    <id>https://gpdf.dev/blog/zebra-striped-table-rows</id>
    <updated>2026-05-04T00:00:00.000Z</updated>
    <published>2026-05-04T00:00:00.000Z</published>
    <summary>Pass template.TableStripe to a table call. gpdf paints the alternate body rows with the color you give it. No row-loop, no manual cell styling.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>How do I add a custom TrueType font to gpdf?</title>
    <link href="https://gpdf.dev/blog/add-custom-truetype-font" />
    <id>https://gpdf.dev/blog/add-custom-truetype-font</id>
    <updated>2026-04-30T00:00:00.000Z</updated>
    <published>2026-04-30T00:00:00.000Z</published>
    <summary>Load TTF bytes, register with gpdf.WithFont, then reference the family name. Works for any TrueType — Inter, Roboto, icon fonts, brand fonts.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>unipdf is AGPL or paid. Here&apos;s how to migrate to gpdf.</title>
    <link href="https://gpdf.dev/blog/unidoc-migration" />
    <id>https://gpdf.dev/blog/unidoc-migration</id>
    <updated>2026-04-29T00:00:00.000Z</updated>
    <published>2026-04-29T00:00:00.000Z</published>
    <summary>UniDoc&apos;s unipdf forces AGPL v3 or a per-developer commercial license. This guide maps the unipdf creator API to gpdf — MIT, zero deps, no license key.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="migration" />
    <category term="comparison" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>Bootstrap thinking for PDF: gpdf&apos;s 12-column grid</title>
    <link href="https://gpdf.dev/blog/bootstrap-grid-thinking-for-pdf" />
    <id>https://gpdf.dev/blog/bootstrap-grid-thinking-for-pdf</id>
    <updated>2026-04-29T00:00:00.000Z</updated>
    <published>2026-04-29T00:00:00.000Z</published>
    <summary>gpdf borrows the 12-column grid from Bootstrap, but PDFs aren&apos;t web pages. Here&apos;s why 12 still works, and what we threw out: breakpoints, gutters, order.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="internals" />
    <category term="templates" />
    <category term="comparison" />
  </entry>
  <entry>
    <title>How do I set column widths in a gpdf table?</title>
    <link href="https://gpdf.dev/blog/table-column-widths" />
    <id>https://gpdf.dev/blog/table-column-widths</id>
    <updated>2026-04-28T00:00:00.000Z</updated>
    <published>2026-04-28T00:00:00.000Z</published>
    <summary>Pass template.ColumnWidths(...) to c.Table. Values are percentages of the parent column&apos;s width. Sum to 100; trailing missing values auto-distribute.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How do I embed a PNG with transparency in gpdf?</title>
    <link href="https://gpdf.dev/blog/embed-png-transparency" />
    <id>https://gpdf.dev/blog/embed-png-transparency</id>
    <updated>2026-04-28T00:00:00.000Z</updated>
    <published>2026-04-28T00:00:00.000Z</published>
    <summary>Pass the PNG bytes directly to c.Image. gpdf decodes the alpha channel into a PDF SMask so transparent backgrounds render correctly.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How do I use bold and italic together in gpdf?</title>
    <link href="https://gpdf.dev/blog/bold-italic-together" />
    <id>https://gpdf.dev/blog/bold-italic-together</id>
    <updated>2026-04-23T00:00:00.000Z</updated>
    <published>2026-04-23T00:00:00.000Z</published>
    <summary>Bold and italic on the same span work via template.Bold() and template.Italic(). For TrueType fonts you must register all four variants or the BoldItalic lookup silently falls back to the base family.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>Generate an invoice PDF in Go in under 50 lines</title>
    <link href="https://gpdf.dev/blog/invoice-pdf-go-under-50-lines" />
    <id>https://gpdf.dev/blog/invoice-pdf-go-under-50-lines</id>
    <updated>2026-04-21T00:00:00.000Z</updated>
    <published>2026-04-21T00:00:00.000Z</published>
    <summary>A complete, runnable invoice PDF in Go — 50 lines with gpdf, zero dependencies, no Chromium, no CGO. Here&apos;s the code and what every block does.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>How do I use Source Han Sans JP with gpdf?</title>
    <link href="https://gpdf.dev/blog/source-han-sans-jp-with-gpdf" />
    <id>https://gpdf.dev/blog/source-han-sans-jp-with-gpdf</id>
    <updated>2026-04-19T00:00:00.000Z</updated>
    <published>2026-04-19T00:00:00.000Z</published>
    <summary>Register the TTF variant of Source Han Sans JP from Adobe&apos;s GitHub release with gpdf.WithFont. Seven weights, SIL OFL, same glyphs as Noto Sans JP.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="cjk" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>Why gpdf is 10–30× faster than other Go PDF libraries</title>
    <link href="https://gpdf.dev/blog/why-gpdf-is-faster" />
    <id>https://gpdf.dev/blog/why-gpdf-is-faster</id>
    <updated>2026-04-19T00:00:00.000Z</updated>
    <published>2026-04-19T00:00:00.000Z</published>
    <summary>gpdf generates a single PDF page in 13 µs and a 100-page report in 683 µs. Not a tuning trick — three architectural choices that compound. Here&apos;s the code path.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="benchmark" />
    <category term="internals" />
    <category term="comparison" />
  </entry>
  <entry>
    <title>Why does my PDF show tofu boxes for Japanese?</title>
    <link href="https://gpdf.dev/blog/tofu-boxes-japanese" />
    <id>https://gpdf.dev/blog/tofu-boxes-japanese</id>
    <updated>2026-04-17T00:00:00.000Z</updated>
    <published>2026-04-17T00:00:00.000Z</published>
    <summary>Empty rectangles instead of Japanese characters mean your PDF couldn&apos;t find glyphs for those codepoints. Here are the four causes and the fixes.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="troubleshooting" />
    <category term="cjk" />
  </entry>
  <entry>
    <title>How do I use IPAex Gothic in gpdf?</title>
    <link href="https://gpdf.dev/blog/ipaex-gothic-gpdf" />
    <id>https://gpdf.dev/blog/ipaex-gothic-gpdf</id>
    <updated>2026-04-17T00:00:00.000Z</updated>
    <published>2026-04-17T00:00:00.000Z</published>
    <summary>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.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="cjk" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How does the 12-column grid work in gpdf?</title>
    <link href="https://gpdf.dev/blog/12-column-grid" />
    <id>https://gpdf.dev/blog/12-column-grid</id>
    <updated>2026-04-16T00:00:00.000Z</updated>
    <published>2026-04-16T00:00:00.000Z</published>
    <summary>gpdf&apos;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.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="tutorial" />
    <category term="templates" />
  </entry>
  <entry>
    <title>go-pdf/fpdf is archived too. Here&apos;s the modern Go PDF stack.</title>
    <link href="https://gpdf.dev/blog/go-pdf-fpdf-archived" />
    <id>https://gpdf.dev/blog/go-pdf-fpdf-archived</id>
    <updated>2026-04-16T00:00:00.000Z</updated>
    <published>2026-04-16T00:00:00.000Z</published>
    <summary>jung-kurt/gofpdf archived in 2021. go-pdf/fpdf followed in 2025. Here&apos;s the Go PDF stack we actually use in 2026 — gpdf, the trade-offs, and why.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="migration" />
    <category term="comparison" />
    <category term="benchmark" />
  </entry>
  <entry>
    <title>Japanese PDFs in Go: the 2026 definitive guide</title>
    <link href="https://gpdf.dev/blog/japanese-pdf-in-go" />
    <id>https://gpdf.dev/blog/japanese-pdf-in-go</id>
    <updated>2026-04-16T00:00:00.000Z</updated>
    <published>2026-04-16T00:00:00.000Z</published>
    <summary>How to generate Japanese PDFs in Go in 2026 — fonts, TrueType subsets, mixed kanji/kana/ASCII, and why CGO and Chromium are unnecessary.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="tutorial" />
    <category term="cjk" />
    <category term="troubleshooting" />
  </entry>
  <entry>
    <title>Go PDF Library Showdown 2026</title>
    <link href="https://gpdf.dev/blog/go-pdf-library-showdown-2026" />
    <id>https://gpdf.dev/blog/go-pdf-library-showdown-2026</id>
    <updated>2026-04-15T00:00:00.000Z</updated>
    <published>2026-04-15T00:00:00.000Z</published>
    <summary>The Go PDF library landscape in 2026: every active and archived library, benchmarked on 4 workloads, with license and dependency details.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="comparison" />
    <category term="benchmark" />
  </entry>
  <entry>
    <title>How do I embed a Japanese font in gpdf?</title>
    <link href="https://gpdf.dev/blog/embed-japanese-font" />
    <id>https://gpdf.dev/blog/embed-japanese-font</id>
    <updated>2026-04-15T00:00:00.000Z</updated>
    <published>2026-04-15T00:00:00.000Z</published>
    <summary>Register a Japanese TrueType font with gpdf.WithFont at document construction. Three lines, subset embedding happens automatically, no CGO.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="cjk" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>How do I use Noto Sans JP with gpdf?</title>
    <link href="https://gpdf.dev/blog/noto-sans-jp-with-gpdf" />
    <id>https://gpdf.dev/blog/noto-sans-jp-with-gpdf</id>
    <updated>2026-04-15T00:00:00.000Z</updated>
    <published>2026-04-15T00:00:00.000Z</published>
    <summary>Register the static NotoSansJP-Regular.ttf with gpdf.WithFont. Skip the variable font — gpdf&apos;s pure-Go parser does not read fvar tables. Subsetting lands around 30 KB.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="recipe" />
    <category term="cjk" />
    <category term="tutorial" />
  </entry>
  <entry>
    <title>gofpdf is archived. Here&apos;s how to migrate to gpdf.</title>
    <link href="https://gpdf.dev/blog/gofpdf-migration" />
    <id>https://gpdf.dev/blog/gofpdf-migration</id>
    <updated>2026-04-14T00:00:00.000Z</updated>
    <published>2026-04-14T00:00:00.000Z</published>
    <summary>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.</summary>
    <author>
      <name>Taiki Noda</name>
      <uri>https://nadai.dev/en/about</uri>
    </author>
    <category term="migration" />
    <category term="comparison" />
    <category term="tutorial" />
  </entry>
</feed>
