【办公自动化】基于Python开发的PDF批量转换-合并应用程序

场景描述:

日常处理文件时,经常遇到将word批量转换成pdf文件,以及合并多个pdf文件的需求。
那么问题来了
1.市面上的office程序只能支持单个文件转换,批量与合并是收费的。
2.而网页上的在线转换则有可能导致隐私泄露,且无法在内网使用。
所以,为了省时省力省心,我们用Python开发一个可在内网使用的PDF批量转换-合并应用程序。

需求分析:

1.需要批量转换word为pdf格式
2.动态打印日志显示状态
3.转换后可直接打开落地文件绝对路径

解决方案:

1.准备开发环境

提前准备好Python开发环境,并安装pip,win32com,pyinstaller

2.引入tkinter,win32com等包

from tkinter import *
import os
from PIL import Image
import time
from tkinter import filedialog,messagebox
import tkinter
import pythoncom
import time
import win32com.client

3.设置全局变量动态打印日志

LOG_LINE_NUM = 0

4.定义类并设置页面UI

class MY_GUI():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name


    #设置窗口
    def set_init_window(self):
        self.init_window_name.title("PDF转换工具_V1.0")           #窗口名
        self.init_window_name.geometry('1068x681+400+10')
        #标签
        self.operate_data_label = Label(self.init_window_name, text="操作")
        self.operate_data_label.grid(row=0, column=0)
        self.result_data_label = Label(self.init_window_name, text="输出结果")
        self.result_data_label.grid(row=0, column=12)
        self.log_label = Label(self.init_window_name, text="日志")
        self.log_label.grid(row=9, column=0)
        #文本框
        self.result_data_Text = Text(self.init_window_name, width=70, height=49)  #处理结果展示
        self.result_data_Text.grid(row=1, column=12, rowspan=15, columnspan=10)
        self.log_data_Text = Text(self.init_window_name, width=66, height=9)  # 日志框
        self.log_data_Text.grid(row=10, column=0, columnspan=12)
        #按钮
        self.str_trans_to_md5_button = Button(self.init_window_name, text="①上传文件", width=10,command=self.upload_files)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md5_button.grid(row=3, column=4)
        self.str_trans_to_md5_button1 = Button(self.init_window_name, text="②转换PDF", bg="lightblue", width=10,command=self.trans_files)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md5_button1.grid(row=4, column=4)
        self.str_trans_to_md5_button2 = Button(self.init_window_name, text="③打开文件夹", bg="yellow", width=10,command=self.open_folder)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md5_button2.grid(row=5, column=4)
        self.str_trans_to_md5_button2 = Button(self.init_window_name, text="请阿丸喝奶茶o( ̄▽ ̄)d", bg="pink", width=18,command=self.open_money)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md5_button2.grid(row=9, column=9)

5.定义上传、转换、打开文件夹的功能函数

def upload_files(self):
    global file_infos
    file_infos = filedialog.askopenfilenames(
        title='可选择1个或多个文件')  # askopenfilename 1次上传1个;askopenfilenames1次上传多个
    for file_info in file_infos:
        self.result_data_Text.insert(END, file_info +'已上传!'+ '\n')  # 更新text中内容
        self.result_data_Text.update()

def trans_files(self):
    for file_info in file_infos:
        in_file=file_info
        print(in_file)
        out_file=file_info.split(".")[0]+".pdf"
        print(out_file)
        pythoncom.CoInitialize()
        if file_info.split('.')[-1] in ('doc','docx'):
            word = win32com.client.Dispatch('Word.Application')
        elif file_info.split('.')[-1] in ('xls','xlsx'):
            word = win32com.client.Dispatch('Excel.Application')
        elif file_info.split('.')[-1] in ('ppt','pptx'):
            word = win32com.client.Dispatch('PowerPoint.Application')
        doc = word.Documents.Open(in_file)
        doc.SaveAs(out_file, FileFormat=17)
        doc.Close()
        time.sleep(1)
        self.result_data_Text.insert(END, file_info +'已转换成PDF!'+ '\n')  # 更新text中内容
        self.result_data_Text.update()

def open_folder(self):
    start_directory = file_infos[0].split('/')[0:-1]
    end_directory = '/'.join(start_directory)
    os.startfile(end_directory)

6.定义时间、日志打印功能函数

   #获取当前时间
    def get_current_time(self):
        current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
        return current_time


    #日志动态打印
    def write_log_to_Text(self,logmsg):
        global LOG_LINE_NUM
        current_time = self.get_current_time()
        logmsg_in = str(current_time) +" " + str(logmsg) + "\n"      #换行
        if LOG_LINE_NUM <= 7:
            self.log_data_Text.insert(END, logmsg_in)
            LOG_LINE_NUM = LOG_LINE_NUM + 1
        else:
            self.log_data_Text.delete(1.0,2.0)
            self.log_data_Text.insert(END, logmsg_in)

7.初始化功能函数

def gui_start():
    init_window = Tk()              #实例化出一个父窗口
    ZMJ_PORTAL = MY_GUI(init_window)
    # 设置根窗口默认属性
    ZMJ_PORTAL.set_init_window()

    init_window.mainloop()          #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示


gui_start()

8.打包exe

#隐藏控制台
pyinstall -F -i -w 图片.ico 文件.py
#使用控制台
pyinstall -F -i -c 图片.ico 文件.py
在这里插入图片描述

你可能感兴趣的:(【办公自动化】基于Python开发的PDF批量转换-合并应用程序)