一、引入库
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} 目录') # 打印完成信息