You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

273 lines
15 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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