WeasyPrint报错‘Document’对象无write_png属性的问题求助
解决WeasyPrint中Document对象无write_png属性的问题
错误原因分析
- 版本兼容问题:
write_png()是WeasyPrint 52.0版本才新增的API,如果你当前安装的WeasyPrint版本低于52.0,Document对象自然没有这个方法。 - 代码逻辑冗余:你的循环结构会重复将两个文档的页面添加到
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
相关产品推荐
相关产品推荐

