如何优化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
相关产品推荐
相关产品推荐

