工具分享05 | Python制作PDF合并拆分提取工具V1.0
文章目录
- 🏳️🌈 1. 运行流程
- 1.1 工具面板
- 1.2 PDF文件拆分
- 1.3 PDF文件合并
- 1.4 提取PDF页面
- 1.5 按PDF文件名排序
- 1.6 按PDF文件大小排序
- 1.7 按PDF文件页数排序
- 🏳️🌈 2. 绘制
- 2.1 框架结构布局
- 2.2 添加菜单
- 2.3 文件选择部分
- 2.4 添加文件
- 2.5 文件操作
- 🏳️🌈 3. 更多可视化项目源码+数据
大家好,我是 👉 【Python当打之年(点击跳转)】
本期使用Python的Tkinter制作 PDF合并拆分提取工具,主要功能:
- 合并功能:将列表中的PDF文件按顺序合并成一个新的PDF文件,可以设置输出文件名称。
- 拆分功能:拆分单个PDF文件,生成多个新的PDF文件,支持多种页码范围格式(如 “1-3,5,7-9”),可以设置输出目录。
- 提取功能:提取PDF文件中指定范围页码,生成一个新的PDF文件,同样支持多种页码范围格式(如 “1-3,5,7-9”),可以设置输出文件名称。
希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。
往期分享:
工具分享04 | Python高级图片处理工具
工具分享03 | Python屏幕点击抢票工具,告别拼手速时代
工具分享02 | Python批量文件重命名工具
工具分享01 | Python福彩双色球数据爬取+分析工具
🏳️🌈 1. 运行流程
1.1 工具面板
1.2 PDF文件拆分
会根据设置的页码范围将PDF文件拆分成几个文件。
例如设置的 1-3,5,7-9 指的是:将文件拆分成第1-3页一个文件,第5页一个文件,第7-9页一个文件,其余部分一个文件,这里一共生成4个文件。
结果:
打开开看页数:
1.3 PDF文件合并
这里使用前面拆分的文件:编码规范中文版_pages_1-3.pdf,编码规范中文版_pages_7-9.pdf,文件页数均为3页,合并后文件页数应为6页。
结果:
打开开看页数:
1.4 提取PDF页面
这里我们提取第1-10页:
打开开看页数:
1.5 按PDF文件名排序
1.6 按PDF文件大小排序
1.7 按PDF文件页数排序
🏳️🌈 2. 绘制
2.1 框架结构布局
def create_widgets(self):"""创建所有界面组件"""# 主框架self.main_frame = ttk.Frame(self.root, padding="15", style="MainFrame.TFrame")self.main_frame.pack(fill=tk.BOTH, expand=True)# 创建菜单self.create_menu()# 文件选择部分self.create_file_section()# 功能选择部分self.create_function_section()# 按钮框架self.button_frame = ttk.Frame(self.main_frame, style="MainFrame.TFrame")self.button_frame.pack(pady=(15, 0), fill=tk.X)self.execute_button = ttk.Button(self.button_frame,text="执行",command=self.start_operation,style="Green.TButton",)self.execute_button.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 10))self.cancel_button = ttk.Button(self.button_frame,text="取消",command=self.cancel_operation,style="Red.TButton",state=tk.DISABLED)self.cancel_button.pack(side=tk.LEFT, fill=tk.X, expand=True)# 进度条self.progress = ttk.Progressbar(self.main_frame,orient=tk.HORIZONTAL,length=100,mode='determinate',style="Horizontal.TProgressbar",)self.progress.pack(fill=tk.X, pady=(10, 0))# 状态栏self.status_var = tk.StringVar(value="准备就绪!")self.status_bar = ttk.Label(self.root,textvariable=self.status_var,padding=[15,5])self.status_bar.pack(fill=tk.X, side=tk.BOTTOM)
2.2 添加菜单
def create_menu(self):"""创建菜单系统"""menu_bar = tk.Menu(self.root)file_menu = tk.Menu(menu_bar, tearoff=0)help_menu.add_command(label="联系作者", command=self.about_command)menu_bar.add_cascade(label="帮助", menu=help_menu)self.root.config(menu=menu_bar)
2.3 文件选择部分
def create_file_section(self):"""创建文件选择部分"""file_frame = ttk.LabelFrame(self.main_frame,text="PDF 文件",padding="10",style="Bold.TLabelframe")file_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 15))list_frame = ttk.Frame(file_frame)list_frame.pack(fill=tk.BOTH, expand=True)self.file_tree = ttk.Treeview(list_frame,columns=('size', 'pages', 'path'),show='headings',selectmode='extended')self.file_tree.heading('size', text=' 大小', anchor=tk.W)self.file_tree.heading('pages', text=' 页数', anchor=tk.W)self.file_tree.heading('path', text=' 路径', anchor=tk.W)self.file_tree.column('size', width=80, anchor=tk.W)self.file_tree.column('pages', width=60, anchor=tk.W)self.file_tree.column('path', width=400, anchor=tk.W)self.file_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
2.4 添加文件
def add_files(self):"""添加PDF文件到列表"""files = filedialog.askopenfilenames(title="选择 PDF 文件",filetypes=[("PDF 文件", "*.pdf"), ("所有文件", "*.*")])if files:new_files = [f for f in files if f notin self.pdf_files]ifnot new_files:self.update_status("没有添加新文件")returnself.pdf_files.extend(new_files)self.update_file_list()self.update_status(f"已添加 {len(new_files)} 个文件 (总共 {len(self.pdf_files)} 个)")
2.5 文件操作
def merge_pdfs(self):output_path = filedialog.asksaveasfilename(title="保存 PDF",defaultextension=".pdf",filetypes=[("PDF 文件", "*.pdf")],initialfile=self.output_name.get())ifnot output_path or self.operation_cancelled:self.update_status("操作已取消")returntry:merger = PdfMerger()total_files = len(self.pdf_files)success_count = 0for i, pdf_file in enumerate(self.pdf_files):if self.operation_cancelled:breaktry:with open(pdf_file, 'rb') as f:merger.append(f)success_count += 1except PdfReadError:self.update_status(f"警告: 无法读取文件 {os.path.basename(pdf_file)} - 已跳过")continueexcept Exception as e:self.update_status(f"警告: 处理文件 {os.path.basename(pdf_file)} 时出错 - {str(e)} - 已跳过")continueif self.operation_cancelled:self.update_status("操作已取消")self.reset_progress()returnif success_count == 0:self.update_status("处理失败 - 没有有效的PDF文件")self.reset_progress()returnwith open(output_path, 'wb') as output_file:merger.write(output_file)merger.close()except Exception as e:ifnot self.operation_cancelled:messagebox.showerror("错误", f"{str(e)}")self.update_status("处理 PDF 时出错")
🏳️🌈 3. 更多可视化项目源码+数据
点击跳转:【全部可视化项目源码+数据】
以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享(注明出处)让更多人知道。