You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现PDF多页提取、旋转与重命名?单页代码需优化

解决Excel多页码PDF提取、旋转与重命名问题

原代码仅支持Excel「Page Num」列为单页码(如8、18)的PDF提取、旋转与重命名,当该列为多页码(如"8,18"合并为一个文件、"9-10"合并为一个文件)时无法正常工作,以下是修复方案:

原代码核心问题

  1. 直接将page_num视为单个整数,未处理多页码的字符串格式(逗号分隔离散页码、短横线分隔连续页码)
  2. 缺少多页合并到同一输出PDF的逻辑
  3. 未初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:45:21