首页 / 资讯中心 / 文章详情

WeasyPrint 版本演进全解读:从 v0.1 到 v70.0 的安全修复、核心功能与升级迁移指南

WeasyPrint 版本演进全解读:从 v0.1 到 v70.0 的安全修复、核心功能与升级迁移指南 ★ FEATURED ARTICLE
文档后端【免费下载链接】WeasyPrintThe awesome document factory项目地址https://gitcode.com/gh_mirrors/we/WeasyPrint点击查看免费下载本文以仓库内 docs/changelog.rst 为骨架系统梳理 WeasyPrint 从 2011 年首个打包版本 v0.1 到 2026 年 v70.0 的全部版本记录重点解读四次安全更新CVE、命令行与 Python API 的破坏性变更、CSS/PDF 能力的里程碑式扩展以及 Python 版本与系统依赖的演进路径并辅以仓库源码实现佐证。读完本文你将掌握 WeasyPrint 的版本历史全貌、各版本之间的迁移要点、常见安全风险的规避方式以及如何结合 weasyprint/ 源码理解这些变更背后的实现逻辑。一、版本记录概况15 年演进的时间线WeasyPrint 是面向打印场景的 HTML/CSS 渲染引擎可将 HTML 页面转为 PDF其 CSS 排版引擎用 Python 编写、专为分页设计见 README.rst。docs/changelog.rst 以倒序方式记录了从 v70.0 到 v0.1 的全部版本主要版本节奏如下版本区间发布时间阶段特征v0.1 – v0.42.32011-10 至 2018-03早期构建期表格、浮动、Acid2、PDF 书签/超链接、0.x 收尾v43 – v522018-10 至 2020-10现代化重构期Flexbox、target counters、自有 PDF 生成器、Pillowv53 – v602021-04 至 2023-09功能爆发期PDF/A、PDF/UA、脚注、表单、字体子集化、Gridv61 – v702024-02 至 2026-09合规与安全期PDF 变体细化、颜色管理、多次安全更新每个版本条目都遵循固定结构Security安全、Dependencies依赖、Command-line APICLI、Python API、Features新功能、Bug fixes缺陷修复、Performance性能、Documentation文档、Contributors贡献者、Backers and sponsors赞助者并关联对应的 GitHub issue/PR 编号是回溯具体变更原因的一手资料。二、安全更新四个必须关注的 CVEchangelog 中明确标注为 security update 的版本共有四个均建议用户立即升级是评估是否升级的核心依据。1. v70.02026-09-08CVE-2026-55073官方建议以下两类用户必须升级嵌入不受信任图片的用户本版本起不再渲染 EPS 图像堵住了恶意 EPS 文件可能带来的攻击面依赖 URL fetcher 过滤元数据或样式表的用户本版本起始终使用原始 URL fetcher避免过滤被绕过。该版本还配套了若干加固型变更例如 Log an error on unknown render and write_pdf options对未知渲染选项与 write_pdf 选项输出错误日志以及 Dont use f-strings in logs减少日志注入与信息泄漏风险。2. v69.02026-06-02CVE-2026-49452风险场景使用--presentational-hints选项且用受限 CSS 属性渲染不受信任的 HTML 时存在CSS 注入。修复方式是改用 HTML 解析器处理 presentational hints对应 issue #2636/#2720/#2773从解析层杜绝注入。3. v68.02026-01-19CVE-2025-68616风险场景在自定义 URL fetcher 中使用default_url_fetcher函数或使用其allowed_protocols参数。修复为HTTP 重定向一律走 URL fetcher防止协议限制被重定向绕过。仓库中 weasyprint/urls.py 的URLFetcher类正是这次重构的产物——它继承urllib.request.OpenerDirector通过allowed_protocols参数None表示允许全部协议在fetch()入口处校验 URL scheme并在构造函数中按需挂载HTTPRedirectHandler。4. v61.22024-03-08附件 URL fetcher 强制化修复 Always use URL fetcher for attachments影响范围为 v61.0 与 v61.1 用户。升级建议如果你的生产环境涉及不受信任的 HTML/图片输入或自定义了 URL fetcher应至少升级到 v68.0 及以上若还使用--presentational-hints则应升级到 v69.0 及以上当前最新安全版本为 v70.0。三、核心功能里程碑从 CSS 2.1 到 CSS Color 4 / Grid / Noteschangelog 展示了 WeasyPrint 按打印场景逐步补齐现代 CSS 能力的完整路径可归纳为五条主线。1. 布局引擎分页、浮动、Flexbox、Grid、Columnsv0.112012-07支持float与clear并因此通过 Acid2 测试Acid2 自此纳入自动化测试套件v43rc12018-10Flexbox 初始支持v62.02024-04完整支持CSS Grid Layoutissue #543/#2121随后 v62.1–v63.0 持续修复网格分页、空页首行渲染等边界问题v63.02024-10支持页面组page groups使连续页面可以共享统一的页边距盒子上下文v67.02025-12允许网格行内分页issue #2397对长表格类文档意义重大v70.02026-09支持box-shadow并将阴影标记为PDF artifactsissue #2882/#2883避免影响无障碍阅读顺序。分页相关的break-*属性在 v50表格内分页、v55.0b1列内分页、v54.1break-inside: avoid作用于tr等版本中持续完善orphans/widows早在 v0.7 即已支持。2. 颜色、渐变与颜色管理v67.0支持CMYK 颜色、PDF/X、色彩配置文件与light-dark()函数issue #640 等并新增rch、cap、rcap、rex、ic、ric等字体相对单位v63.0支持CSS Color Level 4issue #1630/#2286v69.0新增PDF output intent输出意图设置能力issue #2631/#2778可在 CLI 与 Python API 中指定 sRGB、device-cmyk 或color-profile规则标识符。仓库中 tests/draw/test_cmyk_color_profiles.py 与 weasyprint/pdf/pdfx.py 分别从测试与实现两个角度印证了 CMYK/PDF/X 的能力。3. 数学函数、单位与逻辑属性v53.0b1新增 ISO/JIS 纸张规格与leader()函数用于目录点线v67.0全面支持calc()及其他数学函数issue #357/#2568v69.0支持逻辑属性margin-inline、padding-block等issue #2357/#2700与视口单位vw/vh等issue #1194/#2702更早的 v0.19 已引入ex/ch单位v0.27 支持remv66.0 支持lh/rlh。4. 内容生成与分页媒体页眉页脚、书签、target countersv0.9PDF 书签bookmarks与内/外部超链接v0.40命名页named pagesv47CSS 变量v49::marker伪元素、recto/verso分页方向v51element()与running()running headersv54.0b1**脚注footnotes**支持由 Code Co. 资助v66.0 起持续修复多栏脚注、孤儿行脚注溢出等问题v70.0新增CSS Notes 初始支持issue #2905NLnet 资助——这是继 footnotes 之后分页媒体领域的又一内容机制。5. 文本、字体与排版细节v0.32Linux 下font-face、OpenType 特性支持v56.0b1位图字体bitmap fonts支持Expert Germany 资助v57.0b1**可变字体variable fonts**支持v63.0HarfBuzz 成为默认字体子集化引擎替换 fontToolsissue #2120/#2178v70.0 起对 fontTools 子集化路径添加弃用警告v65.0font-face的unicode-range支持v70.0COLR emoji 字体支持issue #2777/#2814并修复栅格 emoji 的位置问题。四、命令行与 Python API两次重要的破坏性变更1. v59.0全局渲染选项改为**optionsv59.0b12023-04-14对 CLI 与 Python API 做了大规模重构这是自 v53 自研 PDF 生成器之后最重要的一次 API 调整。CLI 侧--optimize-size/-O被弃用拆分为六个独立选项选项作用--uncompressed-pdf输出不压缩的 PDF--optimize-images优化嵌入图像体积--full-fonts嵌入完整字体不做子集化--hinting保留嵌入字体的 hinting 信息--dpi resolution设置图像分辨率--jpeg-quality quality设置 JPEG 压缩质量--cache-folder folder将临时数据存到磁盘目录而非内存Python API 侧HTML.render()、HTML.write_pdf()、Document.write_pdf()的签名改为**options迁移步骤为一律使用命名参数不要使用位置参数重命名参数image_cache→cache、identifier→pdf_identifier、variant→pdf_variant、version→pdf_version、forms→pdf_forms删除optimize_size参数改用uncompressed_pdf、full_fonts、hinting、dpi、jpeg_quality等新参数。cache参数支持三种形态None内存默认、字典可跨文档共享的内存缓存、目录路径或Path磁盘缓存。该实现可见于 weasyprint/document.py_build_layout_context中先判断cache是否为字典或DiskCache否则包装为DiskCache。2. v69.0--srgb变为--output-intentv69.0 将--srgb布尔开关升级为--output-intent可取三类值srgb等价于旧行为指定 sRGB 输出意图device-cmyk无 ICC 配置文件的 CMYK 文档CSScolor-profile规则中的自定义标识符。Python API 同步将默认选项中的srgb布尔值替换为output_intent字符串。在 weasyprint/document.py 中可以看到output_intent被作为Document构造参数持久化并在写入 PDF 时参与色彩空间处理。3. v70.0未知选项报错v70.0 起向render/write_pdf传入未知选项会记录错误日志帮助用户尽早发现拼写错误或版本不兼容的选项名。4. v68.0URL fetcher API 重构default_url_fetcher()函数被弃用取而代之的是 weasyprint/urls.py 中的URLFetcher类构造参数包括timeoutHTTP 请求超时秒数默认 10ssl_context自定义 HTTPS SSL 上下文http_headers附加 HTTP 请求头allowed_protocols允许的协议集合None表示全部allow_redirects是否跟随 HTTP 重定向fail_on_errorsHTTP 错误是否中止渲染。同时DocumentMetadata.generate_rdf_metadata由参数改为可覆写的方法为 Factur-X/ZUGFeRD 电子发票等自定义 RDF 元数据场景提供了扩展点详见 docs/going_further.rst 相关章节。5. 更早的 CLI/API 变更备忘v53.0--format/--resolution弃用PDF 成为唯一输出格式--optimize-images被--optimize-size取值images/fonts/all/none取代FontConfiguration迁移到weasyprint.text.fonts模块v61.0DocumentMetadata.attachments从(url, description)元组列表变为Attachment对象列表v60.0新增--timeoutCLI 选项v45新增--quiet与--debugCLI 参数。五、依赖与平台要求演进升级前必查changelog 中反复出现 Dependencies 章节以下是 Python 解释器与核心库的版本门槛时间线版本Python 要求关键依赖变化v0.37—tinycss2 取代 tinycssv0.40—cssselect2 取代 cssselect lxmlv43rc13.4放弃 Python 2.xCairo 1.15.4移除 pdfrwv523.6新增依赖 Pillowv53.0b1—自研 PDF 生成器pydyf取代 CairoFlit 打包v55.0b13.7—v62.03.9pydyf 0.10、tinycss2 1.3v63.03.13 受支持tinyhtml5 2.0 取代 html5libpydyf 0.11tinycss2 1.4v67.03.103.9 不再支持tinycss2 1.5.0、fontTools 4.59.2v65.0—CSSSelect2 0.8.0v57.1—Pillow 9.1.0v53.0—Pango 1.44.0、pydyf 0.0.3、fontTools 4.0.0值得注意的里程碑v53.0b1 起 WeasyPrint 使用自己的 PDF 生成器基于 pydyf替代 Cairo这意味着文本、渐变、SVG 图像的渲染细节从此由 WeasyPrint 自己掌控v63.0 起 HTML 解析从 html5lib 切换到 tinyhtml5v67.0 将 Python 下限提升到 3.10——如果你的运行环境仍停留在 Python 3.9这是必须规划升级的硬性门槛。六、性能与文档贯穿始终的优化主线changelog 专设 Performance 与 Documentation 章节代表性工作包括v0.40/v0.42优化长文档的速度与内存占用v52图片缓存可跨文档共享v59.0b1降低 PDF 体积与图片内存占用Code Co. 资助新增字体 hinting 保留选项v63.0大colspan表格渲染提速、HarfBuzz 子集化提速v70.0元素间共享计算样式issue #2813、均匀虚点边框改用 stroked dashes 绘制issue #2526/#2776、SVG 路径解析加速issue #2913。文档侧的重要节点包括v45 引入独立 logger 并完善自定义 url_fetcher 文档v60 补充--timeoutv63 完善 Alpine 安装说明并增加调试日志v69 补充纸张大小与方向的命令行选项说明v70 记录源码变更后自动重新生成 PDF的工作流issue #1360/#2865。完整 API 参考见 docs/api_reference.rst使用场景见 docs/common_use_cases.rst。七、迁移与升级检查清单综合 changelog 中所有带标注的破坏性变更升级到 v70.0 时可对照以下清单Python 版本确认运行环境为 Python 3.10v67.0 起并在 CPython 与 PyPy 上测试README 声明URL fetcher若自定义了 fetcher将default_url_fetcher迁移到URLFetcher子类并注意重定向、allowed_protocols语义v68.0渲染选项检查render/write_pdf的命名参数确认使用pdf_variant、pdf_version、pdf_forms、pdf_identifier、cache等新名称v59.0颜色配置如使用--srgb改用--output-intentsrgbv69.0附件元数据DocumentMetadata.attachments现在是Attachment对象列表v61.0PDF 输出意图与变体PDF/A、PDF/UA、PDF/X 相关选项见 weasyprint/pdf/pdfa.py、weasyprint/pdf/pdfua.py、weasyprint/pdf/pdfx.py安全基线优先升级到 v70.0CVE-2026-55073尤其当输入包含不受信任图片或自定义 fetcher 时。八、如何在当前仓库中进一步验证阅读完整版本记录docs/changelog.rst查看 URL fetcher 实现weasyprint/urls.py查看渲染选项与 PDF 变体处理weasyprint/document.py查看 CLI 入口--output-intent等选项weasyprint/main.py运行相关测试以复现核心能力CMYK 色彩配置 tests/draw/test_cmyk_color_profiles.py、计数与目标引用 tests/css/test_counters.py、PDF 输出 tests/test_pdf.py。从 2011 年的 simple CSS 2.1 pages 到 2026 年的 CSS Notes、COLR emoji、PDF/X 与多次 CVE 修复docs/changelog.rst 完整记录了 WeasyPrint 作为文档工厂的进化史。对于使用者而言最重要的三条主线是跟随安全版本、在破坏性 API 变更点做好迁移、以及利用 Performance/Documentation 条目评估升级带来的收益。赞分享文档后端【免费下载链接】WeasyPrintThe awesome document factory项目地址https://gitcode.com/gh_mirrors/we/WeasyPrint点击查看免费下载相关推荐Cosign 版本演进全解从 v0.1 到 v3.0 的签名能力变迁与升级迁移指南Cosign 版本演进全解从 v0.1 到 v3.0 的签名能力变迁与升级迁移指南 本篇技术指南以仓库根目录的 CHANGELOG.md https://li供应链安全云原生应用安全Streamlink 版本演进全景从 0.0.1 到 8.6 的核心变更、安全修复与迁移要点Streamlink 版本演进全景从 0.0.1 到 8.6 的核心变更、安全修复与迁移要点 导读 本文以 Streamlink 官方版本记录 docs/c音视频BTCPay Server Changelog 全解读从 1.0.4 到 2.4.3 的功能演进、安全修复与升级指南BTCPay Server Changelog 全解读从 1.0.4 到 2.4.3 的功能演进、安全修复与升级指南 本篇文章以开源自托管比特币支付处理器 B区块链金融科技后端上一篇DGA-Pool分布式追踪SkyWalking集成与调用链分析下一篇让你的PS3重获新生用webMAN-MOD打造终极游戏管理神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站