python实现pdf转word和excel

一、引言
  在办公中,我们经常遇收到pdf文件格式,因为pdf格式文件不易修改,当我们需要编辑这些pdf文件时,经常需要开通会员或收费功能才能使用编辑功能。今天,我要和大家分享的,是如何使用python编程实现,将PDF文件轻松转换成Word和Excel格式,让编辑变得轻而易举。


二、python编程
  要将PDF转换为Word,我们需要解析PDF的布局和内容,并将其重新格式化为Word文档。这涉及到复杂的文本识别和格式转换技术。

使用过如下几个库:最好的还是pdf2docx。

(一)、使用 pdf2docx 库
(二)、使用 PyMuPDF 库
(三)、使用 pdfplumber 库
(四)、使用 PyPDF2 和 python-docx 库

重点:pdf2docx 是一个将 PDF 文件转换为 DOCX 文件的 Python 库。

pip install pdf2docx -i https://mirrors.aliyun.com/pypi/simple

更换PIP源
  PIP源在国外,速度慢,可以更换为国内源,以下是国内一些常用的PIP源。

豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

1,PDF转Word

from pdf2docx import Converter# pdf转word方法
def pdf_to_word(pdf_path, word_path=None, page_nums=None):'''@方法名称: pdf转word@中文注释: pdf转word@入参:@param pdf_path str pdf文件路径@param page_nums str 页码序号@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@param doc_file str word文件名@作    者: PandaCode辉@weixin公众号: PandaCode辉@创建时间: 2024-12-17@使用范例: pdf_to_word('test.pdf')'''global cvresult_dict = {}try:if not type(pdf_path) is str:result_dict["error_code"] = "111111"result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"return result_dict# 检查PDF文件是否存在if not os.path.isfile(pdf_path):result_dict["error_code"] = "999999"result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"return result_dictstart_time = time.time()if not word_path:# 使用os.path.basename()获取文件名file_path = os.path.dirname(pdf_path)# 使用os.path.basename()获取文件名file_name = os.path.basename(pdf_path)# 提取文件名,去除文件后缀file_name = file_name.split('.')[0]# print(file_name)# word文件名+路径word_path = os.path.join(file_path, f'{file_name}.docx')# print(word_path)# 初始化转换器cv = Converter(pdf_path)# 转换整本PDF或指定页码if page_nums:# 解析页码参数pages = []for part in page_nums.split(','):if '-' in part:start, end = part.split('-')pages.extend(range(int(start) - 1, int(end)))else:pages.append(int(part) - 1)# 转换指定页码cv.convert(docx_filename=word_path, pages=pages)else:# 转换整本PDFcv.convert(docx_filename=word_path, start=0)# 保存为Word文档cv.close()# 识别时间end_time = time.time()# 计算耗时差,单位毫秒recognize_time = (end_time - start_time) * 1000# 保留2位小数recognize_time = round(recognize_time, 2)# print('处理时间:' + str(recognize_time) + '毫秒')result_dict["recognize_time"] = recognize_timeresult_dict["error_code"] = "000000"result_dict["error_msg"] = "pdf转word成功"# 使用os.path.basename()获取文件名word_file_name = os.path.basename(word_path)# 打印结果# print("文件名:", word_file_name)result_dict["filename"] = word_file_nameresult_dict["file_size_mb"] = file_size_mbreturn result_dictexcept Exception as e:cv.close()print("pdf转word异常," + str(e))result_dict["error_code"] = "999999"result_dict["error_msg"] = "PDF到Word转换过程中发生错误," + str(e)return result_dict

2,PDF转Excel

要将PDF转换为Excel,目前没有现成的转换库,需要稍加处理下。

使用过如下几个库:

(一)、使用 pdf2docx 库 和 docx 库 和 pandas 库

先将pdf转成word文档,然后读取word文档中的表格内容,然后再转成excel文档。
 

pip install python-docx -i https://mirrors.aliyun.com/pypi/simple

pip install pandas -i https://mirrors.aliyun.com/pypi/simple

from docx import Document
import pandas as pd
'''
不擅长编程的用户,可以选择我的免费工具箱,开箱即用,方便快捷。
print("搜/索/wei/xin/小/程/序:  全能科技工具箱")
'''
# pdf转excel方法
def pdf_to_excel(pdf_path, xlsx_path=None, page_nums=None):'''@方法名称: pdf转excel@中文注释: pdf转excel@入参:@param pdf_path str pdf文件路径@param page_nums str 页码序号@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@param xlsx_file str excel文件名@作    者: PandaCode辉@weixin公众号: PandaCode辉@创建时间: 2025-01-06@使用范例: pdf_to_excel('test.pdf')'''global cvresult_dict = {}try:if not type(pdf_path) is str:result_dict["error_code"] = "111111"result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"return result_dict# 检查PDF文件是否存在if not os.path.isfile(pdf_path):result_dict["error_code"] = "999999"result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"return result_dictstart_time = time.time()# 使用os.path.basename()获取文件名file_path = os.path.dirname(pdf_path)# 使用os.path.basename()获取文件名file_name = os.path.basename(pdf_path)# 提取文件名,去除文件后缀file_name = file_name.split('.')[0]# print(file_name)# word文件名+路径word_path = os.path.join(file_path, f'{file_name}.docx')# print(word_path)if not xlsx_path:# xlsx文件名+路径xlsx_path = os.path.join(file_path, f'{file_name}.xlsx')# print(xlsx_path)# 第一步,先将pdf转成doc文档rsp_dict = pdf_to_word(pdf_path, page_nums=page_nums)if rsp_dict["error_code"] == "000000":# 第二步,再读取doc文档,转成xlsx文档# 打开Word文档doc = Document(word_path)if len(doc.tables) < 1:result_dict["error_code"] = "999999"result_dict["error_msg"] = "PDF文件未找到表格内容,无法转成xlsx文档."return result_dict# 创建一个Excel writer对象with pd.ExcelWriter(xlsx_path, engine='openpyxl') as writer:# 遍历文档中的所有表格for i, table in enumerate(doc.tables, start=1):# 创建一个空的DataFrame来存储表格数据data = []# 遍历表格中的所有行for row in table.rows:# 遍历行中的所有单元格row_data = []for cell in row.cells:row_data.append(cell.text)data.append(row_data)# 将数据转换为DataFramedf = pd.DataFrame(data)# 将DataFrame保存到Excel的不同工作表中sheet_name = f"Table_{i}"df.to_excel(writer, sheet_name=sheet_name, index=False, header=False)# print(f"转换完成,结果保存在{xlsx_path}中。")else:result_dict["error_code"] = rsp_dict["error_code"]result_dict["error_msg"] = rsp_dict["error_msg"]return result_dict# 识别时间end_time = time.time()# 计算耗时差,单位毫秒recognize_time = (end_time - start_time) * 1000# 保留2位小数recognize_time = round(recognize_time, 2)# print('处理时间:' + str(recognize_time) + '毫秒')result_dict["recognize_time"] = recognize_timeresult_dict["error_code"] = "000000"result_dict["error_msg"] = "pdf转excel成功"# 使用os.path.basename()获取文件名xlsx_file_name = os.path.basename(xlsx_path)result_dict["filename"] = xlsx_file_namereturn result_dictexcept Exception as e:print("pdf转excel异常," + str(e))result_dict["error_code"] = "999999"result_dict["error_msg"] = "PDF到excel转换过程中发生错误," + str(e)return result_dict

(二)、使用 pdfplumber 和 python-pandas 库

使用pdfplumber库读取pdf表格内容,然后写入excel表格文档中。

pip install pdfplumber -i https://mirrors.aliyun.com/pypi/simple

import pandas as pd
import pdfplumber'''
不擅长编程的用户,可以选择我的免费工具箱,开箱即用,方便快捷。
print("搜/索/wei/xin/小/程/序:  全能科技工具箱")
'''def pdf_to_excel_new(pdf_path, xlsx_path=None, page_nums=None):'''@方法名称: pdf转excel@中文注释: pdf转excel@入参:@param pdf_path str pdf文件路径@param page_nums str 页码序号@出参:@返回状态:@return 0 失败或异常@return 1 成功@返回错误码@返回错误信息@param xlsx_file str excel文件名@作    者: PandaCode辉@weixin公众号: PandaCode辉@创建时间: 2025-01-06@使用范例: pdf_to_excel('test.pdf')'''result_dict = {}try:if not type(pdf_path) is str:result_dict["error_code"] = "111111"result_dict["error_msg"] = "pdf文件路径参数类型错误,不为字符串"return result_dict# 检查PDF文件是否存在if not os.path.isfile(pdf_path):result_dict["error_code"] = "999999"result_dict["error_msg"] = f"PDF文件未找到: {pdf_path}"return result_dictstart_time = time.time()# 使用os.path.basename()获取文件名file_path = os.path.dirname(pdf_path)# 使用os.path.basename()获取文件名file_name = os.path.basename(pdf_path)# 提取文件名,去除文件后缀file_name = file_name.split('.')[0]# print(file_name)if not xlsx_path:# xlsx文件名+路径xlsx_path = os.path.join(file_path, f'{file_name}.xlsx')# print(xlsx_path)# 提取 PDF 中的文本数据with pdfplumber.open(pdf_path) as pdf:if len(pdf.pages) < 1:result_dict["error_code"] = "999999"result_dict["error_msg"] = "PDF文件未找到表格内容,无法转成xlsx文档."return result_dict# 创建一个 Excel 的写入器with pd.ExcelWriter(xlsx_path) as writer:# 转换整本PDF或指定页码if page_nums:# 解析页码参数pages = []for part in page_nums.split(','):if '-' in part:start, end = part.split('-')pages.extend(range(int(start) - 1, int(end)))else:pages.append(int(part) - 1)# 转换指定页码for i in pages:page = pdf.pages[i]# 提取当前页的表格数据table = page.extract_table()if table:# 将表格数据转换为 DataFramedf = pd.DataFrame(table)# 将 DataFrame 写入 Excel 的不同工作表df.to_excel(writer, sheet_name=f'Page {i}', index=False)else:# 转换整本PDFfor i, page in enumerate(pdf.pages, start=1):# 提取当前页的表格数据table = page.extract_table()if table:# 将表格数据转换为 DataFramedf = pd.DataFrame(table)# 将 DataFrame 写入 Excel 的不同工作表df.to_excel(writer, sheet_name=f'Page {i}', index=False)# 识别时间end_time = time.time()# 计算耗时差,单位毫秒recognize_time = (end_time - start_time) * 1000# 保留2位小数recognize_time = round(recognize_time, 2)# print('处理时间:' + str(recognize_time) + '毫秒')result_dict["recognize_time"] = recognize_timeresult_dict["error_code"] = "000000"result_dict["error_msg"] = "pdf转excel成功"# 使用os.path.basename()获取文件名xlsx_file_name = os.path.basename(xlsx_path)# 打印结果# print("文件名:", xlsx_file_name)result_dict["filename"] = xlsx_file_name# 获取文件大小(字节)file_size_bytes = os.path.getsize(xlsx_path)# 将字节转换为兆字节file_size_mb = file_size_bytes / (1024 * 1024)# 打印结果# print("文件大小(兆字节):", file_size_mb)result_dict["file_size_mb"] = file_size_mbreturn result_dictexcept Exception as e:print("pdf转excel异常," + str(e))result_dict["error_code"] = "999999"result_dict["error_msg"] = "PDF到excel转换过程中发生错误," + str(e)return result_dict

三、前端页面效果展示

1,选择PDF文件

2,选择转换类型:PDF转Word 和 PDF转Excel

3,页面范围:可选参数,不选则全部转换
  

总结

  • pdf2docx 和 PyMuPDF 是pdf转word更直接的选择,因为它们专门用于转换 PDF 到 DOCX,并且通常在版面还原方面做得更好。
  • pdfplumber 更适合于文本和表格的提取,而不是直接的格式转换。
  • PyPDF2 和 python-docx 的组合提供了更多的灵活性,但可能需要更多的自定义代码来处理复杂的布局和格式。

根据你的需求,选择最适合你的库。如果你需要高度保真的版面还原,pdf2docx 或 PyMuPDF 可能是更好的选择。如果你需要从 PDF 中提取文本和表格数据,pdfplumber 可能更适合。

 

  

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

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

相关文章

Java锁 公平锁和非公平锁 ReentrantLock() 深入源码解析

卖票问题 我们现在有五个售票员 五个线程分别卖票 卖票 ReentrantLock(); 运行后全是 a 对象获取 非公平锁缺点之一 容易出现锁饥饿 默认是使用的非公平锁 也可以传入一个 true 参数 使其变成公平锁 生活中排队讲求先来后到 视为公平 程序中的公平性也是符合请求锁的绝对…

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程(配套案例数据)》专栏上线了

「刘一哥GIS」系列专栏《GRASS GIS零基础入门实验教程》全新上线了&#xff0c;欢迎广大GISer朋友关注&#xff0c;一起探索GIS奥秘&#xff0c;分享GIS价值&#xff01; 本专栏以实战案例的形式&#xff0c;深入浅出地介绍了GRASS GIS的基本使用方法&#xff0c;用一个个实例讲…

企业级NoSQL数据库Redis

1.浏览器缓存过期机制 1.1 最后修改时间 last-modified 浏览器缓存机制是优化网页加载速度和减少服务器负载的重要手段。以下是关于浏览器缓存过期机制、Last-Modified 和 ETag 的详细讲解&#xff1a; 一、Last-Modified 头部 定义&#xff1a;Last-Modified 表示服务器上资源…

使用Flask和Pydantic实现参数验证

使用Flask和Pydantic实现参数验证 1 简介 Pydantic是一个用于数据验证和解析的 Python 库&#xff0c;版本2的性能有较大提升&#xff0c;很多框架使用Pydantic做数据校验。 # 官方参考文档 https://docs.pydantic.dev/latest/# Github地址 https://github.com/pydantic/pyd…

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

从零开始学数据库 day2 DML

从零开始学数据库&#xff1a;DML操作详解 在今天的数字化时代&#xff0c;数据库的使用已经成为了各行各业的必备技能。无论你是想开发一个简单的应用&#xff0c;还是想要管理复杂的数据&#xff0c;掌握数据库的基本操作都是至关重要的。在这篇博客中&#xff0c;我们将专注…

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服

运行fastGPT 第五步 配置FastGPT和上传知识库 打造AI客服 根据上一步的步骤&#xff0c;已经调试了ONE API的接口&#xff0c;下面&#xff0c;我们就登陆fastGPT吧 http://xxx.xxx.xxx.xxx:3000/ 这个就是你的fastGPT后台地址&#xff0c;可以在configer文件中找到。 账号是…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

【王树森搜索引擎技术】相关性02:评价指标(AUC、正逆序比、DCG)

相关性的评价指标 Pointwise评价指标&#xff1a;Area Under the Curve&#xff08;AUC&#xff09;Pairwise评价指标&#xff1a;正逆序比&#xff08;Positive to Negative Ratio, PNR&#xff09;Listwise评价指标&#xff1a;Discounted Cumulative Gain(DCG)用AUC和PNR作…

人物一致性训练测评数据集

1.Pulid 训练:由1.5M张从互联网收集的高质量人类图像组成,图像标题由blip2自动生成。 测试:从互联网上收集了一个多样化的肖像测试集,该数据集涵盖了多种肤色、年龄和性别,共计120张图像,我们称之为DivID-120,作为补充资源,还使用了最近开源的测试集Unsplash-50,包含…

python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务 version: "3" services:mysql:container_name: mysql# 5.7image: mysql:5.7environment:# mysql root用户密码MYSQL_ROOT_PASSWORD: rootTZ: Asia/Shanghai# 初始化数据库(后续的初始化sql会在这个库执行)MYSQL_DATABASE: nac…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

A5.Springboot-LLama3.2服务自动化构建(二)——Jenkins流水线构建配置初始化设置

下面我们接着上一篇文章《A4.Springboot-LLama3.2服务自动化构建(一)——构建docker镜像配置》继续往下分析,在自动化流水线构建过程当中的相关初始化设置和脚本编写。 一、首先需要先安装Jenkins 主部分请参考我前面写的一篇文章《Jenkins持续集成与交付安装配置》 二、…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…

使用C语言实现栈的插入、删除和排序操作

栈是一种后进先出(LIFO, Last In First Out)的数据结构,这意味着最后插入的元素最先被删除。在C语言中,我们可以通过数组或链表来实现栈。本文将使用数组来实现一个简单的栈,并提供插入(push)、删除(pop)以及排序(这里采用一种简单的排序方法,例如冒泡排序)的操作示…

wx030基于springboot+vue+uniapp的养老院系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…