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

news2024/11/29 3:42:14

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

阿里云盘

百度网盘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业仓库管理系统的设计与实现(ASP.NET,SQL)

开发环境:Microsoft Visual Studio 数据库:Microsoft SQL Server 程序语言:asp.NET(C#)语言 本系统的开发使各大公司所的项目管理更加方便快捷,同时也促使项目的管理变的更加系统化、有序化。系统界面较友好,易于操作。…

食物储藏信息管理系统的设计与实现(ASP.NET,SQLServer)

需求分析 食物储藏信息管理系统是一个典型的数据库开发应用程序,由基础信息维护、用户信息维护、食物提醒管理、用户管理、食物管理、系统管理、食物储藏等功能模块组成。 具体功能实现如下: 食物管理:食物管理部门自行添加食物,可…

华为OD机试真题B卷 Java 实现【24点游戏算法】,附详细解题思路

一、题目描述 给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算 此题允许数字重复&#xff…

Ubuntu22.04部署K8S1.27.2版本集群

一、设置主机名并在 hosts 文件中添加条目 1、登录节点使用 hostnamectl 命令设置 hostname #在master中: 172.18.10.11 $ sudo hostnamectl set-hostname "k8s-master" #在work1节点中: 172.18.10.12 $ sudo hostnamectl set-host…

“百亿生态”背后,拼多多的初心

哈佛商学院教授、“颠覆性创新”理论的提出者克莱顿克里斯坦森,在《繁荣悖论》中将创新分为三类:第一类是效率创新,即生产更便宜、更优质的产品;第二类是持续性创新,即不断对产品进行改进;第三类是市场创造…

cuda编程学习——卷积计算CUDA、Pytorch比较 干货向(六)

前言 参考资料: 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程:基础与实践 樊哲勇 参考B站:蒙特卡洛加的树 文章所有代码可在我的GitHub获得,后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》&#…

勿踩,电商实时聊天常见错误

实时聊天现在在电商企业与SaaS行业已经是必备的服务,他的实施很简单:您找到适合您的工具,将其打开并将其放在所有客户都可以看到的地方。但是无休止的互动冲击,措辞不佳或沟通不畅的问题,客户的24/7期望,在…

【Apache网页与安全优化】

一.介绍 在企业中,部署Apache后只采用默认的配置参数,会引发网站很多问题,换言之默认配置是针对以前较低的服务器配置的,以前的配置已经不适用当今互联网时代。为了适应企业需求,就需要考虑如何提升Apache的性能与稳定…

Feign入门使用 OpenFeign 日志增强 超时控制

一、概述 Feign是一个声明式的web服务的客户端,Feign就是参考Ribbon添加了注解接口的绑定器。 我们封装一些客户端类来包装对其他服务的依赖调用。Feign让我们只需要创建一个接口注解就能够实现操作。Feign集成了Ribbon 关于使用就是在接口添加特定注解就可以了。…

html:叫你如何编写第一个网页

<!DOCTYPE html> <!--声明--> <html lang"en"> <head><meta charset"UTF-8"><title>我的第一个网页</title>体部分&#xff1a;存放的是组成html代码部分 </head><BODY><!--html:HyperText Mark…

【Linux网络服务】Apache配置与应用

Apache配置与应用 一、构建虚拟Web主机1.1httpd服务支持的虚拟主机类型包括以下三种 二、基于域名的虚拟主机三、基于IP地址的虚拟主机四、基于端口的虚拟机五、Apache连接保持六、构建Web虚拟目录与用户授权限制七、日志分割 一、构建虚拟Web主机 虚拟Web主机指的是在同一台服…

PointNet++ 源码解读

1.从main函数开始&#xff1a; 1.1 确定使用的哪个GPU. 1.2 保存训练时的参数和日志 2. 加载数据 先找到存放训练和测试数据的目录&#xff0c;接下来加载相关的数据参数&#xff1a; 下面是执行的结果&#xff1a; 接下来为训练样本开始做准备&#xff1a; 给不同标签做上标记…

都2023年了,还有人在盲目自学黑客?

背景 经常逛CSDN和知乎&#xff0c;不理解的是&#xff0c;都2023年了&#xff0c;相关资源都这么多了&#xff0c;还有人不知道怎么学习网络安全。 本人从事网络安全工作5年&#xff0c;在几个大厂都工作过&#xff0c;安全服务、渗透测试工程师、售前、主机防御等职位都做过…

如何实现不同的VLAN之间进行通信?VLAN Mapping大作用就体现出来了!

你好&#xff0c;这里是网络技术联盟站。 今天给大家介绍一下VLAN Mapping&#xff0c;包括VLAN Mapping的概念、原理、应用&#xff0c;同时还会介绍华为设备和思科设备如何配置VLAN Mapping。 让我们直接开始 1. 介绍 VLAN&#xff08;Virtual Local Area Network&#x…

JVM垃圾回收篇之垃圾收集器

五种引用 强引用(不回收) 强引用不会被强制垃圾回收,即使发生OOM也绝对不回收.保护了数据的安全性 软引用(内存不足即回收) 软引用是用来描述一些还有用&#xff0c;但非必需的对象。只被软引用关联着的对象&#xff0c;在系统将要发生内存溢出异常前&#xff0c;会把这些对…

为什么有些情况下需要重写equals()和hashCode()方法?

目录 方法作用实战案例 方法作用 equals()&#xff1a;判断对象是否相等&#xff0c;比如判断是否能放入Set集合中 情况1&#xff1a;没有重写equals()方法&#xff1a;由于所有类的默认基类都是Object类&#xff0c;所以默认使用Object类的equals()方法&#xff0c;那就是对象…

局域网内网穿透技术

文章目录 一、内网穿透概述1、传统内网穿透介绍2、ZeroTier和Tailscale 二、ZeroTier1、概述1.1 介绍1.2 相关概念 2、ZeroTier简单使用3、Moon搭建3.1 介绍3.2 部署Moon服务3.3 使用 Moon 服务 4、流量转发与局域网访问4.1 概述4.2 转发服务器配置4.3 客户端配置 三、Tailscal…

vulnhub靶场渗透之SickOs1.2渗透教程(超级详细)

vulnhub靶场渗透之SickOs1.2渗透教程目录 0x01靶机概述 0x02靶场环境搭建 0x03靶机信息发现 0x04渗透靶机 使用第二种方法&#xff1a;msfvenom生成载荷模块curl上传至服务器触发 0x05本地提权 方法一&#xff1a;将当前用户&#xff08;www-data&#xff09;加入sudo组 提…

SSM编程---Day 05

目录 一、IOC &#xff08;一&#xff09;企业级系统的特点&#xff1a; &#xff08;二&#xff09;Spring框架的优点&#xff1a; &#xff08;三&#xff09;ApplicationContext的作用&#xff1a; &#xff08;四&#xff09;理解IOC原理、掌握IOC的配置 二、AOP&…

三种快速转换PDF为TXT的方法:简单、高效、免费

如何将PDF转换为TXT文件&#xff1f;在日常生活中&#xff0c;PDF和TXT是常见的文本格式。PDF格式文件具有稳定的布局和易于存储的特点。然而&#xff0c;许多在线下载的电子书通常是以PDF格式提供的&#xff0c;而电子阅读器通常不支持PDF格式&#xff0c;这就导致了无法方便地…