因
中午我在一篇公众号文章中发现了一个名为 pdf2docx 的 Python 包,可以将 PDF 文件转换成 Word 文件。但是,这个包不支持将图片型 PDF 转换成 Word,而且需要自己编写代码来实现转换功能。
于是我想,将这个包制作成一个小工具,让不懂编程的朋友也能使用它来转换文件。之前我做的工具都是打包成可执行文件,以命令行的形式使用
,感觉不太方便。这次我考虑使用 PyQt 制作一个简单的界面,但我不会 PyQt,于是向 chatgpt 寻求帮助。chatgpt给了我一份可直接使用的代码,只需稍作修改即可。
总之,本文并不是讨论 pdf2docx 库或 PyQt 的使用,而是借助这些库和 chatgpt 的帮助,制作一个小工具。
以上内容也是chatgpt帮我优化的,O(∩_∩)O哈哈~
果
环境
操作系统:windows10
python版本:3.9
安装pyqt:pip install pyqt-tools
,安装方式也是问的chatgpt
安装pdf2docx:pip install pdf2docx
源码
提问大概内容如下:
使用pyqt写一个界面,其中标题为PDF2Word,按钮有选择文件和转换。只能选择pdf文件,当用户选择后,在界面中显示用户选择的文件完整路径,点击转换后,开始执行耗时操作,耗时操作会使用pdf2docx库来将pdf文件转为word文件,在此过程中用户不能再次点击转换,也不能点击选择文件,只能等待。同时转换过程中pdf2docx库会输出日志信息,这些日志信息需要截获到,将这些日志信息展示在界面中,展示背景为黑色,字体为白色。写出以上内容的python代码
以下为代码,但是已做修改,上述提问中将pdf2docx日志输出到GUI在实现后,打开大文件时,会导致程序崩溃退出,最后放弃了日志在GUI输出。
import sys
import os
import pdf2docx
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QTextCursor
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QFileDialog, QTextEdit, QVBoxLayout
class Pdf2WordConverter(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PDF2Word")
self.resize(500, 400)
self.file_path = None
# 创建选择文件按钮
self.select_file_button = QPushButton("选择文件", self)
self.select_file_button.clicked.connect(self.select_file)
# 创建转换按钮
self.convert_button = QPushButton("转换", self)
self.convert_button.clicked.connect(self.convert)
self.convert_button.setEnabled(False)
# 创建文件名标签
self.file_name_label = QLabel(self)
# 创建日志文本框
self.log_text_edit = QTextEdit(self)
self.log_text_edit.setReadOnly(True)
self.log_text_edit.setStyleSheet("background-color:black;color:white")
# 创建垂直布局
layout = QVBoxLayout()
layout.addWidget(self.select_file_button)
layout.addWidget(self.file_name_label)
layout.addWidget(self.convert_button)
layout.addWidget(self.log_text_edit)
self.setLayout(layout)
def select_file(self):
# 打开文件对话框
file_path, _ = QFileDialog.getOpenFileName(self, "选择PDF文件", "", "PDF Files (*.pdf)")
if file_path:
self.file_path = file_path
self.file_name_label.setText(self.file_path)
self.convert_button.setEnabled(True)
def convert(self):
# 禁用按钮
self.select_file_button.setEnabled(False)
self.convert_button.setEnabled(False)
# 创建线程执行转换操作
self.worker = Worker(self.file_path)
self.worker.log_signal.connect(self.log_text_edit.append)
self.worker.finished_signal.connect(self.convert_finished)
# 清空日志文本框
self.log_text_edit.clear()
# 开始转换
self.worker.start()
def convert_finished(self):
# 启用按钮
self.select_file_button.setEnabled(True)
self.convert_button.setEnabled(True)
class Worker(QThread):
log_signal = pyqtSignal(str)
finished_signal = pyqtSignal()
def __init__(self, file_path):
super().__init__()
self.file_path = file_path
def run(self):
self.log_signal.emit("开始转换...")
try:
self.log_signal.emit("正在转换中,请耐心等待...")
pdf2docx.parse(self.file_path, os.path.splitext(self.file_path)[0] + ".docx")
self.log_signal.emit("转换成功!")
except Exception as e:
self.log_signal.emit(f"转换失败:{str(e)}")
self.finished_signal.emit()
if __name__ == "__main__":
app = QApplication(sys.argv)
converter = Pdf2WordConverter()
converter.show()
sys.exit(app.exec_())
打包exe
打包成exe的过程了,同样是问了chatgpt,使用的是pyinstaller库,安装命令pip install pyinstaller
安装完成后,进入上述代码文件所在目录,建议单独创建一个目录放文件,在打包过程中会生成一些文件和目录。
打包1
pyinstaller --name=pdf2word pdf2word.py
pdf2word.py是上述代码文件名字。
这样打包后会生成dist目录,里边就是打包成的文件,不过是多文件的
打包2
pyinstaller --name=pdf2word --onefile pdf2word.py
使用onefile
可以只输出一个exe文件,方便发给其他人使用
打包3
前两种打包exe后,执行,会同时弹出cmd窗口,在窗口中会可以看到转换进度。如果不想看到该窗口,执行如下命令打包
pyinstaller --name=pdf2word --onefile --noconsole pdf2word.py
以上代码严谨性无法保障。简单测试了一些pdf文件,没问题。
以上打包的exe已经放到网盘,需要的可自取使用。
阿里云盘
百度网盘