news 2026/11/6 1:42:21

WeasyPrint 实战指南:一条命令把 HTML 变成排版精准的 PDF

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WeasyPrint 实战指南:一条命令把 HTML 变成排版精准的 PDF

WeasyPrint 实战指南:一条命令把 HTML 变成排版精准的 PDF

【免费下载链接】WeasyPrintThe awesome document factory项目地址: https://gitcode.com/gh_mirrors/we/WeasyPrint

如果你需要把 HTML 网页、模板化的报告或存档页面输出成 PDF,WeasyPrint 是一个值得优先考虑的方案。它是一个纯 Python 的 HTML 转 PDF 转换库,不依赖浏览器内核,而是通过 Pango 完成文本渲染,因此输出结果在不同机器上保持一致。这篇指南面向刚接触它的开发和运营同学,从安装、命令行动手,讲到中文字体、自定义字体和批量处理中的几个高频坑。

安装 WeasyPrint 之前要注意什么

WeasyPrint 本身用 pip 装,但它依赖系统级的 Pango 文本渲染库,这一步经常被忽略,导致装完跑不起来。

  • Linux(Ubuntu/Debian):可以直接走发行版包管理器:

    sudo apt install weasyprint
  • Windows / macOS:在 Python 环境里执行pip install weasyprint即可(macOS 也可以用 Homebrew:brew install weasyprint)。

  • 建议装在虚拟环境里,避免和系统 Python 的依赖打架:

    python3 -m venv venv source venv/bin/activate pip install weasyprint

装完后跑一下weasyprint --info,它会打印系统、Pango 和 WeasyPrint 各自的版本,能直接确认依赖链是否完整。以后排查渲染问题,这也是第一个该看的命令。

一条命令完成 HTML 转 PDF

命令行是最快的上手方式,语法就是"输入在前,输出在后":

weasyprint input.html output.pdf

输入既可以是本地文件,也可以是 URL,适合直接做网页存档。如果想在转换时叠加一份自己的样式表,可以加-s参数指向 CSS 文件。

日常使用中还有几个参数值得记住:-m指定媒体类型(默认 print)、-e强制指定输入编码(老文件里遇到乱码时很有用)、-D限制嵌入图片的分辨率以控制 PDF 体积。完整参数清单可以用--help查看,官方文档里的 manpage.rst 也有逐项说明。

用 Python API 获得更细的控制

当转换逻辑要嵌进业务代码时,用 Python API 更合适。核心入口是HTML类,两个最常用的方法:

from weasyprint import HTML # 从 URL 或本地文件生成 HTML('https://example.com').write_pdf('web_page.pdf') # 从 HTML 字符串生成 HTML(string='<h1>我的文档</h1><p>正文内容</p>').write_pdf('report.pdf')

write_pdf适合一步到位直接出文件;如果需要先拿到文档对象再处理,就调render(),它会返回一个Document,上面有pages列表和write_pdf()等方法。API 细节可以看 api_reference.rst。

中文和自定义字体怎么配

中文字体不生效是最常见的问题,原因基本就两类:系统里没装对应字体,或者没在 CSS 里正确声明字体族。解决思路:

  1. 先确认系统已安装支持中文的字体,CSS 的font-family里写明该字体族名;
  2. 如果要用私有字体文件,用@font-face规则显式声明,并通过FontConfiguration对象让 WeasyPrint 感知它:
from weasyprint import CSS, HTML from weasyprint.text.fonts import FontConfiguration font_config = FontConfiguration() css = CSS(string=''' @font-face { font-family: MyFont; src: url(fonts/myfont.ttf); } ''', font_config=font_config)

注意FontConfiguration需要传给所有作用于同一文档的CSS对象,字体声明才会生效。字体相关的渲染逻辑集中在 weasyprint/text/fonts.py,想理解加载机制可以读一下。

提取页面子集

render()返回的Document支持按页切片。比如只导出第 2 到第 3 页(Python 切片从 0 开始计数):

document = HTML('input.html').render() document.copy(document.pages[1:3]).write_pdf('subset.pdf')

这个能力在"同一份长报告按章节拆给不同部门"的场景里很好用。

批量转换的性能建议

如果你的任务是月末批量导出几十上百份报告,别为每个文件起一次新进程。更稳的做法是:

  • 让 Python 进程长期运行,循环调用write_pdf;
  • 复用同一个FontConfiguration实例,避免每份文档都重新解析一遍字体;
  • 大批量时留意图片体积,必要时用-D(命令行)限制嵌入分辨率。

下一步建议

  • 想深入 CSS 支持范围,读一遍 docs/ 下的 first_steps 和 going_further;
  • 想理解布局是怎么算的,看 weasyprint/layout/ 里的模块;
  • 上手时先跑通weasyprint --info,再跑一条最小转换命令,字体和分页问题按本文顺序排查,基本能覆盖 90% 的初始化场景。

【免费下载链接】WeasyPrintThe awesome document factory项目地址: https://gitcode.com/gh_mirrors/we/WeasyPrint

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/6 1:41:48

项目上线那晚,我们开了哪瓶酒?一份工程师的选酒避坑实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/6 1:41:19

C# 系列教程_8 循环语句 保姆级精讲(面向新手)

前置回顾顺序结构&#xff1a;代码从上到下执行一次分支判断&#xff08;if/switch&#xff09;&#xff1a;选择性执行&#xff0c;代码最多跑一遍循环&#xff1a;让一段代码重复执行&#xff0c;直到满足退出条件。C# 4 种循环&#xff1a;while 先判断&#xff0c;后执行&a…

作者头像 李华