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

使用pdfkit与jinja生成PDF时Open Sans字体设置异常排查

问题排查与解决方案

针对你遇到的两个HTML转PDF后无法稳定加载Open Sans字体的问题,以下是几个关键排查点和解决方法:

1. 修复字体文件路径问题

你当前使用的绝对路径/templates/shared/...,转PDF工具(如wkhtmltopdf、WeasyPrint)的工作目录未必和Python运行目录一致,大概率导致字体文件找不到。

  • 换成相对路径:如果生成的HTML文件和templates目录同级,修改为:
    @font-face {
        font-family: 'Open Sans';
        src: url('./templates/shared/Open_Sans/static/OpenSans_Condensed-Light.ttf');
        font-weight: 300;
        font-style: normal;
    }
    
  • 或者直接用系统绝对路径:比如src: url('/home/your-project/templates/shared/Open_Sans/static/OpenSans_Condensed-Light.ttf');,确保工具能精准定位字体文件。

2. 明确字体属性,避免匹配失败

你只加载了Light字重的字体,但CSS中未指定对应font-weight,工具可能默认尝试匹配400(常规)字重,导致 fallback 到系统字体:

@font-face {
    font-family: 'Open Sans';
    src: url('你的字体路径');
    font-weight: 300; /* 对应Light字重 */
    font-style: normal;
}

body, p {
    font-family: 'Open Sans';
    font-weight: 300; /* 明确使用已加载的字重 */
    font-size: medium;
}

如果需要其他字重(如常规400),补充对应的TTF文件和@font-face规则即可。

3. 解决并行生成的资源竞争

如果是用多线程/多进程同时生成两个PDF,工具可能因同时访问字体文件或资源导致加载异常:

  • 改成串行生成:先完成第一个PDF的转换,再启动第二个,避免资源冲突。

4. 禁用工具缓存,强制加载字体

转PDF工具的缓存机制可能导致字体加载异常,添加参数禁用缓存:

  • 若用wkhtmltopdf:添加--no-cache参数
  • 若用WeasyPrint:生成PDF时指定临时缓存目录,比如:
    from weasyprint import HTML
    HTML(filename='second.html').write_pdf('second.pdf', cache_dir='/tmp/weasyprint-cache')
    

5. 配置工具的本地文件访问权限

部分工具默认限制本地文件访问,需手动开启:

  • wkhtmltopdf:添加--enable-local-file-access参数
  • WeasyPrint:生成时指定base_url为HTML文件所在目录的绝对路径,确保工具能解析相对路径的字体:
    from weasyprint import HTML
    html_path = '/path/to/your/generated/first.html'
    HTML(filename=html_path, base_url=f'file://{html_path.rsplit("/", 1)[0]}/').write_pdf('first.pdf')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:47:25