如何使用Python将HTML页面转为PDF并直接上传至AWS S3存储桶
Python实现HTML转PDF直接上传S3方案
核心思路
全程在内存中完成操作:先获取目标HTML内容,直接生成PDF字节流,将字节流作为参数传入S3上传接口,完全不需要在本地生成临时文件。
依赖安装
需要安装的第三方库如下:pip install weasyprint boto3 requests
- weasyprint:负责将HTML转换为PDF,支持直接输出字节流
- boto3:AWS官方Python SDK,用于操作S3
- requests:用于抓取在线网页的HTML内容(如果是本地HTML字符串可以不用装)
完整实现代码
import requests import boto3 from weasyprint import HTML # 抓取目标网页HTML resp = requests.get("https://google.com") resp.raise_for_status() # 请求失败会抛出异常,可根据需求调整 # 内存中直接转PDF为字节流 pdf_byte_data = HTML(string=resp.text).write_pdf() # 初始化S3客户端,凭证自动从环境变量、本地AWS配置文件或云资源IAM角色读取 s3 = boto3.client("s3") # 直接上传字节流到S3 s3.put_object( Bucket="替换为你的S3桶名称", Key="替换为S3上的保存路径,例如pdf/google.pdf", Body=pdf_byte_data, ContentType="application/pdf" # 配置后可直接在浏览器预览PDF,无需下载 )
特殊场景适配
如果目标网页有大量动态JS渲染的内容,WeasyPrint无法解析JS,可替换为Playwright生成PDF字节流,示例如下:
- 先安装Playwright依赖:
pip install playwright && playwright install chromium - 转换部分代码替换为:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://google.com", wait_until="networkidle") # 等待页面加载完成 pdf_byte_data = page.pdf() # 直接返回PDF字节流 browser.close() # 后续S3上传逻辑和上面完全一致
注意事项
- 不要在代码中硬编码AWS AK/SK,优先使用环境变量、
~/.aws/credentials配置文件或者云服务的IAM角色授权,避免凭证泄露。 - 转换单页普通网页时内存开销极低,若需要转换超大型长页面,可根据实际情况调整内存配置。
内容的提问来源于stack exchange,提问作者Souren Ghosh
相关产品推荐
相关产品推荐

