Python写一个脚本——30行代码——1秒实现PDF任意页码拆分

一、引入库

import os
from PyPDF2 import PdfReader, PdfWriter

二、定义拆分方法

def split_pdf(input_path, output_dir, ranges):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    with open(input_path, 'rb') as file:
        pdf = PdfReader(file)
        total_pages = len(pdf.pages)

        for i, page_range in enumerate(ranges):
            start, end = map(int, page_range.split('-'))
            start = max(1, min(start, total_pages))
            end = max(start, min(end, total_pages))

            writer = PdfWriter()
            for page_num in range(start-1, end):  # PyPDF2页码从0开始
                writer.add_page(pdf.pages[page_num])

            output_path = os.path.join(output_dir, f'split_{i+1}_{start}-{end}.pdf')
            with open(output_path, 'wb') as output_file:
                writer.write(output_file)

三、运行主程序

if __name__ == '__main__':
    input_pdf = 'input.pdf'  # 输入PDF路径
    output_dir = 'output'    # 输出目录
    page_ranges = [          # 自定义拆分范围
        '1-5',              # 第1-5页
        '6-20',              # 第6-20页
        '21-104'              # 第21-104页
    ]

    split_pdf(input_pdf, output_dir, page_ranges)
    print(f'PDF拆分完成,结果保存在 {output_dir} 目录')

四、关键点

1.enumerate(ranges) 的用法
range()‌ 函数生成一个整数序列,常用于循环迭代。例如 range(5) 生成 0, 1, 2, 3, 4。
‌enumerate()‌ 用于将一个可迭代对象(如 range() 生成的对象)转换为索引-值对的枚举对象。例如:

ranges = range(3, 6)  # 生成序列 3, 4, 5
for index, value in enumerate(ranges):
    print(f"索引: {index}, 值: {value}")

输出:

索引: 0, 值: 3
索引: 1, 值: 4
索引: 2, 值: 5

2. 变量page_range,比如字符串"3-5"。split('-')方法会将这个字符串拆分成列表['3', '5']。然后map(int, ...)会把每个元素转换成整数,得到3和5。接着通过解包赋值给start和end,变成start=3,end=5

五、完整代码

import os  # 导入操作系统模块,用于文件和目录操作
from PyPDF2 import PdfReader, PdfWriter  # 从PyPDF2库中导入PdfReader和PdfWriter类

def split_pdf(input_path, output_dir, ranges):
    """
    拆分PDF文件
    :param input_path: 输入PDF路径
    :param output_dir: 输出目录
    :param ranges: 页码范围列表,例如 ['1-3', '4-5', ...]
    """
    # 如果输出目录不存在,则创建该目录
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 以二进制读模式打开输入PDF文件
    with open(input_path, 'rb') as file:
        pdf = PdfReader(file)  # 读取PDF文件
        total_pages = len(pdf.pages)  # 获取PDF文件的总页数

        # 遍历每个页码范围
        for i, page_range in enumerate(ranges):
            # 将页码范围字符串拆分为起始页和结束页,并转换为整数
            start, end = map(int, page_range.split('-'))
            # 确保起始页和结束页在有效范围内
            start = max(1, min(start, total_pages))
            end = max(start, min(end, total_pages))

            writer = PdfWriter()  # 创建一个PdfWriter对象
            # 遍历页码范围内的每一页
            for page_num in range(start-1, end):  # PyPDF2页码从0开始,所以减1
                writer.add_page(pdf.pages[page_num])  # 将页面添加到PdfWriter对象中

            # 构建输出文件路径
            output_path = os.path.join(output_dir, f'split_{i+1}_{start}-{end}.pdf')
            # 以二进制写模式打开输出文件
            with open(output_path, 'wb') as output_file:
                writer.write(output_file)  # 将PdfWriter对象写入输出文件

if __name__ == '__main__':
    input_pdf = 'input.pdf'  # 输入PDF文件路径
    output_dir = 'output'    # 输出目录
    page_ranges = [          # 自定义拆分范围
        '1-5',               # 第1-5页
        '6-20',              # 第6-20页
        '21-104'             # 第21-104页
    ]

    # 调用split_pdf函数拆分PDF文件
    split_pdf(input_pdf, output_dir, page_ranges)
    print(f'PDF拆分完成,结果保存在 {output_dir} 目录')  # 打印完成信息

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值