Todas las publicaciones

¿Cómo uso IPAex Gothic en gpdf?

Registra ipaexg.ttf con gpdf.WithFont. IPAex Gothic trae solo un peso Regular bajo la IPA Font License: la negrita se sintetiza o se empareja con Mincho.

por gpdf team

La pregunta, en otras palabras

Quieres usar IPAex Gothic — la fuente Gothic proporcional que la Information-technology Promotion Agency (IPA) de Japón mantiene — en un documento gpdf. Motivos habituales: envíos de PDF a e-Tax, papeleo oficial frente al gobierno, o simplemente una guía de estilo que lleva con IPAex desde principios de 2010. Tres cosas confunden a la gente: qué archivo descargar, cómo lidiar con que no hay Bold, y qué te exige realmente la IPA Font License.

TL;DR

Registra ipaexg.ttf con gpdf.WithFont("IPAexGothic", bytes). Ponla como fuente por defecto. La negrita hay que sintetizarla con template.Bold() o emparejarla con IPAex Mincho, porque IPAex solo trae Regular. Conserva el texto de la licencia junto al binario.

Ejemplo completo

package main

import (
    "log"
    "os"

    "github.com/gpdf-dev/gpdf"
    "github.com/gpdf-dev/gpdf/document"
    "github.com/gpdf-dev/gpdf/template"
)

func main() {
    font, err := os.ReadFile("ipaexg.ttf")
    if err != nil {
        log.Fatal(err)
    }

    doc := gpdf.NewDocument(
        gpdf.WithPageSize(gpdf.A4),
        gpdf.WithMargins(document.UniformEdges(document.Mm(25))),
        gpdf.WithFont("IPAexGothic", font),
        gpdf.WithDefaultFont("IPAexGothic", 10.5),
    )

    page := doc.AddPage()
    page.AutoRow(func(r *template.RowBuilder) {
        r.Col(12, func(c *template.ColBuilder) {
            c.Text("請求書", template.FontSize(24), template.Bold())
            c.Text("令和8年4月17日発行")
            c.Text("金額: ¥100,000 (税込)")
        })
    })

    data, err := doc.Generate()
    if err != nil {
        log.Fatal(err)
    }
    if err := os.WriteFile("invoice.pdf", data, 0o644); err != nil {
        log.Fatal(err)
    }
}

Descarga IPAex00401.zip desde moji.or.jp/ipafont, extrae ipaexg.ttf, ponlo junto a main.go y corre go run main.go.

Qué archivo IPA es el correcto

Al abrir el zip encuentras tres TTFs más una licencia. La gente los confunde constantemente:

ArchivoQué es
ipaexg.ttfIPAex Gothic — sans-serif, latino proporcional. Para la mayoría de documentos.
ipaexm.ttfIPAex Mincho — serif, latino proporcional. Cuerpo de textos largos o emparejada con Gothic para énfasis.
ipag.ttfIPA Gothic (sin "ex") — sans-serif, latino monoespaciado. Rara vez es lo que quieres hoy.

La "ex" de IPAex significa "extended proportional". Las fuentes IPA originales ponían los caracteres latinos sobre rejillas CJK de ancho fijo, lo que hacía que el texto mixto J/E se viera estirado. IPAex lo corrige haciendo proporcionales los caracteres latinos mientras mantiene los CJK sobre su rejilla. Para cualquier documento con palabras prestadas del inglés, URLs o números — es decir, básicamente todo documento de negocio en Japón — quieres IPAex.

Si heredas un proyecto que usa ipag.ttf porque el desarrollador que eligió la fuente lo hizo antes de que existiera IPAex (IPA Gothic original: 2003, IPAex: 2010), el cambio es un swap de archivo. Mismo nombre de familia, todo igual.

Sin archivo Bold — ¿ahora qué?

IPAex publica exactamente un peso por familia: Regular. Es inusual comparado con los nueve pesos de Noto Sans JP, y es la razón principal por la que la gente mira IPAex y decide que no funcionará para su diseño.

Dos formas de manejarlo en gpdf:

Negrita sintetizada. template.Bold() superpone un trazo sobre los glifos Regular. Tipográficamente es un atajo — las negritas reales tienen contornos redibujados con trazos más gruesos, no Regular calcado dos veces. Pero para encabezados de facturas y etiquetas de tabla a 10 pt o más, la negrita sintetizada es indistinguible para la mayoría de lectores:

c.Text("合計金額", template.Bold())

Emparejar con IPAex Mincho. El recurso clásico de la tipografía japonesa para el énfasis no es poner negrita — es alternar serif/sans. Registra ambas familias:

gothic, _ := os.ReadFile("ipaexg.ttf")
mincho, _ := os.ReadFile("ipaexm.ttf")

doc := gpdf.NewDocument(
    gpdf.WithFont("IPAexGothic", gothic),
    gpdf.WithFont("IPAexMincho", mincho),
    gpdf.WithDefaultFont("IPAexGothic", 10.5),
)

page.AutoRow(func(r *template.RowBuilder) {
    r.Col(12, func(c *template.ColBuilder) {
        c.Text("請求書", template.FontFamily("IPAexMincho"), template.FontSize(24))
        c.Text("ご請求内容は下記の通りです。")
    })
})

Es la estética que se ve en invitaciones de boda e informes formales japoneses: Mincho para títulos, Gothic para el cuerpo. Si tu documento va a una oficina gubernamental, esa es probablemente la combinación esperada.

La IPA Font License, en breve

IPAex no es SIL OFL. Es la IPA Font License Agreement v1.0, aprobada por OSI y en general permisiva, pero con dos exigencias que conviene nombrar:

  1. Preserva el texto de la licencia allí donde distribuyas el binario de la fuente. Si haces //go:embed del TTF, empaqueta también el archivo de licencia. Un LICENSES/IPA-FONT-1.0.txt en la raíz del proyecto cubre la mayoría de los casos.
  2. No renombres la fuente. Si modificas el TTF en sí y lo redistribuyes, el derivado debe llevar un nombre distinto (que no contenga "IPA" ni "IPAex"). Ojo: esta restricción no aplica al subset de glifos en tiempo de render. El artículo 3.4 de la licencia exime explícitamente a los documentos de salida creados con la fuente de la restricción de nombres.

Es decir: el subset que gpdf hace en doc.Generate() está bien. El subset de la fuente que queda embebido en tu PDF no necesita otro nombre y no activa las cláusulas de "Derivative Font Program". Estás creando un documento, no redistribuyendo una fuente.

Un detalle para quienes contribuyan al propio gpdf: evitamos incluir IPAex en el repo de gpdf (los tests de golden usan fuentes SIL OFL como Noto) precisamente para que los usuarios río abajo no tengan que pensar en compatibilidad de licencia con el LICENSE raíz de su proyecto. Si usas IPAex en tu aplicación, esa es decisión de tu proyecto, no nuestra.

Cuándo elegir IPAex en vez de Noto Sans JP

DimensiónIPAex GothicNoto Sans JP
Pesos publicados1 (Regular)9 (Thin → Black)
LicenciaIPA Font License v1.0SIL OFL 1.1
Tratamiento latinoProporcional (IPAex) o monoespaciado (IPA)Proporcional
Preinstalada enAlgunas distros Linux japonesas, TeX Live ptex-fontsAndroid, ChromeOS
Público típicoGobierno, legal y académico japonésWeb de consumo, internacional
Tamaño7.5 MB (Gothic)5 MB (solo Regular)

Elige IPAex cuando tu salida cruce una frontera institucional japonesa — envíos de PDF a e-Tax, escritos a tribunales, artículos para una revista japonesa — porque los evaluadores, revisores y herramientas OCR de esos ecosistemas están calibrados contra IPA. Para todo lo demás, Noto Sans JP. Visualmente rinden muy parecido; la elección es de encaje con el ecosistema, no estética.

Lecturas relacionadas

Prueba gpdf

gpdf es una librería Go para generar PDFs. Licencia MIT, cero dependencias externas, soporte CJK nativo.

go get github.com/gpdf-dev/gpdf

⭐ Star en GitHub · Leer los docs