文章目录
大家好,我是 👉 【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("没有添加新文件")
return
self.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("操作已取消")
return
try:
merger = PdfMerger()
total_files = len(self.pdf_files)
success_count = 0
for i, pdf_file in enumerate(self.pdf_files):
if self.operation_cancelled:
break
try:
with open(pdf_file, 'rb') as f:
merger.append(f)
success_count += 1
except PdfReadError:
self.update_status(f"警告: 无法读取文件 {os.path.basename(pdf_file)} - 已跳过")
continue
except Exception as e:
self.update_status(f"警告: 处理文件 {os.path.basename(pdf_file)} 时出错 - {str(e)} - 已跳过")
continue
if self.operation_cancelled:
self.update_status("操作已取消")
self.reset_progress()
return
if success_count == 0:
self.update_status("处理失败 - 没有有效的PDF文件")
self.reset_progress()
return
with 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. 更多可视化项目源码+数据
以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享(注明出处)让更多人知道。