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

如何优化Python脚本:内存处理HTML转PDF并仅单次写入磁盘

解决方案

要实现内存中处理所有PDF内容并仅写入磁盘一次,你可以直接从pdfkit获取内存中的PDF字节流,用pdfrw.PdfReader读取后将页面添加到PdfWriter,再处理图片生成的PDF页,最后一次性写入输出文件。

关键调整点

  • 调用pdfkit.from_string时不指定输出文件,直接获取返回的PDF字节流(pdfkit支持返回字节数据)
  • 遍历PdfReader的pages属性,将HTML生成的PDF页面逐个添加到PdfWriter,避免重复读写磁盘
  • 图片生成的PDF页仍保持内存处理逻辑,最后统一写入磁盘

完整修正代码

# Usage:
# cat test.html | python3 script.py out.pdf img1.png img2.jpg

from pdfrw import PdfReader, PdfWriter
from fpdf import FPDF
import pdfkit
import sys

OUTPUT_FILE = sys.argv[1]
# 读取stdin中的HTML内容
html_content = "".join(sys.stdin.readlines())

# 初始化PDF写入器
writer = PdfWriter()

# 1. 处理HTML生成的PDF(内存中操作)
pdf_bytes = pdfkit.from_string(html_content)
html_pdf_reader = PdfReader(fdata=pdf_bytes)
for page in html_pdf_reader.pages:
    writer.addpage(page)

# 2. 处理附加的图片(内存中生成单页PDF并添加)
for img_path in sys.argv[2:]:
    fpdf = FPDF()
    fpdf.add_page()
    fpdf.image(img_path)
    # 将fpdf生成的PDF转为字节流,再用PdfReader读取
    img_pdf_bytes = bytes(fpdf.output())
    img_pdf_reader = PdfReader(fdata=img_pdf_bytes)
    writer.addpage(img_pdf_reader.pages[0])

# 3. 一次性将所有内容写入磁盘
writer.write(OUTPUT_FILE)

问题原因说明

你之前的第一种写法writer = PdfWriter(trailer=PdfReader(fdata=pdf))中,trailer参数仅用于设置PDF的trailer对象,并非直接加载页面的正确方式,因此无法导入HTML生成的页面。正确的做法是遍历PdfReader的pages属性,逐个将页面添加到PdfWriter中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:35:09