python实现pdf转word和excel

ops/2025/1/21 11:11:28/

一、引言
  在办公中,我们经常遇收到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# pdfword方法
def pdf_to_word(pdf_path, word_path=None, page_nums=None):'''@方法名称: pdfword@中文注释: pdfword@入参:@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"] = "pdfword成功"# 使用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("pdfword异常," + 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/小/程/序:  全能科技工具箱")
'''
# pdfexcel方法
def pdf_to_excel(pdf_path, xlsx_path=None, page_nums=None):'''@方法名称: pdfexcel@中文注释: pdfexcel@入参:@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"] = "pdfexcel成功"# 使用os.path.basename()获取文件名xlsx_file_name = os.path.basename(xlsx_path)result_dict["filename"] = xlsx_file_namereturn result_dictexcept Exception as e:print("pdfexcel异常," + 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):'''@方法名称: pdfexcel@中文注释: pdfexcel@入参:@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"] = "pdfexcel成功"# 使用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("pdfexcel异常," + 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 是pdfword更直接的选择,因为它们专门用于转换 PDF 到 DOCX,并且通常在版面还原方面做得更好。
  • pdfplumber 更适合于文本和表格的提取,而不是直接的格式转换。
  • PyPDF2 和 python-docx 的组合提供了更多的灵活性,但可能需要更多的自定义代码来处理复杂的布局和格式。

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

 

  


http://www.ppmy.cn/ops/151893.html

相关文章

Postman环境变量全局变量设置

在公司中&#xff0c;一般会存在开发环境、测试环境、线上环境等&#xff0c;如果需要在不 同的环境下切换做接口测试&#xff0c;显然我们需要把所有接口的域名进行修改&#xff0c;如果接 口测试用例较多&#xff0c;那么修改会非常费力&#xff0c;postman可直接通过切换环境…

深入理解Linux系统内存中文件结构以及缓冲区,模拟实现c语言库文件接口

目录 一、文件的理解 二、文件操作 1.Linux系统中文件接口&#xff1a; 1.1.open 1.2.write 1.3.read 三、文件描述符 四、重定向的理解 五、缓冲区 1.语言层缓冲区 2.系统层缓冲区 3.缓冲区刷新策略&#xff08;语言层&#xff09; 六、c文件接口的模拟实现 1.m…

【Elasticsearch】搜索类型介绍,以及使用SpringBoot实现,并展现给前端

Elasticsearch 提供了多种查询类型&#xff0c;每种查询类型适用于不同的搜索场景。以下是八种常见的 Elasticsearch 查询类型及其详细说明和示例。 1. Match Query 用途&#xff1a;用于全文搜索&#xff0c;会对输入的文本进行分词&#xff0c;并在索引中的字段中查找这些分…

Azure Synapse Dedicated SQL Pool实用命令语句

一、数据管理相关命令 1. 数据加载 COPY 命令&#xff1a;用于从外部存储&#xff08;如 Azure Blob 存储&#xff09;加载数据到 Dedicated SQL Pool 中。 COPY INTO [dbo].[target_table] FROM https://<storage_account>.blob.core.windows.net/<container>/…

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

利用rsync备份全网服务器数据

一、项目描述 某公司里有一台Web服务器&#xff0c;里面的数据很重要&#xff0c;但是如果硬盘坏了数据就会丢失&#xff0c;现在领导要求把数据做备份&#xff0c;这样Web服务器数据丢失在可以进行恢复&#xff0c;要求如下&#xff1a; 1、备份要求 每天晚上00点整在Web服…

什么是SSL及SSL的工作流程

什么是 SSL SSL(Secure Sockets Layer,安全套接层)是一种保护互联网通信安全的加密协议,用于确保数据在客户端和服务器之间传输时的保密性、完整性和身份验证。它已被TLS(Transport Layer Security,传输层安全协议)取代,但很多场景仍习惯称其为SSL。 SSL/TLS 的主要目…

前端如何实现分页

前言 虽然在实际开发中&#xff0c;大多数分页都是由后端处理&#xff0c;但还是有小部分场景需要前端来实现分页。 实现并不难&#xff0c;仅作为记录&#xff0c;方便下次拿来直接使用。 准备数据源 数据源可以是从后端获取的数据列表&#xff0c;也可以是前端模拟的数据集…