在日常工作和学习中,我们常常会遇到需要处理PDF文件的情况,例如合并多个PDF文档,拆分成单页或指定页数的PDF等。为了更方便地处理这些任务,今天我们将利用Python和Tkinter库,创建一个简易的PDF工具。这个工具包括PDF合并和PDF拆分两个功能,操作简单,界面友好。
功能介绍
①PDF合并工具
新增一个PDF:点击该按钮可进行PDF的选择,需要注意的是依次选择的顺序就是进行合并的顺序,选择结果会在上面edit框内显示。
删除一个PDF:点击可实现新增PDF的删除。
路径保存:一定要记得选一下路径,然后在弹出框对合并后的文件进行命名。
合并:点击即可进行合并
②PDF拆分工具
选择一个PDF:点击该按钮可进行PDF的选择,选择结果会在上面edit框内显示。
路径保存:一定要记得选一下路径,所有生成的文件都将保存在该路径下。
拆分成指定页PDF:首先需要输入需要拆分的页数范围,切记不可超出文件本身的页数,否则无法生成,生成文件的命名格式默认生成为"开始页数_结束页数.pdf"。
拆分成单页PDF:点击即可实现所有单页PDF的提取,生成文件的名字从1开始累加,例如(1.pdf、2.pdf....)
视频演示
Python源码
from tkinter import Tk, Label, Button, filedialog, Text, Entry, messagebox, ttk
from PyPDF2 import PdfFileReader, PdfFileWriter
class PDFToolGUI:
def __init__(self, root):
self.root = root
self.root.title("PDF工具")
self.pdf_paths = []
self.pdf_path = ""
self.save_path = ""
self.beg_page = None
self.end_page = None
self.notebook = ttk.Notebook(root)
self.notebook.pack(expand=1, fill="both")
# PDF Merge Tab
self.merge_tab = ttk.Frame(self.notebook)
self.notebook.add(self.merge_tab, text="PDF合并工具")
self.label = Label(self.merge_tab, text="PDF路径:")
self.label.pack()
self.edit = Text(self.merge_tab, height=10, width=100)
self.edit.pack()
self.button1 = Button(self.merge_tab, text="新增一个PDF", command=self.select_pdfs)
self.button1.pack()
self.button3 = Button(self.merge_tab, text="删除一个PDF", command=self.delete_pdf)
self.button3.pack()
self.button2 = Button(self.merge_tab, text="保存路径选择", command=self.select_save_path)
self.button2.pack()
self.button4 = Button(self.merge_tab, text="点击进行合并", command=self.pdfhebing)
self.button4.pack()
# PDF Split Tab
self.split_tab = ttk.Frame(self.notebook)
self.notebook.add(self.split_tab, text="PDF拆分工具")
self.label1 = Label(self.split_tab, text="PDF路径:")
self.label1.pack()
self.editA = Text(self.split_tab, height=1, width=100)
self.editA.pack()
self.buttonA = Button(self.split_tab, text="选择一个PDF", command=self.select_pdf)
self.buttonA.pack()
self.buttonP = Button(self.split_tab, text="选择保存路径", command=self.select_save_path2)
self.buttonP.pack()
self.labelline1 = Label(self.split_tab, text="--------------------------------------------------------------------")
self.labelline1.pack()
self.label2 = Label(self.split_tab, text="开始页数:")
self.label2.pack()
self.beg_page_entry = Entry(self.split_tab)
self.beg_page_entry.pack()
self.label3 = Label(self.split_tab, text="结束页数:")
self.label3.pack()
self.end_page_entry = Entry(self.split_tab)
self.end_page_entry.pack()
self.buttonC = Button(self.split_tab, text="拆分指定页PDF", command=self.split_specified_pages)
self.buttonC.pack()
self.labelline2 = Label(self.split_tab, text="--------------------------------------------------------------------")
self.labelline2.pack()
self.buttonB = Button(self.split_tab, text="拆分为单页PDF", command=self.split_single_pdf)
self.buttonB.pack()
def select_pdfs(self):
file_paths = filedialog.askopenfilenames(filetypes=[("PDF Files", "*.pdf")])
self.pdf_paths.extend(file_paths)
self.update_edit_box()
def select_save_path(self):
save_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF Files", "*.pdf")])
self.save_path = save_path
save_path_label = Label(self.merge_tab, text=f"保存路径: {save_path}")
save_path_label.pack()
def select_save_path2(self):
save_path = filedialog.askdirectory()
self.save_path = save_path
save_path_label = Label(self.split_tab, text=f"保存路径: {save_path}")
save_path_label.pack()
def pdfhebing(self):
if self.pdf_paths:
merge_pdfs(self.save_path, *self.pdf_paths)
else:
messagebox.showwarning('警告', '请选择保存路径!')
def delete_pdf(self):
if self.pdf_paths:
self.pdf_paths.pop()
self.update_edit_box()
def update_edit_box(self):
self.edit.delete(1.0, "end")
for path in self.pdf_paths:
self.edit.insert("end", path + "\n")
def select_pdf(self):
file_path = filedialog.askopenfilename(filetypes=[("PDF Files", "*.pdf")])
self.pdf_path = file_path
self.editA.delete(1.0, "end")
self.editA.insert("end", self.pdf_path)
def split_single_pdf(self):
if self.pdf_path:
split_pdfs_single(self.save_path + '/', self.pdf_path)
else:
messagebox.showwarning('警告', '请选择保存路径!')
def split_specified_pages(self):
self.beg_page = int(self.beg_page_entry.get())
self.end_page = int(self.end_page_entry.get())
split_pdfs(self.save_path + '/', self.pdf_path, self.beg_page, self.end_page)
def merge_pdfs(output_path, *pdf_paths):
merge = PdfFileWriter()
for pdf_path in pdf_paths:
pdf_reader = PdfFileReader(pdf_path)
for page_num in range(pdf_reader.getNumPages()):
merge.addPage(pdf_reader.getPage(page_num))
with open(output_path, 'wb') as output_file:
merge.write(output_file)
messagebox.showinfo('提示', '保存成功')
def split_pdfs_single(save_path, pdf_path):
pdf_reader = PdfFileReader(pdf_path)
for i in range(0, pdf_reader.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdf_reader.getPage(i))
with open(save_path + '{}.pdf'.format(str(i)), 'wb') as fh:
pdf_writer.write(fh)
messagebox.showinfo('提示','保存成功')
def split_pdfs(save_path, pdf_path, beg_page, end_page):
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(pdf_path)
for i in range(beg_page-1, end_page):
pdf_writer.addPage(pdf_reader.getPage(i))
with open(save_path + '{}_{}.pdf'.format(beg_page, end_page), 'wb') as fh:
pdf_writer.write(fh)
messagebox.showinfo('提示','保存成功')
if __name__ == "__main__":
root = Tk()
app = PDFToolGUI(root)
root.mainloop()
exe工具获取
关注微信公众号“MatpyMaster”,后台回复“PDF合并拆分工具”,即可免费获取。
最后:
如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!