用Python+PyPDF2+pdfplumber拆分学生PDF并按信息命名单页
解决多页学生PDF拆分并按姓名ID命名的问题
你的代码目前仅能生成最后一页的PDF文件,且所有文件都用第一页的学生信息命名,核心问题是文件名提取逻辑未与每页拆分逻辑绑定,同时存在模块缺失和缩进错误。以下是修正后的完整代码及关键说明:
修正后的代码
from PyPDF2 import PdfReader, PdfWriter import pdfplumber def pdf_splitter(path): # 读取整个PDF文件 pdf_reader = PdfReader(path) # 遍历每一页进行处理 for page_num in range(len(pdf_reader.pages)): # 初始化PDF写入器,添加当前页 pdf_writer = PdfWriter() pdf_writer.add_page(pdf_reader.pages[page_num]) # 提取当前页的学生信息生成文件名 with pdfplumber.open(path) as pdf: current_page = pdf.pages[page_num] txt = current_page.extract_text().split() try: # 根据文本中的关键词定位姓名和ID student_tag_idx = txt.index('Student:') last_name = txt[student_tag_idx + 1].rstrip(',') # 移除姓氏后的逗号 first_name = txt[student_tag_idx + 2] id_tag_idx = txt.index('ID:') student_id = txt[id_tag_idx + 1] output_filename = f'{last_name} - {first_name} - {student_id}.pdf' except ValueError: # 若某页格式异常,用页码作为备用命名 output_filename = f'未识别信息_第{page_num + 1}页.pdf' print(f"第{page_num + 1}页未找到学生信息,使用默认命名") # 将当前页写入新文件 with open(output_filename, 'wb') as out_file: pdf_writer.write(out_file) print(f'已生成文件: {output_filename}') if __name__ == '__main__': path = 'file.pdf' pdf_splitter(path)
关键改动说明
- 补充必要导入:添加
from PyPDF2 import PdfReader, PdfWriter,原代码缺少该模块会直接报错。 - 循环内绑定处理逻辑:将文件名提取、页面写入逻辑全部放入循环内部,确保每一页都单独生成对应文件名的PDF。
- 针对当前页提取信息:不再固定读取第一页,而是根据循环的
page_num获取当前页的文本内容,匹配对应学生的姓名和ID。 - 异常容错处理:增加
try-except块,避免因某一页格式异常导致程序中断,自动生成备用文件名。 - 变量名优化:将
id改为student_id,避免与Python内置函数id()冲突。 - 修正缩进错误:调整代码块缩进,确保循环内的逻辑能被正确执行。
内容的提问来源于stack exchange,提问作者Lswizzle
相关产品推荐
相关产品推荐

