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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:31:14