Python实用小工具(3)——实现PDF合并和拆分功能(附源码+exe文件)

在日常工作和学习中,我们常常会遇到需要处理PDF文件的情况,例如合并多个PDF文档,拆分成单页或指定页数的PDF等。为了更方便地处理这些任务,今天我们将利用Python和Tkinter库,创建一个简易的PDF工具。这个工具包括PDF合并和PDF拆分两个功能,操作简单,界面友好。

功能介绍

①PDF合并工具

Python实用小工具(3)——实现PDF合并和拆分功能(附源码+exe文件)_第1张图片

  • 新增一个PDF:点击该按钮可进行PDF的选择,需要注意的是依次选择的顺序就是进行合并的顺序,选择结果会在上面edit框内显示。

  • 删除一个PDF:点击可实现新增PDF的删除。

  • 路径保存:一定要记得选一下路径,然后在弹出框对合并后的文件进行命名。

  • 合并:点击即可进行合并

②PDF拆分工具

Python实用小工具(3)——实现PDF合并和拆分功能(附源码+exe文件)_第2张图片

  • 选择一个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仿真......希望能帮到你!

Python实用小工具(3)——实现PDF合并和拆分功能(附源码+exe文件)_第3张图片

你可能感兴趣的:(实用小工具,pdf,测试工具)