[{"data":1,"prerenderedAt":1553},["ShallowReactive",2],{"blog-pt-embed-japanese-font":3},{"id":4,"title":5,"author":6,"body":9,"date":1520,"description":1521,"draft":1522,"extension":1523,"howTo":1524,"image":1543,"meta":1544,"navigation":85,"path":1545,"seo":1546,"stem":1547,"tags":1548,"updated":1543,"__hash__":1552},"blogPt/pt/blog/003.embed-japanese-font.md","Como incorporar uma fonte japonesa no gpdf?",{"name":7,"url":8},"gpdf team","https://gpdf.dev",{"type":10,"value":11,"toc":1509},"minimark",[12,17,34,38,54,58,707,727,731,734,740,750,764,768,779,933,951,955,961,1394,1401,1405,1411,1419,1433,1437,1469,1473,1476,1493,1505],[13,14,16],"h2",{"id":15},"a-pergunta-em-outras-palavras","A pergunta, em outras palavras",[18,19,20,21,28,29,33],"p",{},"Como renderizar texto japonês (ou CJK em geral) em um PDF gerado com o ",[22,23,27],"a",{"href":24,"rel":25},"https://github.com/gpdf-dev/gpdf",[26],"nofollow","gpdf"," — sem a cerimônia do ",[30,31,32],"code",{},"AddUTF8Font",", sem CGO, sem embutir cinco megabytes de fonte em cada documento?",[13,35,37],{"id":36},"resposta-rápida","Resposta rápida",[18,39,40,41,44,45,48,49,53],{},"Leia os bytes do TTF. Passe ",[30,42,43],{},"gpdf.WithFont(\"NotoSansJP\", fontBytes)"," para o ",[30,46,47],{},"NewDocument",". Opcionalmente marque-a como padrão. ",[50,51,52],"strong",{},"Três linhas de setup, e o gpdf embute automaticamente só os glifos que você realmente usou"," — não os 5 MB inteiros.",[13,55,57],{"id":56},"o-exemplo-completo","O exemplo completo",[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","package main\n\nimport (\n    \"log\"\n    \"os\"\n\n    \"github.com/gpdf-dev/gpdf\"\n    \"github.com/gpdf-dev/gpdf/document\"\n    \"github.com/gpdf-dev/gpdf/template\"\n)\n\nfunc main() {\n    font, err := os.ReadFile(\"NotoSansJP-Regular.ttf\")\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    doc := gpdf.NewDocument(\n        gpdf.WithPageSize(gpdf.A4),\n        gpdf.WithMargins(document.UniformEdges(document.Mm(20))),\n        gpdf.WithFont(\"NotoSansJP\", font),\n        gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n    )\n\n    page := doc.AddPage()\n    page.AutoRow(func(r *template.RowBuilder) {\n        r.Col(12, func(c *template.ColBuilder) {\n            c.Text(\"こんにちは、世界。\", template.FontSize(24), template.Bold())\n            c.Text(\"日本語 PDF、これだけ。\")\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"hello.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n","go","",[30,66,67,80,87,97,109,119,124,134,144,154,160,165,181,220,236,254,260,265,283,306,344,370,395,401,406,425,459,496,544,564,570,576,581,602,615,630,635,681,696,701],{"__ignoreMap":64},[68,69,72,76],"span",{"class":70,"line":71},"line",1,[68,73,75],{"class":74},"sMK4o","package",[68,77,79],{"class":78},"sBMFI"," main\n",[68,81,83],{"class":70,"line":82},2,[68,84,86],{"emptyLinePlaceholder":85},true,"\n",[68,88,90,94],{"class":70,"line":89},3,[68,91,93],{"class":92},"s7zQu","import",[68,95,96],{"class":74}," (\n",[68,98,100,103,106],{"class":70,"line":99},4,[68,101,102],{"class":74},"    \"",[68,104,105],{"class":78},"log",[68,107,108],{"class":74},"\"\n",[68,110,112,114,117],{"class":70,"line":111},5,[68,113,102],{"class":74},[68,115,116],{"class":78},"os",[68,118,108],{"class":74},[68,120,122],{"class":70,"line":121},6,[68,123,86],{"emptyLinePlaceholder":85},[68,125,127,129,132],{"class":70,"line":126},7,[68,128,102],{"class":74},[68,130,131],{"class":78},"github.com/gpdf-dev/gpdf",[68,133,108],{"class":74},[68,135,137,139,142],{"class":70,"line":136},8,[68,138,102],{"class":74},[68,140,141],{"class":78},"github.com/gpdf-dev/gpdf/document",[68,143,108],{"class":74},[68,145,147,149,152],{"class":70,"line":146},9,[68,148,102],{"class":74},[68,150,151],{"class":78},"github.com/gpdf-dev/gpdf/template",[68,153,108],{"class":74},[68,155,157],{"class":70,"line":156},10,[68,158,159],{"class":74},")\n",[68,161,163],{"class":70,"line":162},11,[68,164,86],{"emptyLinePlaceholder":85},[68,166,168,171,175,178],{"class":70,"line":167},12,[68,169,170],{"class":74},"func",[68,172,174],{"class":173},"s2Zo4"," main",[68,176,177],{"class":74},"()",[68,179,180],{"class":74}," {\n",[68,182,184,188,191,194,197,200,203,206,209,212,216,218],{"class":70,"line":183},13,[68,185,187],{"class":186},"sTEyZ","    font",[68,189,190],{"class":74},",",[68,192,193],{"class":186}," err ",[68,195,196],{"class":74},":=",[68,198,199],{"class":186}," os",[68,201,202],{"class":74},".",[68,204,205],{"class":173},"ReadFile",[68,207,208],{"class":74},"(",[68,210,211],{"class":74},"\"",[68,213,215],{"class":214},"sfazB","NotoSansJP-Regular.ttf",[68,217,211],{"class":74},[68,219,159],{"class":74},[68,221,223,226,228,231,234],{"class":70,"line":222},14,[68,224,225],{"class":92},"    if",[68,227,193],{"class":186},[68,229,230],{"class":74},"!=",[68,232,233],{"class":74}," nil",[68,235,180],{"class":74},[68,237,239,242,244,247,249,252],{"class":70,"line":238},15,[68,240,241],{"class":186},"        log",[68,243,202],{"class":74},[68,245,246],{"class":173},"Fatal",[68,248,208],{"class":74},[68,250,251],{"class":186},"err",[68,253,159],{"class":74},[68,255,257],{"class":70,"line":256},16,[68,258,259],{"class":74},"    }\n",[68,261,263],{"class":70,"line":262},17,[68,264,86],{"emptyLinePlaceholder":85},[68,266,268,271,273,276,278,280],{"class":70,"line":267},18,[68,269,270],{"class":186},"    doc ",[68,272,196],{"class":74},[68,274,275],{"class":186}," gpdf",[68,277,202],{"class":74},[68,279,47],{"class":173},[68,281,282],{"class":74},"(\n",[68,284,286,289,291,294,296,298,300,303],{"class":70,"line":285},19,[68,287,288],{"class":186},"        gpdf",[68,290,202],{"class":74},[68,292,293],{"class":173},"WithPageSize",[68,295,208],{"class":74},[68,297,27],{"class":186},[68,299,202],{"class":74},[68,301,302],{"class":186},"A4",[68,304,305],{"class":74},"),\n",[68,307,309,311,313,316,318,321,323,326,328,330,332,335,337,341],{"class":70,"line":308},20,[68,310,288],{"class":186},[68,312,202],{"class":74},[68,314,315],{"class":173},"WithMargins",[68,317,208],{"class":74},[68,319,320],{"class":186},"document",[68,322,202],{"class":74},[68,324,325],{"class":173},"UniformEdges",[68,327,208],{"class":74},[68,329,320],{"class":186},[68,331,202],{"class":74},[68,333,334],{"class":173},"Mm",[68,336,208],{"class":74},[68,338,340],{"class":339},"sbssI","20",[68,342,343],{"class":74},"))),\n",[68,345,347,349,351,354,356,358,361,363,365,368],{"class":70,"line":346},21,[68,348,288],{"class":186},[68,350,202],{"class":74},[68,352,353],{"class":173},"WithFont",[68,355,208],{"class":74},[68,357,211],{"class":74},[68,359,360],{"class":214},"NotoSansJP",[68,362,211],{"class":74},[68,364,190],{"class":74},[68,366,367],{"class":186}," font",[68,369,305],{"class":74},[68,371,373,375,377,380,382,384,386,388,390,393],{"class":70,"line":372},22,[68,374,288],{"class":186},[68,376,202],{"class":74},[68,378,379],{"class":173},"WithDefaultFont",[68,381,208],{"class":74},[68,383,211],{"class":74},[68,385,360],{"class":214},[68,387,211],{"class":74},[68,389,190],{"class":74},[68,391,392],{"class":339}," 12",[68,394,305],{"class":74},[68,396,398],{"class":70,"line":397},23,[68,399,400],{"class":74},"    )\n",[68,402,404],{"class":70,"line":403},24,[68,405,86],{"emptyLinePlaceholder":85},[68,407,409,412,414,417,419,422],{"class":70,"line":408},25,[68,410,411],{"class":186},"    page ",[68,413,196],{"class":74},[68,415,416],{"class":186}," doc",[68,418,202],{"class":74},[68,420,421],{"class":173},"AddPage",[68,423,424],{"class":74},"()\n",[68,426,428,431,433,436,439,443,446,449,451,454,457],{"class":70,"line":427},26,[68,429,430],{"class":186},"    page",[68,432,202],{"class":74},[68,434,435],{"class":173},"AutoRow",[68,437,438],{"class":74},"(func(",[68,440,442],{"class":441},"sHdIc","r",[68,444,445],{"class":74}," *",[68,447,448],{"class":78},"template",[68,450,202],{"class":74},[68,452,453],{"class":78},"RowBuilder",[68,455,456],{"class":74},")",[68,458,180],{"class":74},[68,460,462,465,467,470,472,475,477,480,483,485,487,489,492,494],{"class":70,"line":461},27,[68,463,464],{"class":186},"        r",[68,466,202],{"class":74},[68,468,469],{"class":173},"Col",[68,471,208],{"class":74},[68,473,474],{"class":339},"12",[68,476,190],{"class":74},[68,478,479],{"class":74}," func(",[68,481,482],{"class":441},"c",[68,484,445],{"class":74},[68,486,448],{"class":78},[68,488,202],{"class":74},[68,490,491],{"class":78},"ColBuilder",[68,493,456],{"class":74},[68,495,180],{"class":74},[68,497,499,502,504,507,509,511,514,516,518,521,523,526,528,531,534,536,538,541],{"class":70,"line":498},28,[68,500,501],{"class":186},"            c",[68,503,202],{"class":74},[68,505,506],{"class":173},"Text",[68,508,208],{"class":74},[68,510,211],{"class":74},[68,512,513],{"class":214},"こんにちは、世界。",[68,515,211],{"class":74},[68,517,190],{"class":74},[68,519,520],{"class":186}," template",[68,522,202],{"class":74},[68,524,525],{"class":173},"FontSize",[68,527,208],{"class":74},[68,529,530],{"class":339},"24",[68,532,533],{"class":74},"),",[68,535,520],{"class":186},[68,537,202],{"class":74},[68,539,540],{"class":173},"Bold",[68,542,543],{"class":74},"())\n",[68,545,547,549,551,553,555,557,560,562],{"class":70,"line":546},29,[68,548,501],{"class":186},[68,550,202],{"class":74},[68,552,506],{"class":173},[68,554,208],{"class":74},[68,556,211],{"class":74},[68,558,559],{"class":214},"日本語 PDF、これだけ。",[68,561,211],{"class":74},[68,563,159],{"class":74},[68,565,567],{"class":70,"line":566},30,[68,568,569],{"class":74},"        })\n",[68,571,573],{"class":70,"line":572},31,[68,574,575],{"class":74},"    })\n",[68,577,579],{"class":70,"line":578},32,[68,580,86],{"emptyLinePlaceholder":85},[68,582,584,587,589,591,593,595,597,600],{"class":70,"line":583},33,[68,585,586],{"class":186},"    data",[68,588,190],{"class":74},[68,590,193],{"class":186},[68,592,196],{"class":74},[68,594,416],{"class":186},[68,596,202],{"class":74},[68,598,599],{"class":173},"Generate",[68,601,424],{"class":74},[68,603,605,607,609,611,613],{"class":70,"line":604},34,[68,606,225],{"class":92},[68,608,193],{"class":186},[68,610,230],{"class":74},[68,612,233],{"class":74},[68,614,180],{"class":74},[68,616,618,620,622,624,626,628],{"class":70,"line":617},35,[68,619,241],{"class":186},[68,621,202],{"class":74},[68,623,246],{"class":173},[68,625,208],{"class":74},[68,627,251],{"class":186},[68,629,159],{"class":74},[68,631,633],{"class":70,"line":632},36,[68,634,259],{"class":74},[68,636,638,640,642,644,646,648,651,653,655,658,660,662,665,667,670,673,675,677,679],{"class":70,"line":637},37,[68,639,225],{"class":92},[68,641,193],{"class":186},[68,643,196],{"class":74},[68,645,199],{"class":186},[68,647,202],{"class":74},[68,649,650],{"class":173},"WriteFile",[68,652,208],{"class":74},[68,654,211],{"class":74},[68,656,657],{"class":214},"hello.pdf",[68,659,211],{"class":74},[68,661,190],{"class":74},[68,663,664],{"class":186}," data",[68,666,190],{"class":74},[68,668,669],{"class":339}," 0o644",[68,671,672],{"class":74},");",[68,674,193],{"class":186},[68,676,230],{"class":74},[68,678,233],{"class":74},[68,680,180],{"class":74},[68,682,684,686,688,690,692,694],{"class":70,"line":683},38,[68,685,241],{"class":186},[68,687,202],{"class":74},[68,689,246],{"class":173},[68,691,208],{"class":74},[68,693,251],{"class":186},[68,695,159],{"class":74},[68,697,699],{"class":70,"line":698},39,[68,700,259],{"class":74},[68,702,704],{"class":70,"line":703},40,[68,705,706],{"class":74},"}\n",[18,708,709,710,712,713,718,719,722,723,726],{},"Baixe ",[30,711,215],{}," no ",[22,714,717],{"href":715,"rel":716},"https://fonts.google.com/noto/specimen/Noto+Sans+JP",[26],"Google Fonts",", coloque ao lado de ",[30,720,721],{},"main.go"," e rode ",[30,724,725],{},"go run main.go",". Sai um PDF de uma página com texto japonês.",[13,728,730],{"id":729},"o-que-essas-três-linhas-fazem-por-baixo","O que essas três linhas fazem por baixo",[18,732,733],{},"Duas coisas acontecem nos bastidores, e nenhuma delas exige sua intervenção.",[18,735,736,739],{},[50,737,738],{},"Subset embedding."," A Noto Sans JP traz cerca de 17.000 glifos — o peso Regular ocupa uns 5 MB em disco. Se você embutisse a fonte inteira, um recibo com quatro linhas de japonês custaria cinco megabytes em dados tipográficos. O gpdf percorre o texto renderizado, identifica quais IDs de glifo você usou e grava apenas esse subconjunto no PDF. Uma nota curta costuma acabar com 20–40 KB de dados de fonte, não 5 MB.",[18,741,742,743,745,746,749],{},"O gofpdf também sabia fazer subset, mas o ",[30,744,32],{}," exigia caminho de arquivo e flag UTF-8, com o carregamento ocorrendo enquanto o cursor se movia; trocar de fonte no meio do documento ficava desconfortável. O gpdf registra a fonte uma vez na construção do documento; dali em diante cada ",[30,747,748],{},"c.Text"," só a referencia pelo nome de família. Não há preparação por chamada.",[18,751,752,755,756,759,760,763],{},[50,753,754],{},"Sem CGO."," Isso pesa mais do que parece. Em outros ecossistemas o tratamento de fontes passa por FreeType ou HarfBuzz — o que significa dependência em C, caches de build invalidando diferente, camadas extras nas imagens Docker e cross-compile de macOS para ",[30,757,758],{},"linux/arm64"," deixando de ser trivial. O gpdf faz o parsing das tabelas TrueType em Go puro. ",[30,761,762],{},"go build"," continua produzindo um binário estático. Empacote num container distroless o binário Go e o TTF; é só disso que você precisa.",[13,765,767],{"id":766},"variantes-bold-e-italic","Variantes Bold e Italic",[18,769,770,771,774,775,778],{},"As famílias Noto japonesas entregam um arquivo por peso. Para usar ",[50,772,773],{},"negrito",", registre o TTF Bold com o sufixo ",[30,776,777],{},"-Bold",":",[59,780,782],{"className":61,"code":781,"language":63,"meta":64,"style":64},"reg, _ := os.ReadFile(\"NotoSansJP-Regular.ttf\")\nbold, _ := os.ReadFile(\"NotoSansJP-Bold.ttf\")\n\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"NotoSansJP\", reg),\n    gpdf.WithFont(\"NotoSansJP-Bold\", bold),\n    gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n)\n",[30,783,784,812,840,844,859,883,907,929],{"__ignoreMap":64},[68,785,786,789,791,794,796,798,800,802,804,806,808,810],{"class":70,"line":71},[68,787,788],{"class":186},"reg",[68,790,190],{"class":74},[68,792,793],{"class":186}," _ ",[68,795,196],{"class":74},[68,797,199],{"class":186},[68,799,202],{"class":74},[68,801,205],{"class":173},[68,803,208],{"class":74},[68,805,211],{"class":74},[68,807,215],{"class":214},[68,809,211],{"class":74},[68,811,159],{"class":74},[68,813,814,817,819,821,823,825,827,829,831,833,836,838],{"class":70,"line":82},[68,815,816],{"class":186},"bold",[68,818,190],{"class":74},[68,820,793],{"class":186},[68,822,196],{"class":74},[68,824,199],{"class":186},[68,826,202],{"class":74},[68,828,205],{"class":173},[68,830,208],{"class":74},[68,832,211],{"class":74},[68,834,835],{"class":214},"NotoSansJP-Bold.ttf",[68,837,211],{"class":74},[68,839,159],{"class":74},[68,841,842],{"class":70,"line":89},[68,843,86],{"emptyLinePlaceholder":85},[68,845,846,849,851,853,855,857],{"class":70,"line":99},[68,847,848],{"class":186},"doc ",[68,850,196],{"class":74},[68,852,275],{"class":186},[68,854,202],{"class":74},[68,856,47],{"class":173},[68,858,282],{"class":74},[68,860,861,864,866,868,870,872,874,876,878,881],{"class":70,"line":111},[68,862,863],{"class":186},"    gpdf",[68,865,202],{"class":74},[68,867,353],{"class":173},[68,869,208],{"class":74},[68,871,211],{"class":74},[68,873,360],{"class":214},[68,875,211],{"class":74},[68,877,190],{"class":74},[68,879,880],{"class":186}," reg",[68,882,305],{"class":74},[68,884,885,887,889,891,893,895,898,900,902,905],{"class":70,"line":121},[68,886,863],{"class":186},[68,888,202],{"class":74},[68,890,353],{"class":173},[68,892,208],{"class":74},[68,894,211],{"class":74},[68,896,897],{"class":214},"NotoSansJP-Bold",[68,899,211],{"class":74},[68,901,190],{"class":74},[68,903,904],{"class":186}," bold",[68,906,305],{"class":74},[68,908,909,911,913,915,917,919,921,923,925,927],{"class":70,"line":126},[68,910,863],{"class":186},[68,912,202],{"class":74},[68,914,379],{"class":173},[68,916,208],{"class":74},[68,918,211],{"class":74},[68,920,360],{"class":214},[68,922,211],{"class":74},[68,924,190],{"class":74},[68,926,392],{"class":339},[68,928,305],{"class":74},[68,930,931],{"class":70,"line":136},[68,932,159],{"class":74},[18,934,935,936,939,940,942,943,946,947,950],{},"Agora ",[30,937,938],{},"template.Bold()"," pega a variante ",[30,941,777],{},". Mesma convenção para ",[30,944,945],{},"-Italic"," e ",[30,948,949],{},"-BoldItalic",". Sem registrar a variante, o negrito cai num peso sintetizado — legível na tela, mas não tipograficamente honesto. Em faturas de produção (NFSe, DANFE), registre o peso real.",[13,952,954],{"id":953},"múltiplos-idiomas-cjk-no-mesmo-documento","Múltiplos idiomas CJK no mesmo documento",[18,956,957,958,778],{},"Pode registrar quantas famílias quiser — o gpdf gerencia cada uma de forma independente. Alterne por texto com ",[30,959,960],{},"template.FontFamily(...)",[59,962,964],{"className":61,"code":963,"language":63,"meta":64,"style":64},"jp, _ := os.ReadFile(\"NotoSansJP-Regular.ttf\")\nsc, _ := os.ReadFile(\"NotoSansSC-Regular.ttf\")\nkr, _ := os.ReadFile(\"NotoSansKR-Regular.ttf\")\n\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"NotoSansJP\", jp),\n    gpdf.WithFont(\"NotoSansSC\", sc),\n    gpdf.WithFont(\"NotoSansKR\", kr),\n    gpdf.WithDefaultFont(\"NotoSansJP\", 12),\n)\n\npage.AutoRow(func(r *template.RowBuilder) {\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"日本語\")\n    })\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"中文\", template.FontFamily(\"NotoSansSC\"))\n    })\n    r.Col(4, func(c *template.ColBuilder) {\n        c.Text(\"한국어\", template.FontFamily(\"NotoSansKR\"))\n    })\n})\n",[30,965,966,993,1021,1049,1053,1067,1090,1114,1138,1160,1164,1168,1193,1225,1245,1249,1279,1316,1320,1350,1385,1389],{"__ignoreMap":64},[68,967,968,971,973,975,977,979,981,983,985,987,989,991],{"class":70,"line":71},[68,969,970],{"class":186},"jp",[68,972,190],{"class":74},[68,974,793],{"class":186},[68,976,196],{"class":74},[68,978,199],{"class":186},[68,980,202],{"class":74},[68,982,205],{"class":173},[68,984,208],{"class":74},[68,986,211],{"class":74},[68,988,215],{"class":214},[68,990,211],{"class":74},[68,992,159],{"class":74},[68,994,995,998,1000,1002,1004,1006,1008,1010,1012,1014,1017,1019],{"class":70,"line":82},[68,996,997],{"class":186},"sc",[68,999,190],{"class":74},[68,1001,793],{"class":186},[68,1003,196],{"class":74},[68,1005,199],{"class":186},[68,1007,202],{"class":74},[68,1009,205],{"class":173},[68,1011,208],{"class":74},[68,1013,211],{"class":74},[68,1015,1016],{"class":214},"NotoSansSC-Regular.ttf",[68,1018,211],{"class":74},[68,1020,159],{"class":74},[68,1022,1023,1026,1028,1030,1032,1034,1036,1038,1040,1042,1045,1047],{"class":70,"line":89},[68,1024,1025],{"class":186},"kr",[68,1027,190],{"class":74},[68,1029,793],{"class":186},[68,1031,196],{"class":74},[68,1033,199],{"class":186},[68,1035,202],{"class":74},[68,1037,205],{"class":173},[68,1039,208],{"class":74},[68,1041,211],{"class":74},[68,1043,1044],{"class":214},"NotoSansKR-Regular.ttf",[68,1046,211],{"class":74},[68,1048,159],{"class":74},[68,1050,1051],{"class":70,"line":99},[68,1052,86],{"emptyLinePlaceholder":85},[68,1054,1055,1057,1059,1061,1063,1065],{"class":70,"line":111},[68,1056,848],{"class":186},[68,1058,196],{"class":74},[68,1060,275],{"class":186},[68,1062,202],{"class":74},[68,1064,47],{"class":173},[68,1066,282],{"class":74},[68,1068,1069,1071,1073,1075,1077,1079,1081,1083,1085,1088],{"class":70,"line":121},[68,1070,863],{"class":186},[68,1072,202],{"class":74},[68,1074,353],{"class":173},[68,1076,208],{"class":74},[68,1078,211],{"class":74},[68,1080,360],{"class":214},[68,1082,211],{"class":74},[68,1084,190],{"class":74},[68,1086,1087],{"class":186}," jp",[68,1089,305],{"class":74},[68,1091,1092,1094,1096,1098,1100,1102,1105,1107,1109,1112],{"class":70,"line":126},[68,1093,863],{"class":186},[68,1095,202],{"class":74},[68,1097,353],{"class":173},[68,1099,208],{"class":74},[68,1101,211],{"class":74},[68,1103,1104],{"class":214},"NotoSansSC",[68,1106,211],{"class":74},[68,1108,190],{"class":74},[68,1110,1111],{"class":186}," sc",[68,1113,305],{"class":74},[68,1115,1116,1118,1120,1122,1124,1126,1129,1131,1133,1136],{"class":70,"line":136},[68,1117,863],{"class":186},[68,1119,202],{"class":74},[68,1121,353],{"class":173},[68,1123,208],{"class":74},[68,1125,211],{"class":74},[68,1127,1128],{"class":214},"NotoSansKR",[68,1130,211],{"class":74},[68,1132,190],{"class":74},[68,1134,1135],{"class":186}," kr",[68,1137,305],{"class":74},[68,1139,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158],{"class":70,"line":146},[68,1141,863],{"class":186},[68,1143,202],{"class":74},[68,1145,379],{"class":173},[68,1147,208],{"class":74},[68,1149,211],{"class":74},[68,1151,360],{"class":214},[68,1153,211],{"class":74},[68,1155,190],{"class":74},[68,1157,392],{"class":339},[68,1159,305],{"class":74},[68,1161,1162],{"class":70,"line":156},[68,1163,159],{"class":74},[68,1165,1166],{"class":70,"line":162},[68,1167,86],{"emptyLinePlaceholder":85},[68,1169,1170,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191],{"class":70,"line":167},[68,1171,1172],{"class":186},"page",[68,1174,202],{"class":74},[68,1176,435],{"class":173},[68,1178,438],{"class":74},[68,1180,442],{"class":441},[68,1182,445],{"class":74},[68,1184,448],{"class":78},[68,1186,202],{"class":74},[68,1188,453],{"class":78},[68,1190,456],{"class":74},[68,1192,180],{"class":74},[68,1194,1195,1198,1200,1202,1204,1207,1209,1211,1213,1215,1217,1219,1221,1223],{"class":70,"line":183},[68,1196,1197],{"class":186},"    r",[68,1199,202],{"class":74},[68,1201,469],{"class":173},[68,1203,208],{"class":74},[68,1205,1206],{"class":339},"4",[68,1208,190],{"class":74},[68,1210,479],{"class":74},[68,1212,482],{"class":441},[68,1214,445],{"class":74},[68,1216,448],{"class":78},[68,1218,202],{"class":74},[68,1220,491],{"class":78},[68,1222,456],{"class":74},[68,1224,180],{"class":74},[68,1226,1227,1230,1232,1234,1236,1238,1241,1243],{"class":70,"line":222},[68,1228,1229],{"class":186},"        c",[68,1231,202],{"class":74},[68,1233,506],{"class":173},[68,1235,208],{"class":74},[68,1237,211],{"class":74},[68,1239,1240],{"class":214},"日本語",[68,1242,211],{"class":74},[68,1244,159],{"class":74},[68,1246,1247],{"class":70,"line":238},[68,1248,575],{"class":74},[68,1250,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277],{"class":70,"line":256},[68,1252,1197],{"class":186},[68,1254,202],{"class":74},[68,1256,469],{"class":173},[68,1258,208],{"class":74},[68,1260,1206],{"class":339},[68,1262,190],{"class":74},[68,1264,479],{"class":74},[68,1266,482],{"class":441},[68,1268,445],{"class":74},[68,1270,448],{"class":78},[68,1272,202],{"class":74},[68,1274,491],{"class":78},[68,1276,456],{"class":74},[68,1278,180],{"class":74},[68,1280,1281,1283,1285,1287,1289,1291,1294,1296,1298,1300,1302,1305,1307,1309,1311,1313],{"class":70,"line":262},[68,1282,1229],{"class":186},[68,1284,202],{"class":74},[68,1286,506],{"class":173},[68,1288,208],{"class":74},[68,1290,211],{"class":74},[68,1292,1293],{"class":214},"中文",[68,1295,211],{"class":74},[68,1297,190],{"class":74},[68,1299,520],{"class":186},[68,1301,202],{"class":74},[68,1303,1304],{"class":173},"FontFamily",[68,1306,208],{"class":74},[68,1308,211],{"class":74},[68,1310,1104],{"class":214},[68,1312,211],{"class":74},[68,1314,1315],{"class":74},"))\n",[68,1317,1318],{"class":70,"line":267},[68,1319,575],{"class":74},[68,1321,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348],{"class":70,"line":285},[68,1323,1197],{"class":186},[68,1325,202],{"class":74},[68,1327,469],{"class":173},[68,1329,208],{"class":74},[68,1331,1206],{"class":339},[68,1333,190],{"class":74},[68,1335,479],{"class":74},[68,1337,482],{"class":441},[68,1339,445],{"class":74},[68,1341,448],{"class":78},[68,1343,202],{"class":74},[68,1345,491],{"class":78},[68,1347,456],{"class":74},[68,1349,180],{"class":74},[68,1351,1352,1354,1356,1358,1360,1362,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383],{"class":70,"line":308},[68,1353,1229],{"class":186},[68,1355,202],{"class":74},[68,1357,506],{"class":173},[68,1359,208],{"class":74},[68,1361,211],{"class":74},[68,1363,1364],{"class":214},"한국어",[68,1366,211],{"class":74},[68,1368,190],{"class":74},[68,1370,520],{"class":186},[68,1372,202],{"class":74},[68,1374,1304],{"class":173},[68,1376,208],{"class":74},[68,1378,211],{"class":74},[68,1380,1128],{"class":214},[68,1382,211],{"class":74},[68,1384,1315],{"class":74},[68,1386,1387],{"class":70,"line":346},[68,1388,575],{"class":74},[68,1390,1391],{"class":70,"line":372},[68,1392,1393],{"class":74},"})\n",[18,1395,1396,1397,1400],{},"A unificação Han faz com que o japonês e o chinês simplificado compartilhem codepoints Unicode, mas os glifos são desenhados diferente. ",[50,1398,1399],{},"O mesmo codepoint renderiza com formato diferente dependendo da fonte"," — escolher fonte não é estética, é correção. Se você gera documentos para ambos os mercados, precisa das duas famílias registradas.",[13,1402,1404],{"id":1403},"a-armadilha-do-tofu","A armadilha do tofu",[18,1406,1407,1408,1410],{},"Se você escreve japonês mas esquece o ",[30,1409,353],{},", o gpdf cai nas fontes Base-14 do PDF — nenhuma delas cobre o range CJK. Os caracteres saem como retângulos vazios, o que o mundo Unicode chama de \"caixas tofu\":",[59,1412,1417],{"className":1413,"code":1415,"language":1416},[1414],"language-text","□□□□□、□□。\n","text",[30,1418,1415],{"__ignoreMap":64},[18,1420,1421,1422,1424,1425,1427,1428,712,1431,202],{},"Se ver isso na saída, a causa é sempre a mesma: não registrou uma fonte CJK, ou está escrevendo numa família que não inclui esses glifos. A correção também: adicione ",[30,1423,353],{}," e use ",[30,1426,379],{},", ou passe ",[30,1429,1430],{},"template.FontFamily",[30,1432,748],{},[13,1434,1436],{"id":1435},"leitura-relacionada","Leitura relacionada",[1438,1439,1440,1451,1458],"ul",{},[1441,1442,1443,1447,1448],"li",{},[22,1444,1446],{"href":1445},"/pt/blog/gofpdf-migration","gofpdf foi arquivado. Como migrar para o gpdf."," — o mapa completo se você vem do ",[30,1449,1450],{},"pdf.AddUTF8Font",[1441,1452,1453,1457],{},[22,1454,1456],{"href":1455},"/pt/blog/go-pdf-library-showdown-2026","Go PDF Library Showdown 2026"," — como o gpdf se compara a gofpdf, gopdf, Maroto e unipdf em CJK",[1441,1459,1460,1465,1466,1468],{},[22,1461,1464],{"href":1462,"rel":1463},"https://gpdf.dev/pt/docs/guide/fonts",[26],"Guia de fontes"," — referência completa de ",[30,1467,353],{}," e regras de nomeação de variantes",[13,1470,1472],{"id":1471},"experimente-o-gpdf","Experimente o gpdf",[18,1474,1475],{},"O gpdf é uma biblioteca Go para gerar PDFs. Licença MIT, zero dependências externas, suporte CJK nativo.",[59,1477,1481],{"className":1478,"code":1479,"language":1480,"meta":64,"style":64},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[30,1482,1483],{"__ignoreMap":64},[68,1484,1485,1487,1490],{"class":70,"line":71},[68,1486,63],{"class":78},[68,1488,1489],{"class":214}," get",[68,1491,1492],{"class":214}," github.com/gpdf-dev/gpdf\n",[18,1494,1495,1499,1500],{},[22,1496,1498],{"href":24,"rel":1497},[26],"⭐ Star no GitHub"," · ",[22,1501,1504],{"href":1502,"rel":1503},"https://gpdf.dev/pt/docs/quickstart",[26],"Ler a documentação",[1506,1507,1508],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":64,"searchDepth":82,"depth":82,"links":1510},[1511,1512,1513,1514,1515,1516,1517,1518,1519],{"id":15,"depth":82,"text":16},{"id":36,"depth":82,"text":37},{"id":56,"depth":82,"text":57},{"id":729,"depth":82,"text":730},{"id":766,"depth":82,"text":767},{"id":953,"depth":82,"text":954},{"id":1403,"depth":82,"text":1404},{"id":1435,"depth":82,"text":1436},{"id":1471,"depth":82,"text":1472},"2026-04-15","Passe os bytes do TTF para gpdf.WithFont ao construir o documento. Três linhas, subset embedding automático e sem CGO.",false,"md",{"name":1525,"totalTime":1526,"tools":1527,"steps":1530},"Incorporar uma fonte TrueType japonesa em um documento gpdf","PT10M",[1528,1529],"Go 1.22+","NotoSansJP-Regular.ttf (ou qualquer TTF com suporte a CJK)",[1531,1534,1537,1540],{"name":1532,"text":1533},"Leia os bytes do TTF","No início do programa, use os.ReadFile para carregar NotoSansJP-Regular.ttf em um []byte. Se preferir embutir a fonte no binário, use //go:embed.",{"name":1535,"text":1536},"Registre a fonte na construção do documento","Passe gpdf.WithFont(\"NotoSansJP\", fontBytes) para gpdf.NewDocument. O nome da família é livre — use o mesmo identificador ao referenciar depois. O gpdf faz o subset dos glifos em tempo de renderização.",{"name":1538,"text":1539},"Defina-a como fonte padrão","Adicione gpdf.WithDefaultFont(\"NotoSansJP\", 12) para que cada c.Text use automaticamente a fonte japonesa sem precisar passar FontFamily.",{"name":1541,"text":1542},"Escreva texto japonês e gere o PDF","Dentro de uma coluna, chame c.Text(\"こんにちは、世界。\"). doc.Generate() retorna []byte, que você grava em disco com os.WriteFile.",null,{},"/pt/blog/embed-japanese-font",{"title":5,"description":1521},"pt/blog/003.embed-japanese-font",[1549,1550,1551],"recipe","cjk","tutorial","5j8iEKg_ZlYMYdzk_y9xRmW9AomIXrL_MU4Z5TQSv7o",1776529276132]