python pdf文件合并软件

创建tkinter窗口

可生成exe

选择多个pdf文件,或者某个文件夹

 

 

# 作为模块使用
# main(tk.Frame),给一个tk框架

import random
import tkinter as tk
import tkinter.messagebox
import tkinter.filedialog
from PyPDF2 import PdfFileMerger, PdfFileReader
import os

merge_file_list = []
Page_Num = []
Pages_Num = []
pages = 0
file_types = [('PDF文件', '.pdf')]


def select_file():
    file_selected = tk.filedialog.askopenfilenames(filetypes=file_types)
    if file_selected != '':
        write2list(file_selected)


def select_folder():
    folder_selected = tk.filedialog.askdirectory()
    folder_file = []
    if folder_selected != '':
        files_selected = [file for file in os.listdir(folder_selected) if file.endswith('.pdf')]
        if not files_selected:
            tkinter.messagebox.showinfo('操作提示', '所选文件夹不含PDF文件')
        else:
            for file in files_selected:
                file = os.path.join(folder_selected, file)
                folder_file.append(file)
            write2list(folder_file)


def write2list(files):
    global file_list
    file_list.delete('1.0', 'end')
    for file in files:
        file = file.replace('/', '\\')
        merge_file_list.append(file)
    for i in merge_file_list:
        file_list.insert('end', i + '\n')
    clear2()


def select_save_path():
    save_path_selected = tk.filedialog.asksaveasfilename(initialdir=os.getcwd(), defaultextension='*.pdf',
                                                         filetypes=file_types)
    save_path_selected = save_path_selected.replace('/', '\\')
    save_path.set(save_path_selected)


def clear():
    global save_entry
    # global file_list,save_path
    file_list.delete('1.0', 'end')
    file_list.insert('end', '请选择要合并的PDF文件' + '\n')
    merge_file_list.clear()
    merge_btn['state'] = 'disable'
    save_btn['state'] = 'disable'
    save_entry['state'] = 'disable'


def clear2():
    global save_entry
    random_save = os.getcwd() + '\\' + '合并文件' + str(random.randint(0, 9999)) + '.pdf'
    save_path.set(random_save)
    merge_btn['state'] = 'normal'
    save_btn['state'] = 'normal'
    save_entry['state'] = 'normal'


def merge_pdf():
    global pages
    hb = PdfFileMerger()
    read_pdf = PdfFileReader
    for pdf in merge_file_list:
        print(pdf)
        hb.append(pdf, import_bookmarks=False)
        pdf_page = len(read_pdf(pdf).pages)

        pages_n = pages + pdf_page
        Pages_Num.append(pdf + '\t\t' + '页码索引' + str(pages + 1) + '~' + str(pages_n))
        pages += pdf_page
        Page_Num.append(pdf_page)

        print(Pages_Num)
    hb.write(save_path.get())
    tkinter.messagebox.showinfo('操作提示', '合并成功')
    index_save = save_path.get().replace('.pdf', '---页码索引.txt')
    with open(index_save, 'w', encoding='utf-8') as f:
        for i in Pages_Num:
            f.write(i + '\n')


global file_list, save_path, merge_btn, save_btn, save_entry


# if __name__ == '__main__':
def main(win):
    global file_list, save_path, merge_btn, save_btn, save_entry, pages

    win.place(x=10, y=10)
    add_file_btn = tk.Button(win, text='添加文件', command=select_file)
    # add_file_btn = tk.Button(win, text='添加文件', command=select_file)
    add_folder_btn = tk.Button(win, text='添加文件夹', command=select_folder)
    clear_btn = tk.Button(win, text='清除所选文件', command=clear)
    # text_list = tk.StringVar
    file_list = tk.Text(win)
    save_label = tk.Label(win, text='保存位置:')
    save_path = tk.StringVar()

    save_entry = tk.Entry(win, textvariable=save_path, width=45)
    save_btn = tk.Button(win, text='选择保存位置', command=select_save_path)
    merge_btn = tk.Button(win, text='合并', command=merge_pdf)
    # tk.Label(win, text='PDF合并软件').place(x=10, y=2)
    add_file_btn.place(x=10, y=10)
    add_folder_btn.place(x=100, y=10)
    clear_btn.place(x=200, y=10)
    file_list.place(x=10, y=50)
    save_label.place(x=10, y=400)
    save_entry.place(x=70, y=400)
    save_btn.place(x=420, y=395)
    merge_btn.place(x=520, y=395)
    clear()
    win.mainloop()


win3 = tk.Tk()
win3.title('PDF文件合并软件')
win2 = tk.Frame(win3, width=600, height=600)
a = win3.winfo_screenwidth()
b = win3.winfo_screenheight()
c = (a - 605) / 2
d = (b - 500) / 2
# 使窗口在屏幕中间位置
win3.geometry('605x500+%d+%d' % (c, d))


win3.resizable(height=False, width=False)
main(win2)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值