You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Heroku上为WeasyPrint配置自定义字体处理日语字符

我之前在Heroku上部署WeasyPrint处理多语言内容时,也碰到过日语字符显示方框的问题——本质就是Heroku默认环境没有预装日语字体,加上WeasyPrint需要的系统依赖没配置到位。下面是我亲测有效的解决步骤:

在Heroku上为WeasyPrint配置自定义日语字体解决方框问题

步骤1:添加日语字体到项目

  • 下载一款支持完整日语字符的开源字体,比如Noto Sans JP(Google出品,覆盖所有常用日语字符)
  • 在项目根目录新建一个fonts文件夹,把下载的字体文件(比如NotoSansJP-Regular.otf)放入其中,确保这个文件夹能被Git追踪(不要在.gitignore里排除它)

步骤2:修改CSS引入自定义字体

更新你的CSS代码,用@font-face声明字体,然后指定页面元素使用该字体:

@font-face {
    font-family: 'Noto Sans JP';
    src: url('fonts/NotoSansJP-Regular.otf') format('opentype');
    font-weight: normal;
    font-style: normal;
}
h1, body {
    font-family: 'Noto Sans JP', sans-serif;
}

步骤3:配置Heroku的系统依赖

WeasyPrint依赖一些底层系统库才能在Heroku上正常运行,你需要在项目根目录创建一个Aptfile,内容如下:

libpango-1.0-0
libpangocairo-1.0-0
libcairo2
libgdk-pixbuf2.0-0
libffi-dev
shared-mime-info

同时确保requirements.txt里包含WeasyPrint的依赖:

weasyprint>=59.0

步骤4:调整Python代码

把CSS整合到你的代码中,确保FontConfiguration能正确识别自定义字体:

from weasyprint import HTML, CSS
from weasyprint.fonts import FontConfiguration

font_config = FontConfiguration()
# 这里的字体路径要和项目内的实际路径一致
css = CSS(string="""
@font-face {
    font-family: 'Noto Sans JP';
    src: url('fonts/NotoSansJP-Regular.otf') format('opentype');
    font-weight: normal;
    font-style: normal;
}
h1 {
    font-family: 'Noto Sans JP', sans-serif;
}
""", font_config=font_config)

html = HTML(string='<h1>Title here 自家製フォント工房</h1>')
html.write_pdf(
    'report.pdf',
    stylesheets=[css],
    font_config=font_config
)

额外注意事项

  • 如果使用其他日语字体,只需要替换@font-face中的文件名和路径即可
  • 部署前先在本地测试修改后的代码,确认字体正常显示后再推送到Heroku
  • 确保字体文件的相对路径在Heroku上有效(Heroku会完整部署你的项目文件,本地路径正常的话线上也会正常)

内容的提问来源于stack exchange,提问作者Ahmed Farahat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:31