|
|
|
|
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_()) # 除非退出程序关闭窗体,否则一直运行
|
|
|
|
|
|
|
|
|
|
|