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
相关产品推荐
相关产品推荐

