PyPDF2报Cannot read an empty file错误,求PDF页码溢出修复方案
问题分析与修复
错误根源
你遇到的EmptyFileError核心原因是文件打开模式错误:
- 用
w+模式打开PDF文件时,会直接清空原有文件内容,导致PdfReader读取的是一个空文件,触发报错。 - 写入PDF时误用
rb只读模式,完全无法写入内容。 - 同时你参考的旧指南使用了PyPDF2的废弃API,部分写法不符合当前版本规范。
修正后的代码
from PyPDF2 import PdfReader, PdfWriter, PageObject, Transformation for file in oopsarr: file_path = f"{path}\\{file}" # 用只读二进制模式打开原文件 with open(file_path, 'rb') as pdf_file: pdf_reader = PdfReader(pdf_file) pg1 = pdf_reader.pages[0] pg2 = pdf_reader.pages[1] # pg3 = pdf_reader.pages[2] # 原代码未用到该页面,暂时注释 # 创建空白页并处理页面合并 translated_page = PageObject.create_blank_page(None, pg2.mediabox.width, pg2.mediabox.height) # 复制页面后再做变换,避免修改原页面对象 pg2_transformed = pg2.copy() pg2_transformed.add_transformation(Transformation().translate(tx=0, ty=-400)) translated_page.merge_page(pg2_transformed) translated_page.merge_page(pg1) # 用写入二进制模式保存文件 with open(file_path, 'wb') as output_file: pdf_writer = PdfWriter() pdf_writer.add_page(translated_page) # 若需要保留原第3页,取消下面的注释 # pdf_writer.add_page(pg3) pdf_writer.write(output_file)
关键修改点说明
- 文件模式修正:读取用
rb(只读二进制),写入用wb(写入二进制),彻底避免文件清空或无法写入的问题。 - 使用
with语句:自动管理文件流,无需手动调用close(),防止资源泄漏。 - 复制页面再变换:直接修改原
pg2对象可能影响后续操作,复制后再做变换更安全。 - 移除错误的Writer初始化参数:
PdfWriter不需要传入已打开的文件对象,单独创建后再写入即可。 - 清理冗余代码:原代码中
pg3定义后未使用,暂时注释,若需要保留原第3页可取消注释添加到Writer中。
内容的提问来源于stack exchange,提问作者Sterling A.
相关产品推荐
相关产品推荐

