python实现pdf转word和excel

news/2025/1/30 23:21:40/

一、引言
  在办公中,我们经常遇收到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/news/1567586.html

相关文章

第20篇:Python 开发进阶:使用Django进行Web开发详解

第20篇&#xff1a;使用Django进行Web开发 内容简介 在上一篇文章中&#xff0c;我们深入探讨了Flask框架的高级功能&#xff0c;并通过构建一个博客系统展示了其实际应用。本篇文章将转向Django&#xff0c;另一个功能强大且广泛使用的Python Web框架。我们将介绍Django的核…

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言 冯诺依曼架构是现代计算机系统的基础&#xff0c;它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时&#xff0c;理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的&#xff0c;包括程序的存储、执行和资源管理。这对于编写高效、可靠的…

二级C语言题解:孤独数、找最长子串、返回两数组交集

目录 一、程序填空 --- 孤独数 题目 分析 二、程序修改 --- 找最长子串 题目 分析 三、程序设计题 --- 返回两数组交集 题目 分析 前言&#xff1a; 本文开始讲解二级C语言的程序填空题和程序改错题以及程序设计题 旨在帮助大家更好的理解这些题目 希望能够帮助到大家(…

使用八爪鱼爬虫和Web Scraper抓取数据实战案例,附详细教程

最近有不少小伙伴咨询怎么抓取抖音视频或者评论的数据&#xff0c;他们多是自媒体或者商家&#xff0c;想要模仿爆火视频或者分析视频评论区的舆情信息&#xff0c;确实呀&#xff0c;现在抖音是流量高地&#xff0c;淘金的地方&#xff0c;真的是一个值得挖掘的宝藏。当然我一…

机器学习:支持向量机

支持向量机&#xff08;Support Vector Machine&#xff09;是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的广义线性分类器&#xff0c;其学习策略便是间隔最大化&#xff0c;最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…

08.OSPF 特殊区域及其他特性

OSPF 特殊区域及其他特性 一. 前言OSPF的四个特殊区域Stub末梢区域Totally Stub完全末梢区域NSSATotally NSSA完全的NSSA二.Stub 区域和 Totally Stub 区域(1)网络规模变大引发的问题(2)传输区域和末端区域(3)Stub 区域(4)Totally Stub 区域三.NSSA 区域和 Totally NSS…

运行虚幻引擎UE设置Visual Studio

运行虚幻引擎UE设置Visual Studio 1. 枚举转换为字符串2. 修改 解决方案配置 下拉框宽度3. 调试较慢4. 如何修复GPU驱动程序崩溃 1. 枚举转换为字符串 -Desc: 从静态 Uenum 调用 GetNameStringByValue 并为其提供你要获取其名称的值&#xff0c;可以将枚举转换为字符串。初始化…