Python批量提取多份PDF首页的技术问题求助
PDF提取首页问题解决方案
1. 解决"Superfluous whitespace found in object header"报错
这个错误源于部分PDF文件格式不规范,PyPDF2对这类非标准PDF的兼容性较差。有两种解决思路:
- 放宽PyPDF2的格式检查:初始化Reader时添加
strict=False参数,跳过严格的格式校验,代码示例:pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict=False) - 换用更健壮的库:推荐使用PyMuPDF(fitz),它对各类不规范PDF的支持远优于PyPDF2,能从根源减少这类报错。
2. 修复导出文件损坏的问题
你的代码确实存在关键缺失:创建PdfFileWriter后,既没有把提取到的首页添加到写入器,也没有执行写入操作,导致生成的PDF是空文件,自然无法读取。必须补充两步:
- 用
pdf_writer.addPage(pageObj)将首页添加到写入器实例 - 用
pdf_writer.write(out)执行文件写入操作
3. 指定输出目录的方法
要确保输出目录存在,且路径拼接符合系统规范:
- 提前创建输出目录(如果不存在):用
os.makedirs(output_directory, exist_ok=True),exist_ok=True避免目录已存在时报错 - 用
os.path.join()拼接输出路径:替代手动字符串拼接,自动适配Windows/Linux的路径分隔符,示例:outputFileName = os.path.join(output_directory, f"First_Page_{entry}")
修正后的PyPDF2版本代码(兼容部分不规范PDF)
import os import PyPDF2 from PyPDF2 import PdfFileWriter, PdfFileReader input_directory = 'Fund Docs' output_directory = 'First Pages' # 确保输出目录存在 os.makedirs(output_directory, exist_ok=True) # 遍历输入目录下的文件,仅处理PDF for entry in os.listdir(input_directory): if not entry.lower().endswith('.pdf'): continue print(f"处理文件: {entry}") file_path = os.path.join(input_directory, entry) try: with open(file_path, 'rb') as pdfFileObj: # 开启宽松模式,兼容格式不规范的PDF pdfReader = PdfFileReader(pdfFileObj, strict=False) if pdfReader.numPages == 0: print(f"警告:{entry} 无页面,跳过") continue # 获取第一页 pageObj = pdfReader.getPage(0) # 拼接输出路径 outputFileName = os.path.join(output_directory, f"First_Page_{entry}") with open(outputFileName, 'wb') as out: pdf_writer = PdfFileWriter() pdf_writer.addPage(pageObj) # 添加首页 pdf_writer.write(out) # 执行写入 print(f"已生成: {outputFileName}") except Exception as e: print(f"处理{entry}失败: {str(e)}") continue
更稳定的PyMuPDF版本代码(推荐)
import os import fitz # PyMuPDF库 input_directory = 'Fund Docs' output_directory = 'First Pages' os.makedirs(output_directory, exist_ok=True) for entry in os.listdir(input_directory): if not entry.lower().endswith('.pdf'): continue print(f"处理文件: {entry}") file_path = os.path.join(input_directory, entry) try: # 打开原PDF doc = fitz.open(file_path) if len(doc) == 0: print(f"警告:{entry} 无页面,跳过") continue # 创建新PDF并插入第一页 new_doc = fitz.open() new_doc.insert_pdf(doc, from_page=0, to_page=0) # 保存到指定目录 output_path = os.path.join(output_directory, f"First_Page_{entry}") new_doc.save(output_path) # 关闭文档释放资源 new_doc.close() doc.close() print(f"已生成: {output_path}") except Exception as e: print(f"处理{entry}失败: {str(e)}") continue
内容的提问来源于stack exchange,提问作者Data_Science_Mick
相关产品推荐
相关产品推荐

