概念
本文为项目《自动提取pdf指定页》的最终篇,前面已经通过 项目概述、文件处理篇、pdf处理篇、ui处理篇 四篇内容向读者展示了项目的背景,设计等相关内容,不明白的读者可以向前翻阅查看,而本文主要是在前面基础类(文件类、pdf类、界面类)设计的基础上,调用相关方法,实现项目功能。
核心
1. 创建窗口对象,并设置属性。项目把窗口放在了屏幕正中央。
# 界面处理 # 返回窗口对象 def new_windows(self): # 新建窗口,显示居中,宽高不可变 form = self.my_tk.new_form('pdf拆解工具') self.my_tk.set_form_centre(form, 230, 32) return form
2. 选择目录,直接调用f_tkinter类中的打开目录方法实现。
# 选择目录 def select_dir(self): self.dir = self.my_tk.open_dir("/", "请选择要处理的目录")
3.pdf提取指定页,项目中的核心方法。通过3步实现。
第一步:判断待处理路径是否合法。
第二步:获取指定路径下所有以.pdf结尾的文件。
第三步:处理pdf(提取指定页码)。
# pdf文件处理,处理策略:将选中目录下所有命名为xx*.pdf文件(xx代表数字),只留下xx所代表的页码,其余页全部删除 def handle_file(self): # 1. 路径合法性判断 if not self.my_file.is_dir(self.dir): self.my_tk.show_msg('友情提示', '要先选择正确的目录哦!') return # 2. 获取路径下所有.pdf结尾的文件 files = self.my_file.get_type_files(self.dir, ".pdf", []) print(files) if len(files) == 0: self.my_tk.show_msg('友情提示', '未找到符合条件的文件!') return # 3. 处理pdf文件 for file in files: page = self.get_page_num(file) # 获取页码 if page == -1: continue # 页码处理,转换成 xx-xx的格式 start = str(page).zfill(2) end = str(page+1).zfill(2) page_str = start + '-' + end # 保存指定页到新文件,并删除旧文件 if self.my_pdf.save_page(file, self.my_file.get_new_file_name(file), page_str): self.my_file.del_file(file) self.my_tk.show_msg('友情提示', '恭喜你,处理完成!')
4. 项目执行,通过创建按钮,并绑定目录选择和文件处理方法。只需用户点击相应的按钮即可完成所有功能。
my_main = f_main() # 创建主函数对象 window = my_main.new_windows() # 创建窗口 # 创建两个按钮对象,用于相应选择目录和处理pdf文件操作 my_main.my_tk.new_btn('选择目录', my_main.select_dir, 10, 0, 0) my_main.my_tk.new_btn('开始处理', my_main.handle_file, 20, 0, 1) window.mainloop() # 进入消息循环
示例
★f_main对象(主函数类):
属性:
my_tk - ui界面对象
my_pdf - pdf处理对象
my_file - 文件处理对象
dir - 存储待处理目录路径
行为:创建界面、选择目录、文件处理等。
★ 项目功能实现:
创建f_main对象 -> 创建窗口 -> 创建选择目录按钮(绑定选择目录方法) -> 创建文件处理按钮(绑定文件处理方法) -> 消息循环。
由上可以看出,功能的执行主要通过用户点击选择目录和文件处理按钮响应执行完成。
f_main.py
from f_file import * from f_pdf import * from f_tkinter import * class f_main(object): # 构造函数,创建主要对象 def __init__(self): self.my_tk = f_tkinter() self.my_pdf = f_pdf() self.my_file = f_file() # 界面处理 # 返回窗口对象 def new_windows(self): # 新建窗口,显示居中,宽高不可变 form = self.my_tk.new_form('pdf拆解工具') self.my_tk.set_form_centre(form, 230, 32) return form # 选择目录 def select_dir(self): self.dir = self.my_tk.open_dir("/", "请选择要处理的目录") # 通过文件名前两位获取待处理页码 file:文件全名 # 返回页码指,-1表示页码获取失败 def get_page_num(self, file): name = self.my_file.get_name(file) page = name[0:2] if not page.isdigit() or page == "": print("unknown") return -1 else: num = int(page) if num < 1: print("unknown") return -1 print(num) return num # pdf文件处理,处理策略:将选中目录下所有命名为xx*.pdf文件(xx代表数字),只留下xx所代表的页码,其余页全部删除 def handle_file(self): # 1. 路径合法性判断 if not self.my_file.is_dir(self.dir): self.my_tk.show_msg('友情提示', '要先选择正确的目录哦!') return # 2. 获取路径下所有.pdf结尾的文件 files = self.my_file.get_type_files(self.dir, ".pdf", []) print(files) if len(files) == 0: self.my_tk.show_msg('友情提示', '未找到符合条件的文件!') return # 3. 处理pdf文件 for file in files: page = self.get_page_num(file) # 获取页码 if page == -1: continue # 页码处理,转换成 xx-xx的格式 start = str(page).zfill(2) end = str(page+1).zfill(2) page_str = start + '-' + end # 保存指定页到新文件,并删除旧文件 if self.my_pdf.save_page(file, self.my_file.get_new_file_name(file), page_str): self.my_file.del_file(file) self.my_tk.show_msg('友情提示', '恭喜你,处理完成!') my_main = f_main() # 创建主函数对象 window = my_main.new_windows() # 创建窗口 # 创建两个按钮对象,用于相应选择目录和处理pdf文件操作 my_main.my_tk.new_btn('选择目录', my_main.select_dir, 10, 0, 0) my_main.my_tk.new_btn('开始处理', my_main.handle_file, 20, 0, 1) window.mainloop() # 进入消息循环
结论
软件操作步骤如下:
1. 双击打开软件,如下图所示。
![]()
2. 点击选择目录按钮,选择目录(张三),如下图所示。
![]()
说明:张三目录下存放了2011年和2012年两个目录,其中每个目录下存放了张三当年的工资信息文档,如下图所示。
![]()
3. 点击开始处理按钮,软件自动提取pdf文件指定页,完成之后弹出对话框提示用户,如下图所示。
![]()
4. 此时查看张三目录下文件情况,根据大小我们可以看出已经成功提取了文件指定页信息。
![]()
到此,整个项目就已经结束了,需要源码的小伙伴可以在公众号后台回复“pdf拆解源码”获取,将所有源码通过pyinstaller工具打包,生成exe文件,后期使用只需要双击exe文件即可。
往期 · 推荐
帮你自动化办公的python-自动提取pdf指定页(文件处理篇)
帮你自动化办公的python-自动提取pdf指定页(项目概述)
也没想象中那么神秘的数据结构-一种通用化的双向链表设计(底层源码)
关注
更多精彩内容,请关注微信公众号:不只会拍照的程序猿,本人致力分享linux、设计模式、C语言、嵌入式、编程相关知识,也会抽空分享些摄影相关内容,同样也分享大量摄影、编程相关视频和源码,另外你若想要本文章源码请关注公众号:不只会拍照的程序猿,后台回复:PDF拆解源码,也可点击此处下载。