diff --git a/wordhelper.py b/wordhelper.py new file mode 100644 index 0000000..0382fdc --- /dev/null +++ b/wordhelper.py @@ -0,0 +1,272 @@ +import sys # 操作系统模块 +from PyQt5.QtGui import QColor # 导入PyQt5的QtGui模块 +from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QTableWidgetItem, QTableWidget, QMessageBox # 导入PyQt5的QtWidgets模块 +import os # 导入操作系统模块 +import tools.common as common # 导入工具模块并设置别名为common +import tools.wordtopdf as wordtopdf +import tools.mergepdf as mergepdf +from mainWindow import * # 导入主窗体的UI类 +from pageWindow import * # 导入Word转PDF窗体的UI类 +from listWindow import * # 导入统计Word文档页码窗体的UI类 +from transformWindow import * # 导入提取总页码窗体的UI类 +import _thread +# 主窗体初始化类 +class MyMainWindow(QMainWindow, Ui_MainWindow): + def __init__(self): + super(MyMainWindow,self).__init__() + self.setupUi(self) + self.setGeometry(100, 100, 1024, 600) + self.setWindowTitle('Word助手') # 设置窗体的标题 + # 设置窗体背景 + palette = QtGui.QPalette() # 创建调色板类的对象 + # 设置窗体背景自适应 + palette.setBrush(self.backgroundRole(),QBrush(QPixmap("./image/bg.png").scaled(self.size(),QtCore.Qt.IgnoreAspectRatio,QtCore.Qt.SmoothTransformation))) + self.setPalette(palette) + self.setAutoFillBackground(True) # 设置自动填充背景 + self.setFixedSize(1024,600) # 禁止显示最大化按钮及调整窗体大小 + + +'''Word转PDF模块''' +class TransformWindow(QMainWindow, Ui_TransformWindow): + filelist = [] + def __init__(self): + super(TransformWindow,self).__init__() + self.setupUi(self) + self.showLoding.setText("") # 设置显示转换进度标签不显示内容 + self.showLoding.setMinimumWidth(100) # 设置Label标签的最小宽度 + + self.multipleExecute.clicked.connect( self.multipleExecuteClick) #批量转换按钮绑定槽函数 + self.singleExecute.clicked.connect(self.singleExecuteClick) # 合为一个PDF按钮绑定槽函数 + self.sourcebrowseButton.clicked.connect(self.sourcebrowseClick) # 选择源文件夹按钮绑定槽函数 + self.targetbrowseButton.clicked.connect(self.targetbrowseClick) # 选择目标文件夹按钮绑定槽函数 + self.listpdf.itemDoubleClicked.connect(self.itemdoubleClick) # 为列表项的双击事件绑定槽函数 + # 自定义打开子窗体的方法 + def open(self): + self.__init__() + self.show() # 显示子窗体 + def sourcebrowseClick(self): # 单击浏览源文件夹按钮所触发的方法 + # 打开选择文件夹的对话框 + dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"E:\learn\test\doc") + if dir_path == "": # 处理没有选择路径的情况,这里为直接返回 + return + self.sourcepath.setText(dir_path) # 将获取到的文件夹路径添加到文本框控件中 + self.listword.clear() # 清空列表 + global filelist # 定义全局变量 + filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档路径 + self.listword.addItems(filelist) # 将获取到的Word文件路径添加到列表控件中 + + def targetbrowseClick(self): # 单击浏览目标文件夹按钮所触发的方法 + dir_path = QFileDialog.getExistingDirectory(self, "请选择目标文件目录", r"E:\learn\test\pdf") + self.targetpath.setText(dir_path) + + def itemdoubleClick(self,item): # 处理双击列表项触发的方法 + if os.path.exists(item.text()): + os.startfile(item.text()) # 打开文件 + else: + QMessageBox.information(self, "温馨提示:", "不是有效的文件名!", QMessageBox.Yes) + + def multipleExecuteClick(self): #批量转换按钮触发的方法 + # 判断是否选择了源文件,如果没有选择则弹出提示框告知 + if self.listword.count() == 0: + QMessageBox.information(self, "温馨提示:", "没有要转换的Word文档!", QMessageBox.Yes) + return + targetpath = self.targetpath.text() # 获取目标文件夹 + # 判断是否选择了目标文件,如果没有选择则弹出提示框告知 + if not os.path.exists(targetpath): + QMessageBox.information(self, "温馨提示:", "请选择正确的目标路径!", QMessageBox.Yes) + return + self.listpdf.clear() # 清空结果列表 + self.showLoding.setMovie(self.gif) # 设置gif图片 + self.gif.start() # 启动图片,实现等待gif图片的显示 + _thread.start_new_thread(self.mExecute, ()) # 开启新线程执行批量转PDF + + # 实现批量Word转PDF操作的方法 + def mExecute(self): + targetpath = self.targetpath.text() # 获取目标文件夹 + valueList = wordtopdf.wordtopdf(filelist,targetpath) # 实现将Word文档批量转换为PDF + if(valueList != -1): + self.showLoding.clear() # 清除进度条 + self.listpdf.addItems(valueList) # 将转换后的PDF路径显示在目标列表中 + + # 合为一个PDF按钮所触发的方法 + def singleExecuteClick(self): + # 判断是否选择了源文件,如果没有选择则弹出提示框告知 + if self.listword.count() == 0: + QMessageBox.information(self, "温馨提示:", "没有要转换的Word文档!", QMessageBox.Yes) + return + # 判断是否选择了目标文件夹,如果没有选择则弹出提示框告知 + if not os.path.exists(self.targetpath.text()): + QMessageBox.information(self, "温馨提示:", "请选择正确的目标路径!", QMessageBox.Yes) + return + self.listpdf.clear() # 清空结果列表 + self.showLoding.setMovie(self.gif) # 设置gif图片 + self.gif.start() # 启动图片,实现等待gif图片的显示 + _thread.start_new_thread(self.sExecute,()) # 开启新线程执行多个Word合为一个PDF + + # 实现合为一个PDF文件操作的方法 + def sExecute(self): + targetpath = self.targetpath.text() # 获取目标路径 + valueList = wordtopdf.wordtopdf(filelist, targetpath) # 将多个Word文档转换为PDF文件 + if(valueList != -1): + mergepdf.mergefiles(targetpath, 'merged.pdf', True) # 将多个PDF文件合并为一个PDF文件 + self.showLoding.clear() # 清除进度条 + temp = [os.path.join(targetpath , 'merged.pdf')] # 组合PDF文件路径 + self.listpdf.addItems( temp) # 将PDF文件路径显示到结果列表中 + for file in valueList: # 遍历临时生成的PDF文件列表 + os.remove(file) # 删除PDF文件 + +'''统计Word文档页码模块''' +class PageWindow(QMainWindow, Ui_PageWindow): + + filelist = [] # Word文件路径列表 + def __init__(self): + super(PageWindow,self).__init__() + self.setupUi(self) + self.pagetable.setColumnWidth(0,600) # 设置第一列的宽度 + self.pagetable.setColumnWidth(1,100) # 设置第二列的宽度 + self.pagetable.setStyleSheet("background-color: lightblue" + "(spread:pad,stop:0.823 rgba(255, 255, 255, 204), stop:1 rgba(255, 255, 255, 204));" + "selection-background-color:lightblue;") + headItem = self.pagetable.horizontalHeaderItem(0) # 获得水平方向表头的Item对象 + headItem.setBackground(QColor(0, 60, 10)) # 设置单元格背景颜色 + headItem.setForeground(QColor(200, 111, 30)) # 设置文字颜色 + headItem = self.pagetable.horizontalHeaderItem(1) # 获得水平方向表头的Item对象 + headItem.setBackground(QColor(0, 60, 10)) # 设置单元格背景颜色 + headItem.setForeground(QColor(200, 111, 30)) # 设置文字颜色 + self.pagetable.setEditTriggers(QTableWidget.NoEditTriggers) + self.pagetable.setSelectionBehavior(QTableWidget.SelectRows) + self.pagetable.setSelectionMode(QTableWidget.SingleSelection) + self.pagetable.setAlternatingRowColors(True) + self.totalpage.setMinimumWidth(100) # 设置Label标签的最小宽度 + + self.browseButton.clicked.connect(self.sourcebrowseClick) # 选择源路径 + self.executeButton.clicked.connect(self.executeClick) # 开始统计按钮的事件绑定 + + # 自定义打开子窗体的方法 + def open(self): + self.__init__() + self.show() # 显示子窗体 + + + def sourcebrowseClick(self): + dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"E:\learn\test\doc") + if dir_path != "": # 判断已经选择了源文件目录 + self.sourcepath.setText(dir_path) + self.listword.clear() # 清空列表 + global filelist + filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档 + self.listword.addItems(filelist) + + def executeClick(self): #开始统计按钮的自定义事件 + if self.listword.count() == 0: + QMessageBox.information(self, "温馨提示:", "没有要统计页码的Word文档!", QMessageBox.Yes) + return + self.totalpage.setText("") + self.totalpage.setMovie(self.gif) # 设置gif图片 + self.label_2.setText("正在统计:") + self.gif.start() # 启动图片,实现等待gif图片的显示 + _thread.start_new_thread(self.execute,()) # 开启新线程执行统计页码 + # 统计页码 + def execute(self): + valueList = [] + valueList = wordtopdf.wordtopdf1(filelist) + # if valueList != []: + # self.totalpage.clear() # 转换完毕就将等待gif图片清理掉 + totalPages = str(valueList[0]) # 总页数 + self.label_2.setText("合计页码:") + self.totalpage.setText(totalPages) # 显示统计出来的页码 + print("行数:",len(valueList[1])) + self.pagetable.setRowCount(len(valueList[1])) # 指定行数 + resultList = valueList[1] # 获取统计结果 + for i in range(self.pagetable.rowCount()): + for j in range(self.pagetable.columnCount()): + content = resultList[i][j] # 获取一个单元格的内容 + newItem = QTableWidgetItem(content) # 转换为一个单元格对象 + self.pagetable.setItem(i, j, newItem) # 显示在单元格中 + +'''提取总目录模块''' +class ListWindow(QMainWindow, Ui_ListWindow): + def __init__(self): + super(ListWindow,self).__init__() + self.setupUi(self) + self.browseButton.clicked.connect(self.sourcebrowseClick) # 选择源路径 + self.executeButton.clicked.connect( self.getListClick) #按钮事件绑定 + self.openButton.clicked.connect(self.openButtonClick) # 为打开文件按钮绑定事件 + # 自定义打开子窗体的方法 + def open(self): + self.__init__() + self.show() # 显示子窗体 + def sourcebrowseClick(self): + dir_path = QFileDialog.getExistingDirectory(self, "请选择源文件目录", r"E:\learn\test\doc") + if dir_path != "": # 判断已经选择了源文件目录 + self.sourcepath.setText(dir_path) + self.listword.clear() # 清空列表 + global filelist + filelist = common.getfilenames(dir_path,[],'.doc') # 获取Word文档 + self.listword.addItems(filelist) + + def getListClick(self): #子窗体自定义事件 + if self.listword.count() == 0: + QMessageBox.information(self, "温馨提示:", "没有要提取目录的Word文档!", QMessageBox.Yes) + return + self.listfile.setText("") + self.listfile.setMovie(self.gif) # 设置gif图片 + self.gif.start() # 启动图片,实现等待gif图片的显示 + _thread.start_new_thread(self.getList,()) # 开启新线程执行统计页码 + + # 提取目录 + def getList(self): + sourcepath = self. sourcepath.text() # 获取源路径 + if not os.path.exists(sourcepath): # 判断是否选择了源目录 + QMessageBox.information(self,"温馨提示:","请先选择Word文档所在的文件夹!",QMessageBox.Yes) + return + targetpath = os.path.join(sourcepath, "pdf") # 根据源路径生成目标目录 + if not os.path.exists(targetpath): # 判断目录是否存在,不存在则创建 + os.makedirs(targetpath) # 创建目录 + valueList = wordtopdf.wordtopdf(filelist, targetpath) + if(valueList != -1): + mergepdf.mergefiles(targetpath, 'merged.pdf', True) # 合并PDF + temp = [os.path.join(targetpath , 'merged.pdf')] # 生成合并后的PDF文件的路径 + for file in valueList: # 遍历临时生成的PDF文件列表 + os.remove(file) # 删除PDF文件 + isList = self.checkBox.isChecked() # 指定是否带目录 + resultvalue=wordtopdf.getPdfOutlines(temp[0],targetpath,isList) # 提取目录 + os.remove(temp[0]) # 删除合并后的PDF文件 + if valueList != []: + self.listfile.clear() # 转换完毕就将等待gif图片清理掉 + self.listfile.setText(resultvalue) # 将生成的目录文件路径显示到页面中 + + + # 自定义打开子窗体的方法 + def open(self): + self.__init__() + self.show() # 显示子窗体 + + # 打开文件按钮触发的事件函数 + def openButtonClick(self): + if self.listfile.text() == "还未提取...": + QMessageBox.information(self,"温馨提示:","还没有提取目录,请先单击【开始提取】按钮!",QMessageBox.Yes) + else: + os.startfile(self.listfile.text()) # 打开文件 + +if __name__ == '__main__': + app = QApplication(sys.argv) # 创建GUI对象 + main = MyMainWindow() # 创建主窗体ui类对象 + qmovie = QtGui.QMovie('image/loding.gif') + + transformWindow = TransformWindow() # 创建Word转PDF窗体对象 + transformWindow.gif = qmovie # 加载gif图片 + main.actionWord_PDF.triggered.connect(transformWindow.open) #为Toolbar上的Word转PDF按钮指定连接槽函数 + + pagewindow = PageWindow() # 创建统计Word文档页码窗体对象 + pagewindow.gif = qmovie # 加载gif图片 + main.action_Word.triggered.connect(pagewindow.open) #为Toolbar上的统计Word文档页码按钮指定连接槽函数 + + listwindow = ListWindow() # 创建提取总目录窗体对象 + listwindow.gif = qmovie # 加载gif图片 + main.action_list.triggered.connect(listwindow.open) #为Toolbar上的提取总目录按钮指定连接槽函数 + + main.show() # 显示主窗体 + sys.exit(app.exec_()) # 除非退出程序关闭窗体,否则一直运行 + +