[{"data":1,"prerenderedAt":1326},["ShallowReactive",2],{"blog-pt-source-han-sans-jp-with-gpdf":3},{"id":4,"title":5,"author":6,"body":9,"date":1290,"description":1291,"draft":1292,"extension":1293,"howTo":1294,"image":1316,"meta":1317,"navigation":87,"path":1318,"seo":1319,"stem":1320,"tags":1321,"updated":1316,"__hash__":1325},"blogPt/pt/blog/010.source-han-sans-jp-with-gpdf.md","Como usar Source Han Sans JP no gpdf?",{"name":7,"url":8},"gpdf team","https://gpdf.dev",{"type":10,"value":11,"toc":1278},"minimark",[12,17,34,38,56,60,709,722,726,737,740,825,836,840,875,882,906,915,919,922,930,933,1088,1102,1105,1109,1112,1149,1163,1167,1170,1184,1187,1202,1205,1209,1238,1242,1245,1262,1274],[13,14,16],"h2",{"id":15},"a-pergunta-em-outras-palavras","A pergunta, em outras palavras",[18,19,20,21,25,26,33],"p",{},"Você quer usar ",[22,23,24],"strong",{},"Source Han Sans JP"," — a sans-serif pan-CJK open source da Adobe, lançada em 2014 como resultado da parceria Adobe–Google — em um documento ",[27,28,32],"a",{"href":29,"rel":30},"https://github.com/gpdf-dev/gpdf",[31],"nofollow","gpdf",". Talvez seu time prefira fixar fontes em tags de release do GitHub pela reprodutibilidade, talvez você tenha herdado um design system que se padronizou em Source Han anos atrás, talvez o ciclo de releases da Adobe seja mais conveniente. Qualquer motivo serve. Antes de baixar qualquer coisa, vale deixar três coisas claras: qual arquivo pegar, qual é a relação real com Noto Sans JP e qual formato o gpdf consegue ler.",[13,35,37],{"id":36},"tldr","TL;DR",[18,39,40,41,45,46,51,52,55],{},"Baixe ",[42,43,44],"code",{},"SourceHanSansJP-Regular.ttf"," na ",[27,47,50],{"href":48,"rel":49},"https://github.com/adobe-fonts/source-han-sans/releases",[31],"página de releases de adobe-fonts/source-han-sans"," (o pacote TTF, não o OTF padrão), passe para ",[42,53,54],{},"gpdf.WithFont(\"SourceHanSansJP\", bytes)"," e defina como fonte padrão. Source Han Sans JP e Noto Sans JP compartilham os mesmos contornos de glifo — se a história de tooling da Adobe não importa para você, Noto é um download mais simples.",[13,57,59],{"id":58},"o-exemplo-completo","O exemplo completo",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"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(\"SourceHanSansJP-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(\"SourceHanSansJP\", font),\n        gpdf.WithDefaultFont(\"SourceHanSansJP\", 11),\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(\"Source Han Sans JP — fonte CJK gratuita distribuída pela Adobe.\")\n        })\n    })\n\n    data, err := doc.Generate()\n    if err != nil {\n        log.Fatal(err)\n    }\n    if err := os.WriteFile(\"report.pdf\", data, 0o644); err != nil {\n        log.Fatal(err)\n    }\n}\n","go","",[42,68,69,82,89,99,111,121,126,136,146,156,162,167,183,221,237,255,261,266,285,308,346,372,397,403,408,427,461,498,546,566,572,578,583,604,617,632,637,683,698,703],{"__ignoreMap":66},[70,71,74,78],"span",{"class":72,"line":73},"line",1,[70,75,77],{"class":76},"sMK4o","package",[70,79,81],{"class":80},"sBMFI"," main\n",[70,83,85],{"class":72,"line":84},2,[70,86,88],{"emptyLinePlaceholder":87},true,"\n",[70,90,92,96],{"class":72,"line":91},3,[70,93,95],{"class":94},"s7zQu","import",[70,97,98],{"class":76}," (\n",[70,100,102,105,108],{"class":72,"line":101},4,[70,103,104],{"class":76},"    \"",[70,106,107],{"class":80},"log",[70,109,110],{"class":76},"\"\n",[70,112,114,116,119],{"class":72,"line":113},5,[70,115,104],{"class":76},[70,117,118],{"class":80},"os",[70,120,110],{"class":76},[70,122,124],{"class":72,"line":123},6,[70,125,88],{"emptyLinePlaceholder":87},[70,127,129,131,134],{"class":72,"line":128},7,[70,130,104],{"class":76},[70,132,133],{"class":80},"github.com/gpdf-dev/gpdf",[70,135,110],{"class":76},[70,137,139,141,144],{"class":72,"line":138},8,[70,140,104],{"class":76},[70,142,143],{"class":80},"github.com/gpdf-dev/gpdf/document",[70,145,110],{"class":76},[70,147,149,151,154],{"class":72,"line":148},9,[70,150,104],{"class":76},[70,152,153],{"class":80},"github.com/gpdf-dev/gpdf/template",[70,155,110],{"class":76},[70,157,159],{"class":72,"line":158},10,[70,160,161],{"class":76},")\n",[70,163,165],{"class":72,"line":164},11,[70,166,88],{"emptyLinePlaceholder":87},[70,168,170,173,177,180],{"class":72,"line":169},12,[70,171,172],{"class":76},"func",[70,174,176],{"class":175},"s2Zo4"," main",[70,178,179],{"class":76},"()",[70,181,182],{"class":76}," {\n",[70,184,186,190,193,196,199,202,205,208,211,214,217,219],{"class":72,"line":185},13,[70,187,189],{"class":188},"sTEyZ","    font",[70,191,192],{"class":76},",",[70,194,195],{"class":188}," err ",[70,197,198],{"class":76},":=",[70,200,201],{"class":188}," os",[70,203,204],{"class":76},".",[70,206,207],{"class":175},"ReadFile",[70,209,210],{"class":76},"(",[70,212,213],{"class":76},"\"",[70,215,44],{"class":216},"sfazB",[70,218,213],{"class":76},[70,220,161],{"class":76},[70,222,224,227,229,232,235],{"class":72,"line":223},14,[70,225,226],{"class":94},"    if",[70,228,195],{"class":188},[70,230,231],{"class":76},"!=",[70,233,234],{"class":76}," nil",[70,236,182],{"class":76},[70,238,240,243,245,248,250,253],{"class":72,"line":239},15,[70,241,242],{"class":188},"        log",[70,244,204],{"class":76},[70,246,247],{"class":175},"Fatal",[70,249,210],{"class":76},[70,251,252],{"class":188},"err",[70,254,161],{"class":76},[70,256,258],{"class":72,"line":257},16,[70,259,260],{"class":76},"    }\n",[70,262,264],{"class":72,"line":263},17,[70,265,88],{"emptyLinePlaceholder":87},[70,267,269,272,274,277,279,282],{"class":72,"line":268},18,[70,270,271],{"class":188},"    doc ",[70,273,198],{"class":76},[70,275,276],{"class":188}," gpdf",[70,278,204],{"class":76},[70,280,281],{"class":175},"NewDocument",[70,283,284],{"class":76},"(\n",[70,286,288,291,293,296,298,300,302,305],{"class":72,"line":287},19,[70,289,290],{"class":188},"        gpdf",[70,292,204],{"class":76},[70,294,295],{"class":175},"WithPageSize",[70,297,210],{"class":76},[70,299,32],{"class":188},[70,301,204],{"class":76},[70,303,304],{"class":188},"A4",[70,306,307],{"class":76},"),\n",[70,309,311,313,315,318,320,323,325,328,330,332,334,337,339,343],{"class":72,"line":310},20,[70,312,290],{"class":188},[70,314,204],{"class":76},[70,316,317],{"class":175},"WithMargins",[70,319,210],{"class":76},[70,321,322],{"class":188},"document",[70,324,204],{"class":76},[70,326,327],{"class":175},"UniformEdges",[70,329,210],{"class":76},[70,331,322],{"class":188},[70,333,204],{"class":76},[70,335,336],{"class":175},"Mm",[70,338,210],{"class":76},[70,340,342],{"class":341},"sbssI","20",[70,344,345],{"class":76},"))),\n",[70,347,349,351,353,356,358,360,363,365,367,370],{"class":72,"line":348},21,[70,350,290],{"class":188},[70,352,204],{"class":76},[70,354,355],{"class":175},"WithFont",[70,357,210],{"class":76},[70,359,213],{"class":76},[70,361,362],{"class":216},"SourceHanSansJP",[70,364,213],{"class":76},[70,366,192],{"class":76},[70,368,369],{"class":188}," font",[70,371,307],{"class":76},[70,373,375,377,379,382,384,386,388,390,392,395],{"class":72,"line":374},22,[70,376,290],{"class":188},[70,378,204],{"class":76},[70,380,381],{"class":175},"WithDefaultFont",[70,383,210],{"class":76},[70,385,213],{"class":76},[70,387,362],{"class":216},[70,389,213],{"class":76},[70,391,192],{"class":76},[70,393,394],{"class":341}," 11",[70,396,307],{"class":76},[70,398,400],{"class":72,"line":399},23,[70,401,402],{"class":76},"    )\n",[70,404,406],{"class":72,"line":405},24,[70,407,88],{"emptyLinePlaceholder":87},[70,409,411,414,416,419,421,424],{"class":72,"line":410},25,[70,412,413],{"class":188},"    page ",[70,415,198],{"class":76},[70,417,418],{"class":188}," doc",[70,420,204],{"class":76},[70,422,423],{"class":175},"AddPage",[70,425,426],{"class":76},"()\n",[70,428,430,433,435,438,441,445,448,451,453,456,459],{"class":72,"line":429},26,[70,431,432],{"class":188},"    page",[70,434,204],{"class":76},[70,436,437],{"class":175},"AutoRow",[70,439,440],{"class":76},"(func(",[70,442,444],{"class":443},"sHdIc","r",[70,446,447],{"class":76}," *",[70,449,450],{"class":80},"template",[70,452,204],{"class":76},[70,454,455],{"class":80},"RowBuilder",[70,457,458],{"class":76},")",[70,460,182],{"class":76},[70,462,464,467,469,472,474,477,479,482,485,487,489,491,494,496],{"class":72,"line":463},27,[70,465,466],{"class":188},"        r",[70,468,204],{"class":76},[70,470,471],{"class":175},"Col",[70,473,210],{"class":76},[70,475,476],{"class":341},"12",[70,478,192],{"class":76},[70,480,481],{"class":76}," func(",[70,483,484],{"class":443},"c",[70,486,447],{"class":76},[70,488,450],{"class":80},[70,490,204],{"class":76},[70,492,493],{"class":80},"ColBuilder",[70,495,458],{"class":76},[70,497,182],{"class":76},[70,499,501,504,506,509,511,513,516,518,520,523,525,528,530,533,536,538,540,543],{"class":72,"line":500},28,[70,502,503],{"class":188},"            c",[70,505,204],{"class":76},[70,507,508],{"class":175},"Text",[70,510,210],{"class":76},[70,512,213],{"class":76},[70,514,515],{"class":216},"報告書",[70,517,213],{"class":76},[70,519,192],{"class":76},[70,521,522],{"class":188}," template",[70,524,204],{"class":76},[70,526,527],{"class":175},"FontSize",[70,529,210],{"class":76},[70,531,532],{"class":341},"24",[70,534,535],{"class":76},"),",[70,537,522],{"class":188},[70,539,204],{"class":76},[70,541,542],{"class":175},"Bold",[70,544,545],{"class":76},"())\n",[70,547,549,551,553,555,557,559,562,564],{"class":72,"line":548},29,[70,550,503],{"class":188},[70,552,204],{"class":76},[70,554,508],{"class":175},[70,556,210],{"class":76},[70,558,213],{"class":76},[70,560,561],{"class":216},"Source Han Sans JP — fonte CJK gratuita distribuída pela Adobe.",[70,563,213],{"class":76},[70,565,161],{"class":76},[70,567,569],{"class":72,"line":568},30,[70,570,571],{"class":76},"        })\n",[70,573,575],{"class":72,"line":574},31,[70,576,577],{"class":76},"    })\n",[70,579,581],{"class":72,"line":580},32,[70,582,88],{"emptyLinePlaceholder":87},[70,584,586,589,591,593,595,597,599,602],{"class":72,"line":585},33,[70,587,588],{"class":188},"    data",[70,590,192],{"class":76},[70,592,195],{"class":188},[70,594,198],{"class":76},[70,596,418],{"class":188},[70,598,204],{"class":76},[70,600,601],{"class":175},"Generate",[70,603,426],{"class":76},[70,605,607,609,611,613,615],{"class":72,"line":606},34,[70,608,226],{"class":94},[70,610,195],{"class":188},[70,612,231],{"class":76},[70,614,234],{"class":76},[70,616,182],{"class":76},[70,618,620,622,624,626,628,630],{"class":72,"line":619},35,[70,621,242],{"class":188},[70,623,204],{"class":76},[70,625,247],{"class":175},[70,627,210],{"class":76},[70,629,252],{"class":188},[70,631,161],{"class":76},[70,633,635],{"class":72,"line":634},36,[70,636,260],{"class":76},[70,638,640,642,644,646,648,650,653,655,657,660,662,664,667,669,672,675,677,679,681],{"class":72,"line":639},37,[70,641,226],{"class":94},[70,643,195],{"class":188},[70,645,198],{"class":76},[70,647,201],{"class":188},[70,649,204],{"class":76},[70,651,652],{"class":175},"WriteFile",[70,654,210],{"class":76},[70,656,213],{"class":76},[70,658,659],{"class":216},"report.pdf",[70,661,213],{"class":76},[70,663,192],{"class":76},[70,665,666],{"class":188}," data",[70,668,192],{"class":76},[70,670,671],{"class":341}," 0o644",[70,673,674],{"class":76},");",[70,676,195],{"class":188},[70,678,231],{"class":76},[70,680,234],{"class":76},[70,682,182],{"class":76},[70,684,686,688,690,692,694,696],{"class":72,"line":685},38,[70,687,242],{"class":188},[70,689,204],{"class":76},[70,691,247],{"class":175},[70,693,210],{"class":76},[70,695,252],{"class":188},[70,697,161],{"class":76},[70,699,701],{"class":72,"line":700},39,[70,702,260],{"class":76},[70,704,706],{"class":72,"line":705},40,[70,707,708],{"class":76},"}\n",[18,710,711,712,715,716,719,720,204],{},"Coloque o TTF ao lado de ",[42,713,714],{},"main.go",", rode ",[42,717,718],{},"go run main.go"," e você terá um PDF de uma página com japonês em ",[42,721,659],{},[13,723,725],{"id":724},"source-han-sans-jp-é-noto-sans-cjk-jp","Source Han Sans JP é Noto Sans CJK JP",[18,727,728,729,732,733,736],{},"O fato que poupa horas de leitura: ",[22,730,731],{},"Source Han Sans e Noto Sans CJK são as mesmas fontes",". A Adobe fez o desenho dos glifos, as tabelas de métricas e a cobertura de caracteres. O Google tocou um canal de distribuição paralelo sob o guarda-chuva Noto. Ambos foram lançados em 2014-07-15. Os contornos, a tabela ",[42,734,735],{},"hmtx"," e a cobertura de JIS X 0213 / Adobe-Japan1-6 são idênticos, bit a bit. Quando a Adobe publica uma nova versão, as mudanças de glifo chegam ao Noto em poucas semanas.",[18,738,739],{},"A diferença está na marca e no empacotamento:",[741,742,743,757],"table",{},[744,745,746],"thead",{},[747,748,749,752,754],"tr",{},[750,751],"th",{},[750,753,24],{},[750,755,756],{},"Noto Sans JP",[758,759,760,772,792,803,814],"tbody",{},[747,761,762,766,769],{},[763,764,765],"td",{},"Publica",[763,767,768],{},"Adobe",[763,770,771],{},"Google",[747,773,774,777,784],{},[763,775,776],{},"Fonte canônica",[763,778,779],{},[27,780,783],{"href":781,"rel":782},"https://github.com/adobe-fonts/source-han-sans",[31],"adobe-fonts/source-han-sans",[763,785,786,791],{},[27,787,790],{"href":788,"rel":789},"https://notofonts.github.io",[31],"notofonts.github.io"," + Google Fonts",[747,793,794,797,800],{},[763,795,796],{},"Formato padrão",[763,798,799],{},"OTF (contornos CFF)",[763,801,802],{},"TTF (estático) + variável",[747,804,805,808,811],{},[763,806,807],{},"Modelo de release",[763,809,810],{},"Tags do GitHub, versionamento manual",[763,812,813],{},"CDN do Google Fonts + repositórios git",[747,815,816,819,822],{},[763,817,818],{},"Bundling por idioma",[763,820,821],{},"TTF por idioma + OTC pan-CJK",[763,823,824],{},"Apenas JP",[18,826,827,828,831,832,204],{},"Use Source Han Sans JP se seu time fixa fontes em tags do GitHub da Adobe, já mantém um mirror interno de ",[42,829,830],{},"github.com/adobe-fonts",", ou precisa do bundle OTC pan-CJK em outro pipeline. Use Noto Sans JP se quiser o caminho mais curto para um TTF. Esse caminho está descrito na ",[27,833,835],{"href":834},"/pt/blog/noto-sans-jp-with-gpdf","receita de Noto Sans JP",[13,837,839],{"id":838},"por-que-ttf-e-não-otf","Por que TTF, e não OTF",[18,841,842,843,846,847,850,851,854,855,854,858,854,861,863,864,867,868,871,872,874],{},"O ativo padrão da Adobe para Source Han Sans é ",[42,844,845],{},".otf"," — especificamente OpenType baseado em CFF. O parser de fontes do gpdf vive em um único arquivo (",[42,848,849],{},"pdf/font/truetype.go",") e lê ",[42,852,853],{},"glyf",", ",[42,856,857],{},"loca",[42,859,860],{},"cmap",[42,862,735],{}," e glifos compostos. Ele não lê contornos ",[42,865,866],{},"CFF "," / ",[42,869,870],{},"CFF2",". Passe um ",[42,873,845],{}," baseado em CFF e o parser rejeita o arquivo já na construção do documento, bem antes de renderizar.",[18,876,877,878,881],{},"A página de releases da Adobe publica tanto OTF quanto TTF. Pegue o ",[22,879,880],{},"pacote TTF",". Se em algum release pontual só houver OTF (acontece de vez em quando), duas alternativas limpas:",[883,884,885,892],"ol",{},[886,887,888,891],"li",{},[22,889,890],{},"Troque para Noto Sans JP."," O Google Fonts serve os TTFs estáticos direto; os dados de glifo são idênticos. Zero conversão, mesmo resultado.",[886,893,894,897,898,901,902,905],{},[22,895,896],{},"Converta uma vez e faça commit do resultado."," ",[42,899,900],{},"fonttools"," (",[42,903,904],{},"otf2ttf",") produz um TTF em um minuto. Suba o resultado para o repo ou para um artifact server interno; a conversão nunca passa pelo seu pipeline de build.",[18,907,908,909,911,912,204],{},"Evite converter em tempo de build. Ferramentas de conversão de fonte mudam de comportamento entre versões, e uma tabela ",[42,910,735],{}," ligeiramente diferente desloca suas quebras de linha depois de um simples ",[42,913,914],{},"pip install -U",[13,916,918],{"id":917},"os-sete-pesos","Os sete pesos",[18,920,921],{},"Source Han Sans JP publica de ExtraLight a Heavy, um arquivo por peso:",[61,923,928],{"className":924,"code":926,"language":927},[925],"language-text","SourceHanSansJP-ExtraLight.ttf\nSourceHanSansJP-Light.ttf\nSourceHanSansJP-Normal.ttf\nSourceHanSansJP-Regular.ttf\nSourceHanSansJP-Medium.ttf\nSourceHanSansJP-Bold.ttf\nSourceHanSansJP-Heavy.ttf\n","text",[42,929,926],{"__ignoreMap":66},[18,931,932],{},"Para a maioria dos documentos de negócio, Regular e Bold dão conta:",[61,934,936],{"className":63,"code":935,"language":65,"meta":66,"style":66},"reg,  _ := os.ReadFile(\"SourceHanSansJP-Regular.ttf\")\nbold, _ := os.ReadFile(\"SourceHanSansJP-Bold.ttf\")\n\ndoc := gpdf.NewDocument(\n    gpdf.WithFont(\"SourceHanSansJP\", reg),\n    gpdf.WithFont(\"SourceHanSansJP-Bold\", bold),\n    gpdf.WithDefaultFont(\"SourceHanSansJP\", 11),\n)\n",[42,937,938,966,995,999,1014,1038,1062,1084],{"__ignoreMap":66},[70,939,940,943,945,948,950,952,954,956,958,960,962,964],{"class":72,"line":73},[70,941,942],{"class":188},"reg",[70,944,192],{"class":76},[70,946,947],{"class":188},"  _ ",[70,949,198],{"class":76},[70,951,201],{"class":188},[70,953,204],{"class":76},[70,955,207],{"class":175},[70,957,210],{"class":76},[70,959,213],{"class":76},[70,961,44],{"class":216},[70,963,213],{"class":76},[70,965,161],{"class":76},[70,967,968,971,973,976,978,980,982,984,986,988,991,993],{"class":72,"line":84},[70,969,970],{"class":188},"bold",[70,972,192],{"class":76},[70,974,975],{"class":188}," _ ",[70,977,198],{"class":76},[70,979,201],{"class":188},[70,981,204],{"class":76},[70,983,207],{"class":175},[70,985,210],{"class":76},[70,987,213],{"class":76},[70,989,990],{"class":216},"SourceHanSansJP-Bold.ttf",[70,992,213],{"class":76},[70,994,161],{"class":76},[70,996,997],{"class":72,"line":91},[70,998,88],{"emptyLinePlaceholder":87},[70,1000,1001,1004,1006,1008,1010,1012],{"class":72,"line":101},[70,1002,1003],{"class":188},"doc ",[70,1005,198],{"class":76},[70,1007,276],{"class":188},[70,1009,204],{"class":76},[70,1011,281],{"class":175},[70,1013,284],{"class":76},[70,1015,1016,1019,1021,1023,1025,1027,1029,1031,1033,1036],{"class":72,"line":113},[70,1017,1018],{"class":188},"    gpdf",[70,1020,204],{"class":76},[70,1022,355],{"class":175},[70,1024,210],{"class":76},[70,1026,213],{"class":76},[70,1028,362],{"class":216},[70,1030,213],{"class":76},[70,1032,192],{"class":76},[70,1034,1035],{"class":188}," reg",[70,1037,307],{"class":76},[70,1039,1040,1042,1044,1046,1048,1050,1053,1055,1057,1060],{"class":72,"line":123},[70,1041,1018],{"class":188},[70,1043,204],{"class":76},[70,1045,355],{"class":175},[70,1047,210],{"class":76},[70,1049,213],{"class":76},[70,1051,1052],{"class":216},"SourceHanSansJP-Bold",[70,1054,213],{"class":76},[70,1056,192],{"class":76},[70,1058,1059],{"class":188}," bold",[70,1061,307],{"class":76},[70,1063,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082],{"class":72,"line":128},[70,1065,1018],{"class":188},[70,1067,204],{"class":76},[70,1069,381],{"class":175},[70,1071,210],{"class":76},[70,1073,213],{"class":76},[70,1075,362],{"class":216},[70,1077,213],{"class":76},[70,1079,192],{"class":76},[70,1081,394],{"class":341},[70,1083,307],{"class":76},[70,1085,1086],{"class":72,"line":138},[70,1087,161],{"class":76},[18,1089,1090,1091,1094,1095,1098,1099,1101],{},"O sufixo ",[42,1092,1093],{},"-Bold"," é o contrato que liga ",[42,1096,1097],{},"template.Bold()"," ao TTF Bold. Sem esse registro, ",[42,1100,1097],{}," cai no negrito sintetizado — um traço sobreposto sobre os glifos Regular. Legível para cabeçalhos de tabela, mas em corpos grandes fica visivelmente mais fino do que o contorno Bold real.",[18,1103,1104],{},"Fontes CJK, por convenção, não publicam variantes itálicas, e Source Han Sans JP não é exceção. Se seu layout pede ênfase itálica em uma linha em japonês, vá de peso ou cor — uma transformação oblíqua em glifos CJK parece quebrada, não ênfase.",[13,1106,1108],{"id":1107},"pan-cjk-só-jp-ou-o-super-otc","Pan-CJK, só JP, ou o Super OTC",[18,1110,1111],{},"A Adobe publica Source Han Sans em vários níveis de granularidade. Eles não são intercambiáveis para um gerador de PDF em Go:",[1113,1114,1115,1128,1138],"ul",{},[886,1116,1117,1120,1121,1124,1125,1127],{},[22,1118,1119],{},"SourceHanSans.ttc"," (Super OTC) — todos os idiomas CJK em um TrueType Collection de 20 MB+. O gpdf não seleciona o face index dentro de um ",[42,1122,1123],{},".ttc","; você teria que fatiar a face JP primeiro com ",[42,1126,900],{}," e registrar o resultado. Ignore o Super OTC.",[886,1129,1130,1133,1134,1137],{},[22,1131,1132],{},"OTF regional"," (ex.: ",[42,1135,1136],{},"SourceHanSans-Regular.otf",") — scripts CJK unificados, contornos CFF. O gpdf não lê.",[886,1139,1140,901,1143,1145,1146,1148],{},[22,1141,1142],{},"TTF por idioma",[42,1144,44],{},") — só JP, contornos ",[42,1147,853],{},". É o que você quer.",[18,1150,1151,1152,1154,1155,1158,1159,1162],{},"Se seu documento mistura japonês com coreano ou chinês na mesma página, registre famílias específicas por idioma lado a lado: ",[42,1153,362],{}," e ",[42,1156,1157],{},"SourceHanSansKR",". Troque explicitamente com ",[42,1160,1161],{},"template.FontFamily"," onde o script muda. Apelar para o OTF pan-CJK \"resolveria\" com Han unification, mas isso traz suas próprias surpresas para leitores que esperam kanji com forma JP em texto JP.",[13,1164,1166],{"id":1165},"quando-escolher-source-han-em-vez-de-noto","Quando escolher Source Han em vez de Noto",[18,1168,1169],{},"Mesmos contornos, canal de distribuição diferente. Source Han Sans JP faz sentido quando:",[1113,1171,1172,1175,1181],{},[886,1173,1174],{},"Seu time de ops prefere prender fontes a tags de release da Adobe por reprodutibilidade",[886,1176,1177,1178,1180],{},"Você já mantém mirror interno de ",[42,1179,830],{}," (comum em empresas com políticas restritas de artefatos)",[886,1182,1183],{},"O bundle OTC pan-CJK é útil em outra etapa do pipeline — um fluxo DTP, um handoff para design, um sistema de marca padronizado no nome da Adobe",[18,1185,1186],{},"Noto Sans JP é melhor quando:",[1113,1188,1189,1196,1199],{},[886,1190,1191,1192,1195],{},"Você quer o caminho mais curto para um TTF (",[42,1193,1194],{},"fonts.google.com/noto/specimen/Noto+Sans+JP"," → zip → pronto)",[886,1197,1198],{},"Não quer meter conversão OTF → TTF no seu build",[886,1200,1201],{},"Seu projeto já puxa outras Google Fonts por um workflow existente",[18,1203,1204],{},"O PDF renderizado fica igual dos dois jeitos. A decisão é operacional — onde o arquivo mora, como você versiona, como o time de ops se sente com isso — não estética.",[13,1206,1208],{"id":1207},"leituras-relacionadas","Leituras relacionadas",[1113,1210,1211,1217,1224,1231],{},[886,1212,1213,1216],{},[27,1214,1215],{"href":834},"Como usar Noto Sans JP com o gpdf?"," — os mesmos glifos, já publicados como TTF",[886,1218,1219,1223],{},[27,1220,1222],{"href":1221},"/pt/blog/embed-japanese-font","Como incorporar uma fonte japonesa no gpdf?"," — a receita geral de incorporação CJK",[886,1225,1226,1230],{},[27,1227,1229],{"href":1228},"/pt/blog/ipaex-gothic-gpdf","Como usar IPAex Gothic no gpdf?"," — a alternativa com licença IPA para envios institucionais japoneses",[886,1232,1233,1237],{},[27,1234,1236],{"href":1235},"/pt/blog/tofu-boxes-japanese","Por que meu PDF mostra retângulos no lugar de japonês?"," — troubleshooting quando os glifos não aparecem",[13,1239,1241],{"id":1240},"experimente-o-gpdf","Experimente o gpdf",[18,1243,1244],{},"gpdf é uma biblioteca Go para gerar PDFs. Licença MIT, zero dependências externas, suporte nativo a CJK.",[61,1246,1250],{"className":1247,"code":1248,"language":1249,"meta":66,"style":66},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[42,1251,1252],{"__ignoreMap":66},[70,1253,1254,1256,1259],{"class":72,"line":73},[70,1255,65],{"class":80},[70,1257,1258],{"class":216}," get",[70,1260,1261],{"class":216}," github.com/gpdf-dev/gpdf\n",[18,1263,1264,1268,1269],{},[27,1265,1267],{"href":29,"rel":1266},[31],"⭐ Star no GitHub"," · ",[27,1270,1273],{"href":1271,"rel":1272},"https://gpdf.dev/pt/docs/quickstart",[31],"Ler a documentação",[1275,1276,1277],"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":66,"searchDepth":84,"depth":84,"links":1279},[1280,1281,1282,1283,1284,1285,1286,1287,1288,1289],{"id":15,"depth":84,"text":16},{"id":36,"depth":84,"text":37},{"id":58,"depth":84,"text":59},{"id":724,"depth":84,"text":725},{"id":838,"depth":84,"text":839},{"id":917,"depth":84,"text":918},{"id":1107,"depth":84,"text":1108},{"id":1165,"depth":84,"text":1166},{"id":1207,"depth":84,"text":1208},{"id":1240,"depth":84,"text":1241},"2026-04-19","Registre a variante TTF de Source Han Sans JP do release no GitHub da Adobe com gpdf.WithFont. Sete pesos, SIL OFL, mesmos glifos que Noto Sans JP.",false,"md",{"name":1295,"totalTime":1296,"tools":1297,"steps":1300},"Usar Source Han Sans JP como fonte padrão em um documento gpdf","PT15M",[1298,1299],"Go 1.22+","SourceHanSansJP-Regular.ttf de adobe-fonts/source-han-sans",[1301,1304,1307,1310,1313],{"name":1302,"text":1303},"Baixe o TTF do release no GitHub da Adobe","Abra github.com/adobe-fonts/source-han-sans/releases. A partir do release mais recente, baixe o pacote TTF (não o OTF nem o SuperOTC) e extraia SourceHanSansJP-Regular.ttf. O gpdf faz parse de TrueType, não de OpenType com contornos CFF.",{"name":1305,"text":1306},"Carregue os bytes na inicialização","Use os.ReadFile(\"SourceHanSansJP-Regular.ttf\") ou //go:embed. Para reprodutibilidade em CI, fixe uma tag específica do release da Adobe no seu repositório em vez de baixar em tempo de build.",{"name":1308,"text":1309},"Registre a fonte ao construir o documento","Passe gpdf.WithFont(\"SourceHanSansJP\", fontBytes) e gpdf.WithDefaultFont(\"SourceHanSansJP\", 11) para gpdf.NewDocument. Sem AddUTF8Font, sem caminho de filesystem.",{"name":1311,"text":1312},"Registre pesos adicionais quando precisar","Source Han Sans JP publica sete pesos, de ExtraLight a Heavy. Registre o TTF Bold com a chave SourceHanSansJP-Bold e o template.Bold() passará a usar os contornos reais de negrito em vez de um traço sintetizado.",{"name":1314,"text":1315},"Mantenha OFL.txt junto à sua distribuição","A SIL OFL 1.1 exige que o texto da licença viaje junto com o binário da fonte. Se você //go:embed o TTF, embuta também OFL.txt em LICENSES/ e referencie-o no NOTICE.",null,{},"/pt/blog/source-han-sans-jp-with-gpdf",{"title":5,"description":1291},"pt/blog/010.source-han-sans-jp-with-gpdf",[1322,1323,1324],"recipe","cjk","tutorial","7Xg0MOgX_0_muENkAHkp8ohMv_F3FA86sF5Uyn9bRLE",1776537646074]