[{"data":1,"prerenderedAt":1326},["ShallowReactive",2],{"blog-zh-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":84,"path":1318,"seo":1319,"stem":1320,"tags":1321,"updated":1316,"__hash__":1325},"blogZh/zh/blog/010.source-han-sans-jp-with-gpdf.md","如何在 gpdf 中使用思源黑体 JP（Source Han Sans JP）？",{"name":7,"url":8},"gpdf team","https://gpdf.dev",{"type":10,"value":11,"toc":1278},"minimark",[12,16,33,36,54,57,706,720,724,735,738,823,834,838,873,880,904,914,917,920,928,931,1086,1099,1102,1106,1109,1150,1164,1168,1171,1185,1188,1203,1206,1209,1238,1242,1245,1262,1274],[13,14,15],"h2",{"id":15},"这个问题的另一种表达",[17,18,19,20,27,28,32],"p",{},"你想在 ",[21,22,26],"a",{"href":23,"rel":24},"https://github.com/gpdf-dev/gpdf",[25],"nofollow","gpdf"," 文档里用 ",[29,30,31],"strong",{},"Source Han Sans JP（思源黑体 JP）"," —— 2014 年 Adobe 与 Google 合作发布的泛 CJK 无衬线字体的 Adobe 品牌。也许你团队把字体锚定在 GitHub 的 release tag 上以保证可复现，也许你接手的设计系统多年前就标准化在思源黑体上，也许你就是喜欢 Adobe 的发布节奏。理由随意。下载之前值得先搞清楚三件事：该拿哪个文件、和 Noto Sans JP 究竟什么关系、gpdf 能读哪种格式。",[13,34,35],{"id":35},"速答",[17,37,38,39,44,45,49,50,53],{},"从 ",[21,40,43],{"href":41,"rel":42},"https://github.com/adobe-fonts/source-han-sans/releases",[25],"adobe-fonts/source-han-sans"," 发布页下载 ",[46,47,48],"code",{},"SourceHanSansJP-Regular.ttf","（TTF 包，不是 OTF），用 ",[46,51,52],{},"gpdf.WithFont(\"SourceHanSansJP\", bytes)"," 注册并设为默认。Source Han Sans JP 与 Noto Sans JP 共用同一套字形；如果你对 Adobe 的发布流程没什么特别要求,Noto Sans JP 的获取路径更直接。",[13,55,56],{"id":56},"完整示例",[58,59,64],"pre",{"className":60,"code":61,"language":62,"meta":63,"style":63},"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 — Adobe 发布的免费 CJK 字体。\")\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","",[46,65,66,79,86,96,108,118,123,133,143,153,159,164,180,218,234,252,258,263,282,305,343,369,394,400,405,424,458,495,543,563,569,575,580,601,614,629,634,680,695,700],{"__ignoreMap":63},[67,68,71,75],"span",{"class":69,"line":70},"line",1,[67,72,74],{"class":73},"sMK4o","package",[67,76,78],{"class":77},"sBMFI"," main\n",[67,80,82],{"class":69,"line":81},2,[67,83,85],{"emptyLinePlaceholder":84},true,"\n",[67,87,89,93],{"class":69,"line":88},3,[67,90,92],{"class":91},"s7zQu","import",[67,94,95],{"class":73}," (\n",[67,97,99,102,105],{"class":69,"line":98},4,[67,100,101],{"class":73},"    \"",[67,103,104],{"class":77},"log",[67,106,107],{"class":73},"\"\n",[67,109,111,113,116],{"class":69,"line":110},5,[67,112,101],{"class":73},[67,114,115],{"class":77},"os",[67,117,107],{"class":73},[67,119,121],{"class":69,"line":120},6,[67,122,85],{"emptyLinePlaceholder":84},[67,124,126,128,131],{"class":69,"line":125},7,[67,127,101],{"class":73},[67,129,130],{"class":77},"github.com/gpdf-dev/gpdf",[67,132,107],{"class":73},[67,134,136,138,141],{"class":69,"line":135},8,[67,137,101],{"class":73},[67,139,140],{"class":77},"github.com/gpdf-dev/gpdf/document",[67,142,107],{"class":73},[67,144,146,148,151],{"class":69,"line":145},9,[67,147,101],{"class":73},[67,149,150],{"class":77},"github.com/gpdf-dev/gpdf/template",[67,152,107],{"class":73},[67,154,156],{"class":69,"line":155},10,[67,157,158],{"class":73},")\n",[67,160,162],{"class":69,"line":161},11,[67,163,85],{"emptyLinePlaceholder":84},[67,165,167,170,174,177],{"class":69,"line":166},12,[67,168,169],{"class":73},"func",[67,171,173],{"class":172},"s2Zo4"," main",[67,175,176],{"class":73},"()",[67,178,179],{"class":73}," {\n",[67,181,183,187,190,193,196,199,202,205,208,211,214,216],{"class":69,"line":182},13,[67,184,186],{"class":185},"sTEyZ","    font",[67,188,189],{"class":73},",",[67,191,192],{"class":185}," err ",[67,194,195],{"class":73},":=",[67,197,198],{"class":185}," os",[67,200,201],{"class":73},".",[67,203,204],{"class":172},"ReadFile",[67,206,207],{"class":73},"(",[67,209,210],{"class":73},"\"",[67,212,48],{"class":213},"sfazB",[67,215,210],{"class":73},[67,217,158],{"class":73},[67,219,221,224,226,229,232],{"class":69,"line":220},14,[67,222,223],{"class":91},"    if",[67,225,192],{"class":185},[67,227,228],{"class":73},"!=",[67,230,231],{"class":73}," nil",[67,233,179],{"class":73},[67,235,237,240,242,245,247,250],{"class":69,"line":236},15,[67,238,239],{"class":185},"        log",[67,241,201],{"class":73},[67,243,244],{"class":172},"Fatal",[67,246,207],{"class":73},[67,248,249],{"class":185},"err",[67,251,158],{"class":73},[67,253,255],{"class":69,"line":254},16,[67,256,257],{"class":73},"    }\n",[67,259,261],{"class":69,"line":260},17,[67,262,85],{"emptyLinePlaceholder":84},[67,264,266,269,271,274,276,279],{"class":69,"line":265},18,[67,267,268],{"class":185},"    doc ",[67,270,195],{"class":73},[67,272,273],{"class":185}," gpdf",[67,275,201],{"class":73},[67,277,278],{"class":172},"NewDocument",[67,280,281],{"class":73},"(\n",[67,283,285,288,290,293,295,297,299,302],{"class":69,"line":284},19,[67,286,287],{"class":185},"        gpdf",[67,289,201],{"class":73},[67,291,292],{"class":172},"WithPageSize",[67,294,207],{"class":73},[67,296,26],{"class":185},[67,298,201],{"class":73},[67,300,301],{"class":185},"A4",[67,303,304],{"class":73},"),\n",[67,306,308,310,312,315,317,320,322,325,327,329,331,334,336,340],{"class":69,"line":307},20,[67,309,287],{"class":185},[67,311,201],{"class":73},[67,313,314],{"class":172},"WithMargins",[67,316,207],{"class":73},[67,318,319],{"class":185},"document",[67,321,201],{"class":73},[67,323,324],{"class":172},"UniformEdges",[67,326,207],{"class":73},[67,328,319],{"class":185},[67,330,201],{"class":73},[67,332,333],{"class":172},"Mm",[67,335,207],{"class":73},[67,337,339],{"class":338},"sbssI","20",[67,341,342],{"class":73},"))),\n",[67,344,346,348,350,353,355,357,360,362,364,367],{"class":69,"line":345},21,[67,347,287],{"class":185},[67,349,201],{"class":73},[67,351,352],{"class":172},"WithFont",[67,354,207],{"class":73},[67,356,210],{"class":73},[67,358,359],{"class":213},"SourceHanSansJP",[67,361,210],{"class":73},[67,363,189],{"class":73},[67,365,366],{"class":185}," font",[67,368,304],{"class":73},[67,370,372,374,376,379,381,383,385,387,389,392],{"class":69,"line":371},22,[67,373,287],{"class":185},[67,375,201],{"class":73},[67,377,378],{"class":172},"WithDefaultFont",[67,380,207],{"class":73},[67,382,210],{"class":73},[67,384,359],{"class":213},[67,386,210],{"class":73},[67,388,189],{"class":73},[67,390,391],{"class":338}," 11",[67,393,304],{"class":73},[67,395,397],{"class":69,"line":396},23,[67,398,399],{"class":73},"    )\n",[67,401,403],{"class":69,"line":402},24,[67,404,85],{"emptyLinePlaceholder":84},[67,406,408,411,413,416,418,421],{"class":69,"line":407},25,[67,409,410],{"class":185},"    page ",[67,412,195],{"class":73},[67,414,415],{"class":185}," doc",[67,417,201],{"class":73},[67,419,420],{"class":172},"AddPage",[67,422,423],{"class":73},"()\n",[67,425,427,430,432,435,438,442,445,448,450,453,456],{"class":69,"line":426},26,[67,428,429],{"class":185},"    page",[67,431,201],{"class":73},[67,433,434],{"class":172},"AutoRow",[67,436,437],{"class":73},"(func(",[67,439,441],{"class":440},"sHdIc","r",[67,443,444],{"class":73}," *",[67,446,447],{"class":77},"template",[67,449,201],{"class":73},[67,451,452],{"class":77},"RowBuilder",[67,454,455],{"class":73},")",[67,457,179],{"class":73},[67,459,461,464,466,469,471,474,476,479,482,484,486,488,491,493],{"class":69,"line":460},27,[67,462,463],{"class":185},"        r",[67,465,201],{"class":73},[67,467,468],{"class":172},"Col",[67,470,207],{"class":73},[67,472,473],{"class":338},"12",[67,475,189],{"class":73},[67,477,478],{"class":73}," func(",[67,480,481],{"class":440},"c",[67,483,444],{"class":73},[67,485,447],{"class":77},[67,487,201],{"class":73},[67,489,490],{"class":77},"ColBuilder",[67,492,455],{"class":73},[67,494,179],{"class":73},[67,496,498,501,503,506,508,510,513,515,517,520,522,525,527,530,533,535,537,540],{"class":69,"line":497},28,[67,499,500],{"class":185},"            c",[67,502,201],{"class":73},[67,504,505],{"class":172},"Text",[67,507,207],{"class":73},[67,509,210],{"class":73},[67,511,512],{"class":213},"報告書",[67,514,210],{"class":73},[67,516,189],{"class":73},[67,518,519],{"class":185}," template",[67,521,201],{"class":73},[67,523,524],{"class":172},"FontSize",[67,526,207],{"class":73},[67,528,529],{"class":338},"24",[67,531,532],{"class":73},"),",[67,534,519],{"class":185},[67,536,201],{"class":73},[67,538,539],{"class":172},"Bold",[67,541,542],{"class":73},"())\n",[67,544,546,548,550,552,554,556,559,561],{"class":69,"line":545},29,[67,547,500],{"class":185},[67,549,201],{"class":73},[67,551,505],{"class":172},[67,553,207],{"class":73},[67,555,210],{"class":73},[67,557,558],{"class":213},"Source Han Sans JP — Adobe 发布的免费 CJK 字体。",[67,560,210],{"class":73},[67,562,158],{"class":73},[67,564,566],{"class":69,"line":565},30,[67,567,568],{"class":73},"        })\n",[67,570,572],{"class":69,"line":571},31,[67,573,574],{"class":73},"    })\n",[67,576,578],{"class":69,"line":577},32,[67,579,85],{"emptyLinePlaceholder":84},[67,581,583,586,588,590,592,594,596,599],{"class":69,"line":582},33,[67,584,585],{"class":185},"    data",[67,587,189],{"class":73},[67,589,192],{"class":185},[67,591,195],{"class":73},[67,593,415],{"class":185},[67,595,201],{"class":73},[67,597,598],{"class":172},"Generate",[67,600,423],{"class":73},[67,602,604,606,608,610,612],{"class":69,"line":603},34,[67,605,223],{"class":91},[67,607,192],{"class":185},[67,609,228],{"class":73},[67,611,231],{"class":73},[67,613,179],{"class":73},[67,615,617,619,621,623,625,627],{"class":69,"line":616},35,[67,618,239],{"class":185},[67,620,201],{"class":73},[67,622,244],{"class":172},[67,624,207],{"class":73},[67,626,249],{"class":185},[67,628,158],{"class":73},[67,630,632],{"class":69,"line":631},36,[67,633,257],{"class":73},[67,635,637,639,641,643,645,647,650,652,654,657,659,661,664,666,669,672,674,676,678],{"class":69,"line":636},37,[67,638,223],{"class":91},[67,640,192],{"class":185},[67,642,195],{"class":73},[67,644,198],{"class":185},[67,646,201],{"class":73},[67,648,649],{"class":172},"WriteFile",[67,651,207],{"class":73},[67,653,210],{"class":73},[67,655,656],{"class":213},"report.pdf",[67,658,210],{"class":73},[67,660,189],{"class":73},[67,662,663],{"class":185}," data",[67,665,189],{"class":73},[67,667,668],{"class":338}," 0o644",[67,670,671],{"class":73},");",[67,673,192],{"class":185},[67,675,228],{"class":73},[67,677,231],{"class":73},[67,679,179],{"class":73},[67,681,683,685,687,689,691,693],{"class":69,"line":682},38,[67,684,239],{"class":185},[67,686,201],{"class":73},[67,688,244],{"class":172},[67,690,207],{"class":73},[67,692,249],{"class":185},[67,694,158],{"class":73},[67,696,698],{"class":69,"line":697},39,[67,699,257],{"class":73},[67,701,703],{"class":69,"line":702},40,[67,704,705],{"class":73},"}\n",[17,707,708,709,712,713,716,717,719],{},"把 TTF 放到 ",[46,710,711],{},"main.go"," 旁边，",[46,714,715],{},"go run main.go","，一页带日文的 PDF 就会出现在 ",[46,718,656],{},"。",[13,721,723],{"id":722},"source-han-sans-jp-就是-noto-sans-cjk-jp","Source Han Sans JP 就是 Noto Sans CJK JP",[17,725,726,727,730,731,734],{},"最能帮你省几个小时查资料的事实只有一条：",[29,728,729],{},"Source Han Sans 和 Noto Sans CJK 是同一套字体","。字形设计、度量表、字符集覆盖都由 Adobe 完成，Google 以 Noto 品牌进行并行分发。两者都在 2014-07-15 同日发布。轮廓数据、",[46,732,733],{},"hmtx"," 表、JIS X 0213 / Adobe-Japan1-6 的覆盖面 —— 比特级完全一致。Adobe 升版后，相应的字形变化会在数周内传到 Noto。",[17,736,737],{},"差异都在品牌和打包层面：",[739,740,741,756],"table",{},[742,743,744],"thead",{},[745,746,747,750,753],"tr",{},[748,749],"th",{},[748,751,752],{},"Source Han Sans JP",[748,754,755],{},"Noto Sans JP",[757,758,759,771,790,801,812],"tbody",{},[745,760,761,765,768],{},[762,763,764],"td",{},"发行方",[762,766,767],{},"Adobe",[762,769,770],{},"Google",[745,772,773,776,782],{},[762,774,775],{},"权威源",[762,777,778],{},[21,779,43],{"href":780,"rel":781},"https://github.com/adobe-fonts/source-han-sans",[25],[762,783,784,789],{},[21,785,788],{"href":786,"rel":787},"https://notofonts.github.io",[25],"notofonts.github.io"," + Google Fonts",[745,791,792,795,798],{},[762,793,794],{},"主格式",[762,796,797],{},"OTF（CFF 轮廓）",[762,799,800],{},"TTF（static）+ variable",[745,802,803,806,809],{},[762,804,805],{},"发布模型",[762,807,808],{},"GitHub release tag 手动版本化",[762,810,811],{},"Google Fonts CDN + git 仓库",[745,813,814,817,820],{},[762,815,816],{},"语言打包",[762,818,819],{},"分语言 TTF + 泛 CJK OTC",[762,821,822],{},"仅 JP",[17,824,825,826,829,830,833],{},"如果你的团队要把字体锁在 Adobe 的 GitHub tag 上、已经在内部镜像 ",[46,827,828],{},"github.com/adobe-fonts","、或者别的流水线也要用泛 CJK OTC，那就用 Source Han Sans JP。否则直接用能拿到 TTF 的 ",[21,831,755],{"href":832},"/zh/blog/noto-sans-jp-with-gpdf"," 更省事。",[13,835,837],{"id":836},"为什么非-ttf-不可","为什么非 TTF 不可",[17,839,840,841,844,845,848,849,852,853,852,856,852,859,861,862,865,866,869,870,872],{},"Adobe 对 Source Han Sans 的默认格式是 ",[46,842,843],{},".otf","，准确说是基于 CFF 的 OpenType。而 gpdf 的字体解析器只有一个文件 ",[46,846,847],{},"pdf/font/truetype.go","，处理 ",[46,850,851],{},"glyf","、",[46,854,855],{},"loca",[46,857,858],{},"cmap",[46,860,733],{}," 和复合字形，不读 ",[46,863,864],{},"CFF "," / ",[46,867,868],{},"CFF2"," 轮廓。把 CFF 版 ",[46,871,843],{}," 丢给它，会在文档构造阶段就抛出解析错误，还没到渲染就挂了。",[17,874,875,876,879],{},"Adobe 的发布页同时提供 OTF 和 TTF，",[29,877,878],{},"要拿 TTF 包","。如果某个点发行版恰好没出 TTF（偶尔发生），两条干净的备选：",[881,882,883,890],"ol",{},[884,885,886,889],"li",{},[29,887,888],{},"换到 Noto Sans JP。"," Google Fonts 直接提供静态 TTF，字形数据完全一致，免去转换。",[884,891,892,895,896,899,900,903],{},[29,893,894],{},"一次性转换，提交结果。"," 用 ",[46,897,898],{},"fonttools"," 的 ",[46,901,902],{},"otf2ttf"," 转一次就好，把产物提交到仓库或内部制品服务器，转换过程永远不进构建流水线。",[17,905,906,907,909,910,913],{},"别在构建时做转换。字体转换工具跨版本行为会变，",[46,908,733],{}," 稍有差别就会让换行位置在一次 ",[46,911,912],{},"pip install -U"," 之后偷偷挪位。",[13,915,916],{"id":916},"七个字重",[17,918,919],{},"Source Han Sans JP 以单独 TTF 形式发布 ExtraLight 到 Heavy 共 7 个字重：",[58,921,926],{"className":922,"code":924,"language":925},[923],"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",[46,927,924],{"__ignoreMap":63},[17,929,930],{},"大多数业务文档 Regular + Bold 两个就够：",[58,932,934],{"className":60,"code":933,"language":62,"meta":63,"style":63},"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",[46,935,936,964,993,997,1012,1036,1060,1082],{"__ignoreMap":63},[67,937,938,941,943,946,948,950,952,954,956,958,960,962],{"class":69,"line":70},[67,939,940],{"class":185},"reg",[67,942,189],{"class":73},[67,944,945],{"class":185},"  _ ",[67,947,195],{"class":73},[67,949,198],{"class":185},[67,951,201],{"class":73},[67,953,204],{"class":172},[67,955,207],{"class":73},[67,957,210],{"class":73},[67,959,48],{"class":213},[67,961,210],{"class":73},[67,963,158],{"class":73},[67,965,966,969,971,974,976,978,980,982,984,986,989,991],{"class":69,"line":81},[67,967,968],{"class":185},"bold",[67,970,189],{"class":73},[67,972,973],{"class":185}," _ ",[67,975,195],{"class":73},[67,977,198],{"class":185},[67,979,201],{"class":73},[67,981,204],{"class":172},[67,983,207],{"class":73},[67,985,210],{"class":73},[67,987,988],{"class":213},"SourceHanSansJP-Bold.ttf",[67,990,210],{"class":73},[67,992,158],{"class":73},[67,994,995],{"class":69,"line":88},[67,996,85],{"emptyLinePlaceholder":84},[67,998,999,1002,1004,1006,1008,1010],{"class":69,"line":98},[67,1000,1001],{"class":185},"doc ",[67,1003,195],{"class":73},[67,1005,273],{"class":185},[67,1007,201],{"class":73},[67,1009,278],{"class":172},[67,1011,281],{"class":73},[67,1013,1014,1017,1019,1021,1023,1025,1027,1029,1031,1034],{"class":69,"line":110},[67,1015,1016],{"class":185},"    gpdf",[67,1018,201],{"class":73},[67,1020,352],{"class":172},[67,1022,207],{"class":73},[67,1024,210],{"class":73},[67,1026,359],{"class":213},[67,1028,210],{"class":73},[67,1030,189],{"class":73},[67,1032,1033],{"class":185}," reg",[67,1035,304],{"class":73},[67,1037,1038,1040,1042,1044,1046,1048,1051,1053,1055,1058],{"class":69,"line":120},[67,1039,1016],{"class":185},[67,1041,201],{"class":73},[67,1043,352],{"class":172},[67,1045,207],{"class":73},[67,1047,210],{"class":73},[67,1049,1050],{"class":213},"SourceHanSansJP-Bold",[67,1052,210],{"class":73},[67,1054,189],{"class":73},[67,1056,1057],{"class":185}," bold",[67,1059,304],{"class":73},[67,1061,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080],{"class":69,"line":125},[67,1063,1016],{"class":185},[67,1065,201],{"class":73},[67,1067,378],{"class":172},[67,1069,207],{"class":73},[67,1071,210],{"class":73},[67,1073,359],{"class":213},[67,1075,210],{"class":73},[67,1077,189],{"class":73},[67,1079,391],{"class":338},[67,1081,304],{"class":73},[67,1083,1084],{"class":69,"line":135},[67,1085,158],{"class":73},[17,1087,1088,1091,1092,1095,1096,1098],{},[46,1089,1090],{},"-Bold"," 后缀是 ",[46,1093,1094],{},"template.Bold()"," 和真 Bold TTF 之间的契约。不注册就用 ",[46,1097,1094],{},"，会退化为在 Regular 字形上叠 0.4 pt 描边的合成粗体，小标题还行，到大字号就明显比真 Bold 单薄。",[17,1100,1101],{},"CJK 字体按惯例不做斜体版，Source Han Sans JP 也没有。日文需要斜体强调时，换字重或换颜色更自然；对汉字做倾斜变换看起来不是强调，是坏掉了。",[13,1103,1105],{"id":1104},"泛-cjkjp-单语还是-super-otc","泛 CJK、JP 单语、还是 Super OTC",[17,1107,1108],{},"Adobe 以多种粒度发布 Source Han Sans，对 Go PDF 生成不能混用：",[1110,1111,1112,1125,1135],"ul",{},[884,1113,1114,1117,1118,1121,1122,1124],{},[29,1115,1116],{},"SourceHanSans.ttc","（Super OTC）—— 把全部 CJK 语言塞进一个 20 MB+ 的 TrueType Collection。gpdf 不会在 ",[46,1119,1120],{},".ttc"," 内部按 face index 取脸，需要先用 ",[46,1123,898],{}," 切出 JP face 再作为 TTF 注册。通常不用这个。",[884,1126,1127,1130,1131,1134],{},[29,1128,1129],{},"地区统一 OTF","（如 ",[46,1132,1133],{},"SourceHanSans-Regular.otf","）—— 泛 CJK 共存，CFF 轮廓，gpdf 读不了。",[884,1136,1137,1140,1141,1143,1144,1146,1147,719],{},[29,1138,1139],{},"分语言 TTF","（",[46,1142,48],{},"）—— 仅 JP，",[46,1145,851],{}," 轮廓。",[29,1148,1149],{},"就要这个",[17,1151,1152,1153,1155,1156,1159,1160,1163],{},"如果你的文档同页混有日文和韩文 / 中文，不要依赖泛 CJK OTF，而是分别注册各语言 family：",[46,1154,359],{}," 加 ",[46,1157,1158],{},"SourceHanSansKR","，在语系切换处用 ",[46,1161,1162],{},"template.FontFamily"," 明确指定。泛 CJK OTF 把汉字做了 Han unification 统一到一个形上，会让日文正文里本该是日文字形的汉字变成中文字形。",[13,1165,1167],{"id":1166},"什么时候选思源黑体而非-noto","什么时候选思源黑体而非 Noto",[17,1169,1170],{},"同一套轮廓，不同的发布渠道。选 Source Han Sans JP 合理的场景：",[1110,1172,1173,1176,1182],{},[884,1174,1175],{},"运维团队偏好把字体锚定到 Adobe 的 GitHub release tag（可复现、可审计）",[884,1177,1178,1179,1181],{},"公司内部已经镜像 ",[46,1180,828],{},"（严格制品政策的企业里常见）",[884,1183,1184],{},"流水线别的环节也需要泛 CJK OTC 包（DTP 对接、品牌系统在 Adobe 命名下统一）",[17,1186,1187],{},"选 Noto Sans JP 更合适的场景：",[1110,1189,1190,1197,1200],{},[884,1191,1192,1193,1196],{},"想要最短路径拿到 TTF（",[46,1194,1195],{},"fonts.google.com/noto/specimen/Noto+Sans+JP"," → zip → 搞定）",[884,1198,1199],{},"不想在构建里做 OTF → TTF 转换",[884,1201,1202],{},"项目已经通过既有流程拉其他 Google Fonts",[17,1204,1205],{},"渲染结果一样。判断依据是运维层面的 —— 文件在哪里、怎么版本化、团队熟哪个 —— 而不是美感。",[13,1207,1208],{"id":1208},"延伸阅读",[1110,1210,1211,1217,1224,1231],{},[884,1212,1213,1216],{},[21,1214,1215],{"href":832},"如何在 gpdf 中使用 Noto Sans JP？"," —— 同样的字形，开箱即为 TTF",[884,1218,1219,1223],{},[21,1220,1222],{"href":1221},"/zh/blog/embed-japanese-font","如何在 gpdf 中嵌入日文字体？"," —— CJK 嵌入的通用配方",[884,1225,1226,1230],{},[21,1227,1229],{"href":1228},"/zh/blog/ipaex-gothic-gpdf","如何在 gpdf 中使用 IPAex Gothic？"," —— 面向日本官方场合的 IPA 许可替代",[884,1232,1233,1237],{},[21,1234,1236],{"href":1235},"/zh/blog/tofu-boxes-japanese","为什么 gpdf 生成的 PDF 中日文显示为方块？"," —— 字形缺失排查",[13,1239,1241],{"id":1240},"试试-gpdf","试试 gpdf",[17,1243,1244],{},"gpdf 是一个 Go PDF 生成库。MIT 协议、零外部依赖、原生支持 CJK。",[58,1246,1250],{"className":1247,"code":1248,"language":1249,"meta":63,"style":63},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","go get github.com/gpdf-dev/gpdf\n","bash",[46,1251,1252],{"__ignoreMap":63},[67,1253,1254,1256,1259],{"class":69,"line":70},[67,1255,62],{"class":77},[67,1257,1258],{"class":213}," get",[67,1260,1261],{"class":213}," github.com/gpdf-dev/gpdf\n",[17,1263,1264,1268,1269],{},[21,1265,1267],{"href":23,"rel":1266},[25],"⭐ 在 GitHub 上 Star"," · ",[21,1270,1273],{"href":1271,"rel":1272},"https://gpdf.dev/zh/docs/quickstart",[25],"阅读文档",[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":63,"searchDepth":81,"depth":81,"links":1279},[1280,1281,1282,1283,1284,1285,1286,1287,1288,1289],{"id":15,"depth":81,"text":15},{"id":35,"depth":81,"text":35},{"id":56,"depth":81,"text":56},{"id":722,"depth":81,"text":723},{"id":836,"depth":81,"text":837},{"id":916,"depth":81,"text":916},{"id":1104,"depth":81,"text":1105},{"id":1166,"depth":81,"text":1167},{"id":1208,"depth":81,"text":1208},{"id":1240,"depth":81,"text":1241},"2026-04-19","从 Adobe 的 GitHub 发布页下载 TTF 版本的思源黑体 JP，用 gpdf.WithFont 注册。七个字重，SIL OFL，与 Noto Sans JP 同源字形。",false,"md",{"name":1295,"totalTime":1296,"tools":1297,"steps":1300},"在 gpdf 文档中把 Source Han Sans JP（思源黑体 JP）设为默认字体","PT15M",[1298,1299],"Go 1.22+","SourceHanSansJP-Regular.ttf（来自 adobe-fonts/source-han-sans）",[1301,1304,1307,1310,1313],{"name":1302,"text":1303},"从 Adobe 的 GitHub 发布页下载 TTF 版","打开 github.com/adobe-fonts/source-han-sans/releases，在最新版本中下载 TTF 包（不是 OTF 也不是 SuperOTC），解压出 SourceHanSansJP-Regular.ttf。gpdf 只解析 TrueType，不读 CFF 风格的 OpenType。",{"name":1305,"text":1306},"启动时加载字节","用 os.ReadFile(\"SourceHanSansJP-Regular.ttf\") 或 //go:embed 载入。为保证 CI 可复现，建议把 Adobe 的某个 release tag 固定到仓库里，不要在构建时下载。",{"name":1308,"text":1309},"在文档构造时注册","把 gpdf.WithFont(\"SourceHanSansJP\", fontBytes) 和 gpdf.WithDefaultFont(\"SourceHanSansJP\", 11) 传给 gpdf.NewDocument。不需要 AddUTF8Font，也不要传文件路径。",{"name":1311,"text":1312},"按需注册额外字重","思源黑体 JP 以单独 TTF 形式发布 ExtraLight 到 Heavy 共 7 个字重。把 Bold TTF 用 SourceHanSansJP-Bold 作为键注册，template.Bold() 就会选择真正的 Bold 轮廓，而不是合成描边。",{"name":1314,"text":1315},"随二进制保留 OFL.txt","SIL OFL 1.1 要求字体二进制分发到哪里，许可证文本就要跟到哪里。若用 //go:embed 嵌入 TTF，把 OFL.txt 也一并嵌入 LICENSES/，并从 NOTICE 引用。",null,{},"/zh/blog/source-han-sans-jp-with-gpdf",{"title":5,"description":1291},"zh/blog/010.source-han-sans-jp-with-gpdf",[1322,1323,1324],"recipe","cjk","tutorial","lsPAS14UzbYTcykWtazm4inRezgTgdWkIo1gSxyRlWA",1776537632683]