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

WeasyPrint报错‘Document’对象无write_png属性的问题求助

解决WeasyPrint中Document对象无write_png属性的问题

错误原因分析

  1. 版本兼容问题:write_png()是WeasyPrint 52.0版本才新增的API,如果你当前安装的WeasyPrint版本低于52.0,Document对象自然没有这个方法。
  2. 代码逻辑冗余:你的循环结构会重复将两个文档的页面添加到val列表中,每次循环都生成重复的文档,不仅效率低,还可能引发意外问题。

解决方案

1. 升级WeasyPrint版本

执行以下命令升级到符合要求的版本:

pip install --upgrade weasyprint

2. 修正代码逻辑

重构页面收集与文档生成的逻辑,确保正确合并文档并调用write_png():

from datetime import datetime
import weasyprint

# 渲染两个HTML文档
pdf_letter = weasyprint.HTML(string=letter, base_url=static_url).render(
    stylesheets=[weasyprint.CSS(static_url + "/abrechnung/css/print-portrait.css")]
)
pdf_table = weasyprint.HTML(string=table).render(
    stylesheets=[weasyprint.CSS(static_url + "/abrechnung/css/print-landscape.css")]
)

# 收集所有页面,避免重复添加
all_pages = []
all_pages.extend(pdf_letter.pages)
all_pages.extend(pdf_table.pages)

# 创建合并后的文档对象
merged_doc = pdf_letter.copy(all_pages)

# 用统一时间戳命名文件,避免重名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

# 生成PDF文件
merged_doc.write_pdf(f"{timestamp}.pdf")

# 生成第一页的PNG缩略图
merged_doc.copy([merged_doc.pages[0]]).write_png(f"{timestamp}_thumbnail.png")

# 若需生成所有页面的PNG,可启用以下循环
# for idx, page in enumerate(merged_doc.pages):
#     merged_doc.copy([page]).write_png(f"{timestamp}_page_{idx+1}.png")

关键修正点

  • 移除了冗余的循环嵌套,确保页面只被收集一次
  • 使用统一的时间戳命名文件,避免因datetime.now()多次调用导致的文件名冲突
  • 明确区分合并文档与单页文档的生成逻辑,符合WeasyPrint的API使用规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:43:16