使用Python批量将PDF转Word

简述

        以下全部代码无法完美对图片、表格等非文字形式的内容转化。要较好的效果需要使用光学字符分析等方法进行转化

        我懒,不想将代码模块拆分出来写注释

        除代码1中有详细注释外,剩下的代码仅在关键部分进行注释

代码1:小规模文件的转换

代码简介

        不使用线程,挨个文件转换格式。

        适用于小规模的PDF文件批量转换。

        需要自己选择PDF文件(可以全选文件,自动筛选PDF格式)

代码内容

import os, sys  # 导入操作系统接口和系统相关的参数和函数
from pdf2docx import Converter  # 导入pdf2docx库中的Converter类,用于将PDF文件转换为docx格式import tkinter as tk  # 导入Tkinter库,用于创建图形用户界面
from tkinter import filedialog  # 导入Tkinter库中的filedialog模块,用于打开文件对话框# 定义一个函数,用于将PDF文件转换为docx格式
def convert_pdf_to_docx(file_path):if os.path.splitext(file_path)[1] == '.pdf':  # 检查文件的扩展名是否为.pdfpdf_filename = os.path.basename(file_path)  # 从file_path中提取出文件名(不含路径)word_name = os.path.splitext(pdf_filename)[0] + ".docx"  # 创建新的文件名,将.docx作为扩展名cv = Converter(pdf_filename)  # 创建一个Converter对象,用于转换文件cv.convert(word_name)  # 调用convert方法,将PDF文件转换为docx格式,并将转换后的文件保存为word_namecv.close()  # 关闭转换器对象print(f"**{pdf_filename}**处理完成")  # 打印转换完成的信息# 创建一个Tkinter窗口,但不显示它
root = tk.Tk()
root.withdraw()# 使用filedialog模块打开一个文件选择对话框,允许用户选择多个文件
file_paths = filedialog.askopenfilenames(title="选择需要处理的文件")
if len(file_paths) == 0:  # 如果没有选择文件,退出程序sys.exit()
else:print("待处理文件:")  # 打印提示信息for file_path in file_paths:  # 遍历所有选择的文件路径print("  ", file_path)  # 打印每个文件的路径# 遍历所有选择的文件路径,并调用convert_pdf_to_docx函数进行转换
for file_path in file_paths:convert_pdf_to_docx(file_path)print("全部PDF转换完成")  # 打印所有PDF文件转换完成的信息

功能的执行

选择需要转换的文件

选择你需要转换的文件,可以直接全选

一次只能转换一个文件夹中的全部文件,无法进入到该文件夹的次级文件夹中

选择需要转换的PDF文件

开始转换文件

请注意终端信息窗口,会提示转换进度

开始转换

转换完成

转换完成

转换效果:

代码2:较大规模文件的转换

更新功能

1.使用多线程模式,一个文件一条线程的转换文件

2.增加时间计算,统计转换文件需要多少时间,方便后继继续优化提高转换速度

详细代码

import os
import sys
from pdf2docx import Converter
import tkinter as tk
from tkinter import filedialog
import threading
import time# 定义一个函数,用于将PDF文件转换为docx格式
def convert_pdf_to_docx(file_path):try:if os.path.splitext(file_path)[1] == '.pdf':#pdf_filename = os.path.basename(file_path)#word_name = os.path.splitext(pdf_filename)[0] + ".docx"cv = Converter(file_path)cv.convert(os.path.splitext(os.path.basename(file_path))[0] + ".docx")cv.close()except Exception as e:print(f"转换 {os.path.basename(file_path)} 时发生错误: {e}")# 创建一个Tkinter窗口,但不显示它
root = tk.Tk()
root.withdraw()# 使用filedialog模块打开一个文件选择对话框,允许用户选择多个文件
file_paths = filedialog.askopenfilenames(title="选择需要处理的文件")
if not file_paths:sys.exit("没有选择文件,操作取消。")# 打印待处理的文件
print("待处理文件:")
for file_path in file_paths:print("  ", file_path)# 创建一个线程列表用于存储所有的转换线程
threads = []# 遍历所有选择的文件路径,并创建转换线程
for file_path in file_paths:thread = threading.Thread(target=convert_pdf_to_docx, args=(file_path,))threads.append(thread)# 记录开始时间
start_time = time.time()# 启动所有的转换线程
for thread in threads:thread.start()# 等待所有的转换线程完成
for thread in threads:time.sleep(0.1)# 暂停程序1毫秒thread.join()# 记录结束时间
end_time = time.time()# 计算并打印转换完成所需的总时间
total_time = end_time - start_time
print(f"所有文件转换完成,总共耗时: {total_time:.2f} 秒。")

代码3:超大规模文件的转换

功能的更新

1.引入线程池,控制程序消耗的系统资源

详细代码

import os
import logging
from tkinter import Tk, filedialog
from concurrent.futures import ThreadPoolExecutor, as_completed
from pdf2docx import Converter# 配置日志格式和级别
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')# 定义一个函数来处理单个PDF文件的转换
def process_pdf_file(pdf_path):try:pdf_dir = os.path.dirname(pdf_path)file_name = os.path.splitext(os.path.basename(pdf_path))[0]docx_path = os.path.join(pdf_dir, f"{file_name}.docx")# 转换PDF到Wordcv = Converter(pdf_path)cv.convert(docx_path, start=0, end=None)cv.close()# 记录文件保存的信息logging.info(f"Converted file saved to {docx_path}")except Exception as e:# 如果发生错误,记录错误信息而不是转换成功信息logging.error(f"Error processing file {pdf_path}: {e}")# 创建主窗口
root = Tk()
root.withdraw()  # 隐藏主界面# 选择PDF文件
pdf_paths = filedialog.askopenfilenames(title="选择PDF文件", filetypes=[("PDF files", "*.pdf")])if pdf_paths:# 创建一个线程池,限制线程数量为CPU核心数with ThreadPoolExecutor(max_workers=os.cpu_count()*2) as executor:# 将任务提交到线程池futures = [executor.submit(process_pdf_file, pdf_path) for pdf_path in pdf_paths]# 使用as_completed迭代器等待所有任务完成for future in as_completed(futures):future.result()if future.exception() is not None:logging.error(f"An error occurred: {future.exception()}")else:logging.info(f"File processed successfully: {future.result()}")# 所有文件处理完成后,关闭窗口并退出程序root.destroy()
else:logging.info("没有选择PDF文件。")

代码4:超快速PDF文件转换

功能更新

只转换文字,对任何图片表格会出现问题

详细代码

import os
import logging
from tkinter import Tk, filedialog
from concurrent.futures import ThreadPoolExecutor, as_completed
import fitz  # PyMuPDF# 配置日志格式和级别
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')# 定义一个函数来处理单个PDF文件的转换
def process_pdf_file(pdf_path):try:pdf_dir = os.path.dirname(pdf_path)file_name = os.path.splitext(os.path.basename(pdf_path))[0]docx_path = os.path.join(pdf_dir, f"{file_name}.docx")# 使用PyMuPDF读取PDF内容pdf = fitz.open(pdf_path)text = ""for page in pdf:text += page.get_text()pdf.close()# 将文本写入Word文档(这里需要一个将文本转换为docx格式的函数)with open(docx_path, 'w', encoding='utf-8') as f:f.write(text)# 记录文件保存的信息logging.info(f"Converted file saved to {docx_path}")except Exception as e:# 如果发生错误,记录错误信息而不是转换成功信息logging.error(f"Error processing file {pdf_path}: {e}")# 创建主窗口
root = Tk()
root.withdraw()  # 隐藏主窗口# 选择PDF文件
pdf_paths = filedialog.askopenfilenames(title="选择PDF文件", filetypes=[("PDF files", "*.pdf")])if pdf_paths:# 创建一个线程池with ThreadPoolExecutor(max_workers=min(len(pdf_paths), os.cpu_count())) as executor:# 将任务提交到线程池futures = [executor.submit(process_pdf_file, pdf_path) for pdf_path in pdf_paths]# 等待所有任务完成for future in as_completed(futures):future.result()# 所有文件处理完成后,关闭窗口并退出程序root.destroy()
else:logging.info("没有选择PDF文件。")

批量删除文件夹内的全部word:使用Python批量删除文件夹内的Word-CSDN博客

程序打包方式见我的这个文章:在Vscode中将python打包为exe,超级简单,还能自定义exe的logo_怎么将vscode编写的代码打包成exe-CSDN博客

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

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

相关文章

TikTok如何矩阵养号?TK防关联引流系统助力TK账号安全运营

TK是 TikTok旗下的短视频社交媒体,平台目前是全球最火的短视频平台,目前全球活跃用户已经超过8亿。其中 TikTok的用户已经达到8亿。TK这款短视频社交媒体平台在海外的发展潜力非常大,也是国内很多人的创业目标,很多人都想从 TK这个…

文件上传阿里云OSS准备工作及入门程序(保姆级手把手教你)

使用阿里云作为第三方,来存储文件。 登录阿里云官网,开通对象存储OSS 这样就开通成功了。点击 管理控制台 ,出现下面页面。 不过我们也可以不充值购买,先叉掉,它有30天试用的。 创建Bucket 点这个创建Bucket。 创建存…

[论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录

1. 模型权重转换报错 hf2mcore_1.5_v2.py 报错为: /mnt/cpfs/kexin/dlc_code/qwen1.5/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen/hf2mcore_1.5_v2.py 正确文件替换如下,更改了477行,删除了 args.hidden_size 这个维度,在tp>1时也支持转换: eli…

TCM SRAM等五块内存的使用和动态分配

TCM SRAM等五块内存的使用和动态分配 配置sct文件内存使用动态内存分配rtx_lib.hrtx_memory.cmain.c 配置sct文件 LR_IROM1 0x08000000 0x00200000 { ; load region size_regionER_IROM1 0x08000000 0x00200000 { ; load address execution address*.o (RESET, First)*(InRoo…

Spring Boot 学习(4)——开发环境升级与项目 jdk 升级

各种版本都比较老,用起来也是常出各样的问题,终于找到一个看来不错的新教程,是原先那个教程的升级。遂决定升级一下开发环境,在升级遇到一些问题,摸索将其解决,得些体会记录备查。 最终确定开发环境约束如下…

蓝桥杯基础18——第13届省赛真题与代码详解

目录 0.心得体会 1.题目如下 2.代码实现的思路 键值扫描 数码管窗口切换 数码管的动态扫描 继电器工作时L3闪烁,整点时刻L1灯光亮5秒 3.变量列表 定义的常量和数组 功能控制和状态变量 定时器和计数变量 4.代码参考 4.1 头文件 onewire.h ds1302.h 4…

gpu服务器与cpu服务器的区别在哪?

GPU服务器与CPU服务器的区别主要体现在处理能力、应用场景、能源消耗和成本等方面。 处理能力:CPU(中央处理器)是计算机的“大脑”,负责执行指令和处理数据,它的设计注重于逻辑运算和串行处理能力。而GPU(…

全球媒体发稿:海外发稿数字期刊Digital Journal

全球媒体发稿:海外发稿数字期刊Digital Journal ​官网: digitaljournal.com 数字期刊,加拿大知名门户,月访量超过30万。 是一个全球媒体平台和内容合作伙伴,通过捕捉和报道第一,提升新闻周期中的声…

文件上传【2】--靶场通关

1.前端禁用js绕过 上传文件,进行抓包,没有抓到,说明这里的验证是前端js验证跳出的弹窗 禁用js后,php文件上传成功。 2.文件上传.htaccess 上传png木马后连接不上 代码中存在.htaccess,判断此时应该就是需要用到.htac…

【通信原理笔记】【三】——3.7 频分复用

文章目录 前言一、时分复用(TDM)二、频分复用(FDM)总结 前言 现在我们学习了几种调制模拟基带信号的方法,这些调制方法可以将基带信号搬移到频带进行传输。那么如果采用不同的载波频率把多个基带信号搬移到不同的频带…

机器学习-09-图像处理02-PIL+numpy+OpenCV实践

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中图像处理技术。 参考 【人工智能】PythonOpenCV图像处理(一篇全) 一文讲解方向梯度直方图(hog) 【杂谈】计算机视觉在人脸图像领域的十几个大的应用方向&…

【LeetCode】1.两数之和

HashMap class Solution {public int[] twoSum(int[] nums, int target) {int a 0, b 0; // 返回两个索引HashMap<Integer, Integer> hm new HashMap<>(); // key是值&#xff0c;value是索引for (int i 0; i < nums.length; i) {if (!hm.containsKey(nums[…

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“汉服文化平台网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录、用…

论文阅读:Polyp-PVT: Polyp Segmentation with PyramidVision Transformers

这篇论文提出了一种名为Polyp-PVT的新型息肉分割框架&#xff0c;该框架采用金字塔视觉变换器&#xff08;Pyramid Vision Transformer, PVT&#xff09;作为编码器&#xff0c;以显式提取更强大的特征。本模型中使用到的关键技术有三个&#xff1a;渐进式特征融合、通道和空间…

定制个性化的 openEuler 系统镜像:打造独特的安装体验

前言 标准的操作系统镜像可能无法完全满足特定用户群体或特定应用场景的需求。通过定制化&#xff0c;可以根据具体需求预装特定软件、配置特定网络设置&#xff0c;甚至设置特定的用户权限&#xff0c;以确保系统能够满足用户的需求。定制化系统镜像可以优化安装流程&#xf…

mac配置Jmeter环境

mac配置Jmeter环境 一、安装jmeter二、Jmeter目录结构三、汉化Jmeter四、jmeter安装第三方插件 一、安装jmeter 第一步先自行配置好电脑的jdk环境 1、官网下载jar包 https://jmeter.apache.org/download_jmeter.cgi 2、解压到软件安装目录 3、启动Jmeter 启动方式1️⃣&#x…

洛谷-P1596 [USACO10OCT] Lake Counting S

P1596 [USACO10OCT] Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N110; int m,n; char g[N][N]; bool st[N][N]; //走/没走 int dx[] {-1,-1,-1,0,0,1,1,1}; //八联通 int dy[] {-1,0,1,1,-1,1…

docker:chown socket at step GROUP: No such process

docker:chown socket at step GROUP: No such process 原因&#xff1a;docker无法找到Group组信息&#xff0c;docker组有可能被误删除&#xff0c; 解决方式&#xff1a; groupadd docker Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&am…

uniapp 开发小程序如何检测到更新点击重启小程序完成更新?

官方文档&#xff1a;uni.getUpdateManager() | uni-app官网 示例代码&#xff1a; const updateManager uni.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate); });updateManager.onUpdateReady(fu…

【读点论文】Segment Anything,视觉界的GPT,可以通过Prompt完成图像实体理解的视觉基础大模型,处理零样本任务

Segment Anything Abstract 我们介绍了Segment Anything&#xff08;SA&#xff09;项目&#xff1a;一种用于图像分割的新任务、模型和数据集。在数据收集循环中使用我们的高效模型&#xff0c;我们构建了迄今为止&#xff08;迄今为止&#xff09;最大的分割数据集&#xf…