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

如何用Python的WeasyPrint生成PDF后直接打开而非保存?

实现WeasyPrint生成PDF后直接打开而非自动保存

要实现生成PDF后直接用系统默认查看器打开,而非自动保存到固定文件,可按以下思路操作:

  • 生成PDF字节流而非写入本地固定文件
  • 创建临时PDF文件供查看器读取
  • 调用系统默认程序打开临时文件
  • 可选:程序退出时自动清理临时文件

修改后的代码示例

from weasyprint import HTML
import tempfile
import webbrowser
import os
import atexit

# 你的HTML内容
string = '<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title>TEST</title></head><body><h2>Test</h2></body></html>'

# 生成PDF字节数据(不写入固定文件)
pdf_bytes = HTML(string=string, base_url='.').write_pdf()

# 创建临时PDF文件,后缀为.pdf,避免被立即删除
with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as temp_pdf:
    temp_pdf.write(pdf_bytes)
    temp_pdf_path = temp_pdf.name

# 调用系统默认PDF查看器打开临时文件
webbrowser.open(f'file://{temp_pdf_path}')

# 注册程序退出时的清理操作,删除临时文件(避免残留)
def clean_temp_file():
    if os.path.exists(temp_pdf_path):
        try:
            os.remove(temp_pdf_path)
        except PermissionError:
            # 若查看器仍在打开,可能无法删除,忽略即可
            pass

atexit.register(clean_temp_file)

代码说明

  1. 生成字节流:调用write_pdf()不带文件名参数时,会直接返回PDF的字节数据,无需预先写入本地文件。
  2. 临时文件处理:用tempfile.NamedTemporaryFile创建临时PDF文件,设置suffix='.pdf'确保系统能识别为PDF格式,delete=False防止文件在关闭时被立即删除,保证查看器能正常读取。
  3. 打开PDF:webbrowser.open会调用系统默认的PDF查看器打开临时文件,用户可在查看器中手动执行保存操作。
  4. 自动清理:通过atexit.register注册清理函数,程序退出时会尝试删除临时文件,避免残留无用文件。如果查看器仍在打开文件,可能会出现权限错误,这里用try-except忽略即可。

备选打开方式(针对webbrowser失效的情况)

如果webbrowser.open无法正常调用系统查看器,可以根据操作系统用subprocess直接调用系统命令:

import subprocess
import sys

# ... 前面的代码保持不变 ...

if sys.platform == 'win32':
    subprocess.run(['start', temp_pdf_path], shell=True)
elif sys.platform == 'darwin':
    subprocess.run(['open', temp_pdf_path])
else:
    # Linux/Unix系统
    subprocess.run(['xdg-open', temp_pdf_path])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:10:32