使用Jinja+WeasyPrint生成PDF时如何不创建中间HTML文件
跳过WeasyPrint生成中间HTML文件的实现方案
WeasyPrint原生支持直接解析内存中的HTML字符串,不需要先将渲染后的HTML写入磁盘再读取,你只需要删掉冗余的文件落盘逻辑,调整HTML类的传参方式即可。
具体修改步骤
- 删除冗余的HTML文件写入代码:也就是
with open('html_report_jinja.html', 'w') as f: f.write(html)这一整段,完全不需要执行 - 调整WeasyPrint的HTML初始化参数:原来传入本地HTML文件路径的写法,改为传入
string=html,直接把Jinja渲染完成的HTML字符串传给解析器,所有解析过程都在内存中完成,不会生成任何磁盘中间文件 - 可选配置:如果你的HTML模板中通过相对路径引用了本地静态资源(比如图片、外部CSS文件),可以在初始化HTML时加上
base_url参数指定静态资源的根目录,避免资源加载失败,例如HTML(string=html, base_url='./templates/')
核心替换代码片段
原来的文件写入+PDF生成部分替换为如下代码即可:
html = template.render(result_general = result_general_bill, result_detail_bill = result_detail_bill) css = CSS(string=''' @page {size: A4; margin: 1cm;} th, td {border: 1px solid black;} ''') # 直接传入渲染好的HTML字符串,无需落盘中间文件 HTML(string=html).write_pdf('weasyprint_pdf_report.pdf', stylesheets=[css])
修改后完整方法代码
def save_the_last_bill_to_html_pdf(self): env = Environment(loader=FileSystemLoader('templates')) # 加载模板 template = env.get_template('th_bill.html') # 查询最近一笔总账单及明细 self.connect() query_general_bill = ''' SELECT general_bill.id, general_bill.client_name , general_bill.total , general_bill.total_margin , general_bill.number_of_products , general_bill.date_g ,general_bill.time_g , users.username user_id FROM general_bill join users on general_bill.user_id = users.id WHERE general_bill.id=(SELECT MAX(id) FROM general_bill) ''' self.cursor.execute(query_general_bill) result_general_bill = self.cursor.fetchall() # 查询账单明细 query_details_bill = ''' SELECT product.product_name products, details_bill.number_of_products, details_bill.prix, details_bill.margin, details_bill.date, details_bill.time FROM details_bill join product on product.id = products WHERE details_bill.general_bill_id = (SELECT MAX(id) FROM general_bill)''' self.cursor.execute(query_details_bill) result_detail_bill = self.cursor.fetchall() html = template.render(result_general = result_general_bill, result_detail_bill = result_detail_bill) css = CSS(string=''' @page {size: A4; margin: 1cm;} th, td {border: 1px solid black;} ''') # 直接从内存中的HTML字符串生成PDF,无中间HTML文件落盘 HTML(string=html).write_pdf('weasyprint_pdf_report.pdf', stylesheets=[css])
修改后运行逻辑和原来完全一致,生成的PDF效果和之前没有区别,只是不会再额外生成html_report_jinja.html这个中间文件。
内容的提问来源于stack exchange,提问作者zaki_zardo
相关产品推荐
相关产品推荐

