WeasyPrint 批量转 PDF 卡顿或报错主因是相对路径解析失败、中文字体未注册及资源未隔离;需用绝对路径、显式 base_url、每次新建 CSS/font_config 实例,并在 Linux 安装中文字体包且配置 FONTCONFIG_PATH。

为什么直接用 WeasyPrint 批量转 PDF 会卡在 CSS 加载或字体报错?
因为 WeasyPrint 默认不自动解析相对路径的 css、font 或图片资源,批量处理时若 HTML 中含 link rel="stylesheet" href="style.css" 或 @import "reset.css",它会在当前工作目录找文件——而你很可能没把 CSS 放那儿,或者路径层级不一致。
实操建议:
立即学习“Python免费学习笔记(深入)”;
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 统一用绝对路径加载 HTML:用
os.path.abspath("report.html")构造完整路径,再传给HTML(filename=...) - CSS 路径必须显式声明 base URL:构造
HTML对象时加参数base_url=os.path.dirname(abspath_html),否则url(font.woff)会 404 - 中文字体必须手动注册:调用
weasyprint.fonts.FontConfiguration()+CSS(..., font_config=fc),且字体文件路径也得是绝对路径
如何避免批量生成时内存暴涨或 PDF 页眉页脚错位?
WeasyPrint 每次调用 write_pdf() 都会初始化渲染上下文,但默认不释放底层 Cairo/Pango 资源——连续跑几百个 HTML,内存可能涨到几个 GB,且页眉页脚(@page { @top-center { ... } })在复用同一 CSS 对象时容易样式污染。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 每个 PDF 单独 new 一个
CSS实例,别复用全局变量;如果用了font_config,也每次新建 - 用
try/finally显式 del 引用:del html_doc; del css_obj(虽不能立刻回收,但能加速 GC) - 页眉页脚内容含动态变量(如报告日期)时,不要写死在 CSS 字符串里,改用
HTML(string=...).write_pdf(..., stylesheets=[CSS(string=...)])动态注入
批量任务中怎么让不同 HTML 使用不同模板但共享基础样式?
硬编码多个 style.css 文件维护成本高,全内联又破坏可读性。关键是分层控制:基础样式抽离为字符串或独立 CSS 文件,各 HTML 按需 import 或覆盖局部规则。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把通用样式(字体、重置、打印适配)存成
base.css,用@import url("base.css");写在各 HTML 的<style>块顶部 - 若想彻底避免文件 I/O,把
base.css内容读成字符串,传给CSS(string=base_css_str),再与各 HTML 自定义样式合并:stylesheets=[CSS(string=base_css_str), CSS(string=local_css_str)] - 注意优先级:后加载的
CSS实例中同名规则会覆盖前面的,所以把定制样式放列表末尾
WeasyPrint 在 Linux 服务器上生成中文 PDF 失败的常见原因
错误信息通常是 FontConfig: no fonts configured 或 PDF 里中文变方框——这不是 Python 层问题,而是系统级字体链断裂。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 确认已安装中文字体包:Ubuntu/Debian 运行
sudo apt install fonts-wqy-zenhei fonts-dejavu-core;CentOS/RHEL 用yum install google-noto-sans-cjk-fonts - 强制指定字体路径:即使系统有字体,
WeasyPrint也可能找不到,用font_config.add_font("/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc") - 检查
FONTCONFIG_PATH环境变量是否被清空(某些容器环境会重置),启动 Python 前执行export FONTCONFIG_PATH=/etc/fonts
write_pdf(),真正卡点永远在路径解析、字体绑定和资源隔离——尤其当 HTML 来自不同子目录、CSS 用相对引用、服务器没装中文字体时,缺一环都会静默失败或输出乱码 PDF。


















