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

PyPDF2生成PDF异常:为何无法生成107个不同页面?

问题原因与修复方案

你的问题出在重复使用同一个临时文件new.pdf,循环中每次生成新页面时覆盖这个文件,但操作系统的文件IO可能存在缓存延迟——调用myCanvas.save()后,数据可能还没完全写入磁盘,就立刻用PyPDF2读取这个文件,导致读取到的是上一次循环的旧内容,最终出现页面重复的情况,而且因为缓存时机不确定,每次重复的页面都不一样。

修复方案:用内存流替代磁盘文件

最简洁高效的解决方式是使用内存流(BytesIO)处理临时PDF内容,完全绕开磁盘文件的缓存问题:

import PyPDF2
import os
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
from reportlab.lib.pagesizes import A4, landscape
from io import BytesIO

font_h = 55*mm
page_width = 297*mm
page_height = 210*mm

pdfWriter = PyPDF2.PdfWriter()

for number in range(1, 108):
    number_str = str(number)
    # 用BytesIO在内存中生成PDF内容,无需磁盘文件
    buffer = BytesIO()
    myCanvas = canvas.Canvas(buffer, pagesize=landscape(A4))
    myCanvas.setFont('Helvetica-Bold', font_h)
    myCanvas.drawString(page_width/2 - myCanvas.stringWidth(number_str)/2, page_height/2 - font_h, number_str)
    myCanvas.save()
    
    # 将内存流指针移到开头,准备读取内容
    buffer.seek(0)
    pdfReader = PyPDF2.PdfReader(buffer)
    page = pdfReader.pages[0]
    pdfWriter.add_page(page)
    buffer.close()

pdfOut = open('wynik.pdf', 'wb')
pdfWriter.write(pdfOut)
pdfOut.close()

os.startfile('wynik.pdf')

方案优势

  • 彻底避免文件IO缓存问题:所有临时数据都在内存中传递,读取的内容始终是刚生成的最新页面。
  • 简化代码:去掉了不必要的列表lista,直接遍历数字范围。
  • 无临时文件残留:不需要创建和清理大量磁盘临时文件,运行更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:20:02