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

如何使用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字节流,示例如下:

  1. 先安装Playwright依赖:pip install playwright && playwright install chromium
  2. 转换部分代码替换为:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:36:02