侧边栏壁纸
博主头像
AI研究僧

hycj89@163.com

  • 累计撰写 1,899 篇文章
  • 累计创建 179 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

借助chatgpt做一个pdf转word的小工具

AI研究僧
2023-05-30 / 0 评论 / 0 点赞 / 347 阅读 / 1,293 字

中午我在一篇公众号文章中发现了一个名为 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已经放到网盘,需要的可自取使用。

阿里云盘

百度网盘

博主关闭了所有页面的评论