如何用Python实现PDF多页提取、旋转与重命名?单页代码需优化
解决Excel多页码PDF提取、旋转与重命名问题
原代码仅支持Excel「Page Num」列为单页码(如8、18)的PDF提取、旋转与重命名,当该列为多页码(如"8,18"合并为一个文件、"9-10"合并为一个文件)时无法正常工作,以下是修复方案:
原代码核心问题
- 直接将
page_num视为单个整数,未处理多页码的字符串格式(逗号分隔离散页码、短横线分隔连续页码) - 缺少多页合并到同一输出PDF的逻辑
- 未初始化
sheet变量,无法添加Excel注释
修复后的完整代码
import PyPDF2 import pandas as pd from openpyxl import load_workbook # 读取Excel数据和工作簿(用于添加注释) excel_path = "C:\\Users\\rc06587\\OneDrive - Ryan LLC\\Desktop\\PDF Tool\\Sample.xlsx" df = pd.read_excel(excel_path) wb = load_workbook(excel_path) sheet = wb.active def parse_page_numbers(page_str): """解析页码字符串,支持逗号分隔离散页码和短横线分隔连续页码""" page_list = [] if pd.isna(page_str): return page_list # 按逗号分割成多个片段 parts = str(page_str).split(',') for part in parts: part = part.strip() if '-' in part: # 处理连续页码(如9-10) try: start_page, end_page = map(int, part.split('-')) page_list.extend(range(start_page, end_page + 1)) except ValueError: continue else: # 处理单个页码 try: page_num = int(part.strip()) page_list.append(page_num) except ValueError: continue # 去重并排序 return sorted(list(set(page_list))) for index, row in df.iterrows(): pdf_path = row['File Path'] page_num_str = row['Page Num'] rotation_angle = row['Rotation Angle'] save_as = row['New PDF Name'] # 转换旋转角度 if rotation_angle == 'R': rotation_angle = 90 elif rotation_angle == 'U': rotation_angle = 180 elif rotation_angle == 'L': rotation_angle = -90 elif rotation_angle == 'D': rotation_angle = 0 # -180度旋转等同于不旋转,用0更直观 else: rotation_angle = 0 # 解析页码列表 page_numbers = parse_page_numbers(page_num_str) if not page_numbers: sheet.cell(row=index+2, column=6).comment = "Invalid Page Numbers" continue try: with open(pdf_path, 'rb') as file: pdf_reader = PyPDF2.PdfFileReader(file) total_pages = pdf_reader.getNumPages() pdf_writer = PyPDF2.PdfFileWriter() has_invalid_page = False for page_num in page_numbers: if page_num < 1 or page_num > total_pages: has_invalid_page = True continue # 提取目标页码(PyPDF2采用0索引) page = pdf_reader.getPage(page_num - 1) page.rotateClockwise(rotation_angle) pdf_writer.addPage(page) # 写入输出PDF if pdf_writer.getNumPages() > 0: with open(save_as, 'wb') as new_file: pdf_writer.write(new_file) else: sheet.cell(row=index+2, column=6).comment = "No Valid Pages to Extract" # 添加页码越界注释 if has_invalid_page: sheet.cell(row=index+2, column=6).comment = "Some Pages Exceeded Total Pages" except Exception as e: sheet.cell(row=index+2, column=6).comment = f"Error: {str(e)}" # 保存Excel中的注释 wb.save(excel_path)
代码关键说明
parse_page_numbers函数:解析多种格式的页码字符串,转换成有序的整数页码列表,支持离散页码(如"8,18")和连续页码范围(如"9-10")- 多页合并逻辑:将同一行的所有目标页码提取、旋转后,统一添加到同一个
PdfFileWriter实例,最后一次性写入输出文件 - Excel注释修复:使用
openpyxl加载工作簿,处理完成后保存注释,解决原代码中sheet未初始化的问题 - 错误处理:捕获异常并添加对应注释,避免程序中断
内容的提问来源于stack exchange,提问作者Sai Teja
相关产品推荐
相关产品推荐

