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.pswp.cn/web/66427.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66427.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66427.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【PyCharm】連接Jupyter Notebook

【PyCharm】相關鏈接 【PyCharm】連接 Git【PyCharm】連接Jupyter Notebook【PyCharm】快捷鍵使用【PyCharm】遠程連接Linux服務器【PyCharm】設置為中文界面 【PyCharm】連接Jupyter Notebook PyCharm連接Jupyter Notebook的過程可以根據不同的需求分為 本地連接 和 遠程連…

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;我們將專注…

Java 8 Stream API

文章目錄 Java 8 Stream API1. Stream2. Stream 的創建3. 常見的 Stream 操作3.1 中間操作3.2 終止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得對集合類&#xff08;如 List、Set 等&#xff09;的操作變得更加簡潔和直觀。Stream…

運行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,包含…

Android 項目依賴沖突問題:Duplicate class found in modules

問題描述與處理處理 1、問題描述 plugins {id com.android.application }android {compileSdk 34defaultConfig {applicationId "com.my.dialog"minSdk 21targetSdk 34versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.run…

計算機網絡 | 什么是公網、私網、NAT?

關注&#xff1a;CodingTechWork 引言 計算機網絡是現代信息社會的基石&#xff0c;而網絡通信的順暢性和安全性依賴于有效的IP地址管理和網絡轉換機制。在網絡中&#xff0c;IP地址起到了標識設備和進行數據傳輸的核心作用。本文將詳細討論公網IP、私網IP以及NAT轉換等網絡技…

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的模型講解將…

基于 WEB 開發的汽車養護系統設計與實現

標題:基于 WEB 開發的汽車養護系統設計與實現 內容:1.摘要 本文介紹了基于 WEB 開發的汽車養護系統的設計與實現。文章首先闡述了系統的背景和目的&#xff0c;即隨著汽車保有量的增加&#xff0c;汽車養護需求日益增長&#xff0c;傳統的汽車養護方式已經無法滿足人們的需求&…

GitLab集成Jira

GitLab與Jira集成的兩種方式 GitLab 提供了兩種 Jira 集成&#xff0c;即Jira議題集成和Jira開發面板集成&#xff0c;可以配置一個或者兩個都配置。 具體集成步驟可以參考官方文檔Jira 議題集成&#xff08;極狐GitLab文檔&#xff09;和Jira 開發面板集成&#xff08;極狐G…

【爬蟲】某某查cookie逆向

代碼僅供技術人員進行學習和研究使用&#xff0c;請勿將其用于非法用途或以任何方式竊取第三方數據。使用該代碼產生的所有風險均由用戶自行承擔&#xff0c;作者不對用戶因使用該代碼而造成的任何損失或損害承擔任何責任。 加密參數 加密參數主要是cookie&#xff0c;其中只有…