要实现按页码提取PDF文件并生成指定文件名的功能,可通过Python结合PyPDF2、openpyxl和tkinter库完成。以下是具体实现步骤和完整代码:
核心步骤读取Excel配置文件
从“配置文件.xlsx”中逐行读取起始页、终止页和输出文件名。
若终止页为空,则默认为PDF最后一页。
示例Excel格式:
选择PDF文件
使用tkinter.filedialog弹出文件选择窗口,获取PDF路径。
若未选择文件,提示警告。
提取指定页码并保存
根据Excel中的页码范围,从PDF中提取页面。
使用PdfWriter将提取的页面写入新文件,文件名来自Excel配置。
输出文件保存在“分割文件”文件夹中。
UI界面优化
使用tkinter创建简单界面,包含按钮触发文件选择和分割操作。
界面示例:
完整代码from tkinter import filedialog, Tk, Button, messageboxfrom PyPDF2 import PdfReader, PdfWriterimport openpyxlfrom pathlib import Path# 创建输出文件夹Path('分割文件').mkdir(parents=True, exist_ok=True)# 加载Excel配置文件workbook = openpyxl.load_workbook("配置文件.xlsx")sht = workbook.activedef FileOpen(): file_path = filedialog.askopenfilename( initialdir=".", title="Select PDF File", filetypes=(("PDF files", "*.pdf"),) ) if not file_path: messagebox.showwarning("警告!", "未选择文件!") return # 读取PDF总页数 pdf_obj_reader = PdfReader(file_path) max_page = len(pdf_obj_reader.pages) # 遍历Excel每一行 for row in sht.iter_rows(min_row=2): # 跳过表头 row_data = [cell.value for cell in row] begin, end, name = row_data # 处理终止页为空的情况 if end is None: end = max_page # 校验页码合法性 if begin < 1 or end > max_page or begin > end: print(f"错误:页码范围 {begin}-{end} 不合法!") continue # 提取页面并保存 pdf_obj_writer = PdfWriter() for page_num in range(begin - 1, end): # 页码从0开始 pdf_obj_writer.add_page(pdf_obj_reader.pages[page_num]) output_path = Path(f'分割文件/{name}.pdf') with open(output_path, 'wb+') as output_file: pdf_obj_writer.write(output_file) print(f"已生成:{output_path}")# 创建UI界面root = Tk()root.title("PDF分割软件")width, height = 180, 80x = (root.winfo_screenwidth() // 2) - (width // 2)y = (root.winfo_screenheight() // 2) - (height // 2)root.geometry(f'{width}x{height}+{x}+{y}')Button(root, text='打开PDF', font=("Times new roman", 12), command=FileOpen).pack(side='top')root.mainloop()关键点说明页码处理
Python中PDF页码从0开始,而Excel中通常从1开始,因此需对begin减1。
终止页end直接使用Excel中的值(无需减1,因range不包含终点)。
错误处理
检查文件是否选择、页码是否合法(如起始页大于终止页)。
若Excel中终止页为空,自动赋值为PDF总页数。
文件输出
使用Path处理路径,确保跨平台兼容性。
输出文件按Excel中的name字段命名,扩展名为.pdf。
扩展优化- 批量处理:支持拖拽多个PDF文件到界面,自动遍历分割。
- 进度显示:在UI中添加进度条,实时反馈分割状态。
- 日志记录:将分割结果写入日志文件,便于追踪。
通过上述方法,可高效实现PDF按页码分割并自定义文件名,适用于批量处理文档的场景。