场景描述:
日常处理文件时,经常遇到将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