当前位置: 首页 > article >正文

Python-基于PyQt5,pdf2docx,pathlib的PDF转Word工具(专业版)

前言:日常生活中,我们常常会跟WPS Office打交道。作表格,写报告,写PPT......可以说,我们的生活已经离不开WPS Office了。与此同时,我们在这个过程中也会遇到各种各样的技术阻碍,例如部分软件的PDF转Word需要收取额外费用等。那么,可不可以自己开发一个小工具来实现PDF转Word这个功能呢?答案是肯定的,Python生来就是为应用层开发的。话不多说,我们直接开始今天的Python学习之路-利用Python编写一个基于PyQt5,pdf2docx,pathlib,sys,os,datetimePDF转Word工具。

 编程思路:本次编程我们将会调用到PyQt5,pdf2docx,pathlib,datetime,sys,os等库。其中,PyQt5提供了图形用户交互界面,线程池,信号槽等槽点。pdf2docx则负责将PDF文档转换为Word文档。pathlib获取生成的Word文档的绝对路径,并保证Word文档存放在系统的指定位置。datetime库用来获取系统当前的时间参数,并将其以时间戳的形式给生成的Word文档命名,这对用户后面方便搜索和查询文件详细信息非常重要。sys使我们与Python解释器(PyCharm)进行交互、以及控制程序的执行成为了可能。本次编程中,os库被用于启动文件浏览器(os.startfile),以便我们选择要转换的 PDF 文件。具体来说,我们可以用它在 Windows 系统上打开所想要转换的PDF的所在文件或目录。本次,我们还会将gif动画导入GUI界面,让用户的体验感更好。

第一步:导入库

标准库:pathlib,sys,os,datetime。

第三方库:PyQt5,pdf2docx。

# 导入库
import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QMovie  # 导入QMovie类
from pdf2docx import Converter
from pathlib import Path
from datetime import datetime

 

第二步:建立功能类

这一步中我们需要建立两个类:1,线程进度类  2,转换窗口类。

线程进度类:负责PDF文档从PDF格式转换为Word格式的目录创建,格式转换,新文件生成等步骤的执行。

转换窗口类:负责PDF文档转Word文档过程中GUI各控件(按钮,主窗口,进度条,信息框等)的布局。

本次我们将动态进度条改为了固定的文字显示,以免用户被系统报错而停滞的进度条误导。

# 线程进度类
class ConversionThread(QThread):
    progress_updated = pyqtSignal(str)  # 修改为仅传递描述信息
    conversion_finished = pyqtSignal(bool, str)

    # 线程初始化
    def __init__(self, pdf_path, output_dir):
        super().__init__()
        self.pdf_path = pdf_path
        self.output_dir = output_dir
        self.docx_path = ""

    def run(self):
        try:
            # 创建输出目录
            output_path = Path(self.output_dir)
            output_path.mkdir(parents=True, exist_ok=True)

            # 生成带时间戳的文件名
            timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
            original_name = Path(self.pdf_path).stem
            self.docx_path = str(output_path / f"{original_name}_{timestamp}.docx")

            # 初始化转换器
            cv = Converter(self.pdf_path)

            # 获取总页数用于进度计算
            total_pages = len(cv.pages)
            current_page = 0

            def detailed_progress(progress, description):
                nonlocal current_page
                if description["event"] == "page_parsed":
                    current_page += 1
                    self.pr

http://www.kler.cn/a/529396.html

相关文章:

  • 标准IO与文件IO 进程与线程
  • UE 5.3 C++ 对垃圾回收的初步认识
  • Vue 3 30天精进之旅:Day 11 - 状态管理
  • Bash 基础与进阶实践指南
  • Windsurf cursor vscode+cline 与Python快速开发指南
  • 药店药品销售管理系统的设计与实现
  • Cypher入门
  • 两栏布局、三栏布局、水平垂直居中
  • docker gitlab arm64 版本安装部署
  • SpringBoot 整合 SpringMVC:配置嵌入式服务器
  • Redis集群理解以及Tendis的优化
  • nginx 报错404
  • 为AI聊天工具添加一个知识系统 之83 详细设计之24 度量空间之1 因果关系和过程:认知金字塔
  • Heptagon 迭代器
  • 【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统
  • P_all: 投影矩阵(Projection Matrix)
  • AI智慧社区--人脸识别
  • 详解CSS `clear` 属性及其各个选项
  • Rust 控制流语法详解
  • 蓝桥杯之c++入门(二)【输入输出(上)】
  • Lesson 129 70 miles an hour
  • 【C++】 STL -- 容器(2)
  • AI-on-the-edge-device - 将“旧”设备接入智能世界
  • 【开源免费】基于Vue和SpringBoot的校园网上店铺系统(附论文)
  • 区间加法 II - 解题思路与代码解析
  • 14-9-2C++STL的set容器