使用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
相关产品推荐
相关产品推荐

