【Python辦公】Python如何批量提取PDF中的表格

目錄

    • 專欄導讀
    • 概述
    • 主要工具庫介紹
      • 1. tabula-py
      • 2. camelot-py
      • 3. pdfplumber
      • 4. PyMuPDF (fitz)
    • 環境準備
      • 安裝依賴
      • Java環境配置(tabula-py需要)
    • 方法一:使用tabula-py提取表格
      • 基礎用法
      • 高級配置
    • 方法二:使用camelot-py提取表格
    • 方法三:使用pdfplumber提取表格
    • 批量處理多個PDF文件
    • 數據后處理和清洗
    • 完整的批量處理腳本
    • 使用示例
    • 常見問題和解決方案
      • 1. Java環境問題
      • 2. 表格識別不準確
      • 3. 內存不足
      • 4. 中文編碼問題
    • 性能優化建議
    • 總結
    • 結尾

專欄導讀

  • ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手

  • ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注

  • ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱

  • ?? 此外還有爬蟲專欄:請點擊——>Python爬蟲基礎專欄求訂閱

  • ?? 此外還有python基礎專欄:請點擊——>Python基礎學習專欄求訂閱

  • 文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正??

  • ?? 歡迎各位佬關注! ??

概述

在日常工作中,我們經常需要從PDF文件中提取表格數據進行分析。手動復制粘貼不僅效率低下,還容易出錯。本文將介紹如何使用Python自動化批量提取PDF中的表格數據,并將其轉換為可處理的格式。

主要工具庫介紹

1. tabula-py

  • 優勢:專門用于PDF表格提取,功能強大
  • 特點:基于Java的tabula庫,支持復雜表格結構
  • 適用場景:結構化表格,邊框清晰的PDF

2. camelot-py

  • 優勢:高精度表格提取,支持表格質量評估
  • 特點:提供多種提取策略,可視化調試
  • 適用場景:高質量PDF文檔,需要精確提取

3. pdfplumber

  • 優勢:輕量級,易于使用
  • 特點:可以提取文本、表格和圖像信息
  • 適用場景:簡單表格,文本密集型PDF

4. PyMuPDF (fitz)

  • 優勢:功能全面,性能優秀
  • 特點:支持多種PDF操作,包括表格提取
  • 適用場景:復雜PDF處理需求

環境準備

安裝依賴

# 安裝tabula-py(需要Java環境)
pip install tabula-py# 安裝camelot-py
pip install camelot-py[cv]# 安裝pdfplumber
pip install pdfplumber# 安裝PyMuPDF
pip install PyMuPDF# 安裝pandas用于數據處理
pip install pandas# 安裝其他輔助庫
pip install openpyxl xlsxwriter

Java環境配置(tabula-py需要)

# 檢查Java版本
java -version# 如果沒有Java,需要安裝JDK 8或更高版本

方法一:使用tabula-py提取表格

基礎用法

import tabula
import pandas as pd
import os
from pathlib import Pathdef extract_tables_with_tabula(pdf_path, output_dir):"""使用tabula-py提取PDF中的表格Args:pdf_path: PDF文件路徑output_dir: 輸出目錄"""try:# 提取所有表格tables = tabula.read_pdf(pdf_path, pages='all', multiple_tables=True)pdf_name = Path(pdf_path).stem# 保存每個表格for i, table in enumerate(tables):if not table.empty:output_file = os.path.join(output_dir, f"{pdf_name}_table_{i+1}.xlsx")table.to_excel(output_file, index=False)print(f"表格 {i+1} 已保存到: {output_file}")return len(tables)except Exception as e:print(f"處理文件 {pdf_path} 時出錯: {str(e)}")return 0# 使用示例
pdf_file = "example.pdf"
output_directory = "extracted_tables"
os.makedirs(output_directory, exist_ok=True)table_count = extract_tables_with_tabula(pdf_file, output_directory)
print(f"共提取了 {table_count} 個表格")

高級配置

def advanced_tabula_extraction(pdf_path, output_dir):"""高級tabula提取配置"""try:# 自定義提取參數tables = tabula.read_pdf(pdf_path,pages='all',multiple_tables=True,lattice=True,  # 使用格線檢測stream=False,  # 不使用流模式guess=True,    # 自動猜測表格區域pandas_options={'header': 0}  # 設置第一行為表頭)pdf_name = Path(pdf_path).stemfor i, table in enumerate(tables):if not table.empty:# 數據清洗table = table.dropna(how='all')  # 刪除全空行table = table.dropna(axis=1, how='all')  # 刪除全空列# 保存為多種格式base_name = f"{pdf_name}_table_{i+1}"# Excel格式excel_file = os.path.join(output_dir, f"{base_name}.xlsx")table.to_excel(excel_file, index=False)# CSV格式csv_file = os.path.join(output_dir, f"{base_name}.csv")table.to_csv(csv_file, index=False, encoding='utf-8-sig')print(f"表格 {i+1} 已保存: {base_name}")return len(tables)except Exception as e:print(f"處理失敗: {str(e)}")return 0

方法二:使用camelot-py提取表格

import camelot
import pandas as pddef extract_tables_with_camelot(pdf_path, output_dir):"""使用camelot-py提取PDF表格"&

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91263.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91263.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91263.shtml

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

相關文章

MySQL自定義order by排序規則

數據表create table tb_user (id bigint auto_incrementprimary key,name varchar(16) not null,age int not null,address varchar(128) null );INSERT INTO test.tb_user (id, name, age, address) VALUES (1, 張三, 18, China); INSERT INTO test.tb_…

112套開題答辯行業PPT模版

畢業答辯開題報告,畢業答辯,論文設計PPT,清新論文答辯PPT模版,畢業論文答辯開題報告PPT,答辯演講通用PPT模版,文藝時尚畢業答辯PPT模版,簡約畢業論文答辯PPT模版112套開題答辯行業PPT模版&#…

驅動開發系列61- Vulkan 驅動實現-SPIRV到HW指令的實現過程(2)

本節繼續介紹下SPIR-V到LLVM IR的轉換過程,重點分析其核心機制和關鍵轉換步驟。我們將從 LLVM 入手,結合實SPIR-V結構逐步轉換為符合 LLVM IR 語義的表示方式。 一:詳細過程 1. 創建llvm::module llvm::LLVMContext llvmContext; std::unique_ptr<llvm::Mod…

集訓Demo2

做一個類似原神圣遺物生成、穿戴、卸下的案例創建項目創建數據庫添加圣遺物獲取4個數字&#xff0c;對應圣遺物隨機的四種屬性構造對象添加批量刪除圣遺物foreach構造數組轉移圣遺物分別在items和character兩個庫中根據id獲取對象&#xff0c;判斷唯一id存在哪個數據庫中在item…

RedisJSON 技術揭秘`JSON.CLEAR` 一鍵清空容器、重置數字的“軟刪除”

一、指令速查 JSON.CLEAR <key> [path]參數說明keyRedis 鍵名pathJSONPath&#xff08;可選&#xff0c;缺省 $ 根&#xff1b;支持 *、.. 多路徑&#xff09;返回值&#xff1a;整數——被清空的數組 / 對象數量 被置零的數值字段數量。已為空或為 0 的字段不會重復統計…

Java單元測試JUnit

文章目錄前言一、JUnit描述&#xff08;引入Maven&#xff09;二、基本API注解2.1、Assert類2.2、JUnit注解三、普通單元測試3.1、BeforeClass、AfterClass、Before、After、Test合集測試四、SpringBoot單元測試4.1、SpringBoot集成Junit介紹4.2、實戰&#xff1a;SpringBoot項…

HR數字化轉型:3大痛點解決方案與效率突破指南

在人力資源部門工作多年&#xff0c;每天面對堆積如山的簡歷、此起彼伏的員工咨詢、錯綜復雜的薪酬報表……作為HR的你&#xff0c;是否常感到被海量事務性工作淹沒&#xff0c;難以喘息&#xff1f;在數字化轉型的浪潮下&#xff0c;傳統工作方式正遭遇前所未有的挑戰。本文將…

如何運用個人IP影響力尋找使命的力量|創客匠人

在知識付費領域&#xff0c;那些能穿越周期的 IP&#xff0c;往往不只是 “賣課機器”&#xff0c;而是以使命為內核的價值傳遞者。使命為知識變現注入靈魂&#xff0c;讓知識產品從 “信息交易” 升華為 “價值共鳴”&#xff0c;這正是個人 IP 實現深度變現與長期影響力的關鍵…

軟件開發中的瀑布式開發與敏捷開發

一、瀑布式開發&#xff08;Waterfall Model&#xff09;核心流程 采用線性、階段化開發&#xff0c;依次經歷需求分析、設計、開發、測試、部署、維護&#xff0c;前一階段完成后進入下一階段&#xff0c;如瀑布流水單向推進。 典型階段&#xff1a;需求固化→架構設計→代碼實…

如何卸載SQLServer

1.打開控制面板2.雙擊&#xff0c;彈出對話框&#xff0c;點擊刪除3.然后一步一步跟著提示&#xff0c;下一步下一步就好了。4.如果發現沒有卸載干凈&#xff0c;快捷鍵winR&#xff0c;輸入regedit&#xff0c;進入注冊表5.找到計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\…

策略設計模式分析

策略設計模式概述策略模式&#xff08;Strategy Pattern&#xff09;屬于行為型設計模式&#xff0c;允許在運行時動態選擇算法或行為。它將算法封裝成獨立的類&#xff0c;使得它們可以相互替換&#xff0c;而不會影響客戶端代碼。核心組件1. 策略接口&#xff08;Strategy In…

IPM31主板E3300usb鍵盤鼠標安裝成功Sata接口硬盤IDE模式server2003-nt-5.2.3790

IPM31主板E3300usb鍵盤鼠標安裝成功Sata接口硬盤IDE模式server2003-nt-5.2.3790

Docker環境搭建與容器操作全攻略:從入門到實戰

一、環境搭建 1.1 基礎包安裝&#xff08;最小化系統&#xff09; # 備份Yum源配置 mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 配置Yum源示例 可以更換為阿里云鏡像 cat <<EOF > /etc/yum.repos.d/local.repo [baseos] …

4.2TCP/IP

1、TCP/IP基礎&#xff08;重要&#xff09;概要網絡協議3要素&#xff1a;語法、語義、時序 osi七層模型&#xff1a;應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層tcp四層模型&#xff1a;應用層&#xff08;應用層、表示層、會話層&#xff09;、傳輸層、int…

Java之Stream其二

文章目錄5,Optional5.1,概述5.2,使用5.2.1,創建對象5.2.2,安全消費值5.2.3,獲取值5.2.4,安全獲取值5.2.5,過濾5.2.6,判斷5.2.7,數據轉換6,方法引用6.1 推薦用法6.2 基本格式6.3 語法詳解(了解)6.3.1 引用類的靜態方法6.3.2 引用對象的實例方法6.3.3 引用類的實例方法6.3.4 構造…

一般芯片電氣特性中Flash參數達到其最大值的條件是什么?

芯片電氣特性中標注的最大值&#xff08;比如 Data Flash 擦除時間的最大值&#xff09;&#xff0c;代表在最惡劣但仍在規格書定義的工作條件范圍內的情況下&#xff0c;該參數可能達到的最差值。達到這個最大值通常是由多個最壞情況因素組合造成的。 對于 Data Flash 擦除時間…

python中正則中的split方法、sub方法、finditer方法、compile方法、match對象

正則常見方法梳理 split方法 將一個字符串按照正則表達式匹配結果進行分割,返回結果是列表類型。 pattern:正則表達式的字符串或原生字符串表示string:待匹配字符串maxsplit:最大分割數,剩余部分最為最后一個元素輸出flags:正則表達式使用時候的控制標記 re模塊的spli…

Pytorch中張量的索引和切片使用詳解和代碼示例

PyTorch 中張量索引與切片詳解 使用前先導入&#xff1a; import torch1.基礎索引&#xff08;類似 Python / NumPy&#xff09; 適用于低維張量&#xff1a;x[i]、x[i, j] x torch.tensor([[10, 11, 12],[13, 14, 15],[16, 17, 18]])print(x[0]) # 第0行: tensor([10…

北京-4年功能測試2年空窗-報培訓班學測開-第五十一天

行叭&#xff0c;今天復習第一天&#xff0c;狀態效率&#xff0c;差我發現&#xff0c;一旦換了新環境/知識&#xff0c;我就需要重新調整狀態&#xff0c;少則一兩天&#xff0c;多則一周多。從周日起就很迷茫&#xff0c;哪怕昨天老師講了簡歷與面試&#xff0c;我也清楚地知…

虛擬現實的鏡廊:當技術成為存在之繭

傍晚&#xff0c;摘下VR頭盔的瞬間&#xff0c;房間里未關的臺燈竟顯得刺眼。指尖劃過光滑的塑料外殼&#xff0c;溫熱的機體還在微微震動&#xff0c;如同某種活物的呼吸。窗外城市的光污染在玻璃上暈染成片&#xff0c;而我的視網膜里仍殘留著方才的極光&#xff1a;挪威峽灣…