Python PDF解析利器:pdfplumber | AI應用開發

Python PDF解析利器:pdfplumber全面指南

1. 簡介與安裝

1.1 pdfplumber概述

pdfplumber是一個Python庫,專門用于從PDF文件中提取文本、表格和其他信息。相比其他PDF處理庫,pdfplumber提供了更直觀的API和更精確的文本定位能力。

主要特點

  • 精確提取文本(包括位置、字體等信息)
  • 高效提取表格數據
  • 支持頁面級和文檔級的操作
  • 可視化調試功能

1.2 安裝方法

pip install pdfplumber

1.3 基礎使用示例

import pdfplumberwith pdfplumber.open("example.pdf") as pdf:first_page = pdf.pages[0]print(first_page.extract_text())

代碼解釋

  • pdfplumber.open()打開PDF文件
  • pdf.pages獲取所有頁面的列表
  • extract_text()提取頁面文本內容

2. 文本提取功能

2.1 基本文本提取

with pdfplumber.open("report.pdf") as pdf:for page in pdf.pages:print(page.extract_text())

應用場景:合同文本分析、報告內容提取等

2.2 帶格式的文本提取

with pdfplumber.open("formatted.pdf") as pdf:page = pdf.pages[0]words = page.extract_words()for word in words:print(f"文本: {word['text']}, 位置: {word['x0'], word['top']}, 字體: {word['fontname']}")

輸出示例

文本: 標題, 位置: (72.0, 84.0), 字體: Helvetica-Bold
文本: 內容, 位置: (72.0, 96.0), 字體: Helvetica

2.3 按區域提取文本

with pdfplumber.open("document.pdf") as pdf:page = pdf.pages[0]# 定義區域(x0, top, x1, bottom)area = (50, 100, 400, 300)  cropped = page.crop(area)print(cropped.extract_text())

應用場景:提取發票中的特定信息、掃描件中的關鍵數據等

3. 表格提取功能

3.1 簡單表格提取

with pdfplumber.open("data.pdf") as pdf:page = pdf.pages[0]table = page.extract_table()for row in table:print(row)

輸出示例

['姓名', '年齡', '職業']
['張三', '28', '工程師']
['李四', '32', '設計師']

3.2 復雜表格處理

with pdfplumber.open("complex_table.pdf") as pdf:page = pdf.pages[0]# 自定義表格設置table_settings = {"vertical_strategy": "text", "horizontal_strategy": "text","intersection_y_tolerance": 10}table = page.extract_table(table_settings)

參數說明

  • vertical_strategy:垂直分割策略
  • horizontal_strategy:水平分割策略
  • intersection_y_tolerance:行合并容差

3.3 多頁表格處理

with pdfplumber.open("multi_page_table.pdf") as pdf:full_table = []for page in pdf.pages:table = page.extract_table()if table:# 跳過表頭(假設第一頁已經有表頭)if page.page_number > 1:table = table[1:]full_table.extend(table)for row in full_table:print(row)

應用場景:財務報表分析、數據報表匯總等

4. 高級功能

4.1 可視化調試

with pdfplumber.open("debug.pdf") as pdf:page = pdf.pages[0]im = page.to_image()im.debug_tablefinder().show()

功能說明

  • to_image()將頁面轉為圖像
  • debug_tablefinder()高亮顯示檢測到的表格
  • show()顯示圖像(需要安裝Pillow)

4.2 提取圖形元素

with pdfplumber.open("drawing.pdf") as pdf:page = pdf.pages[0]lines = page.linescurves = page.curvesrects = page.rectsprint(f"找到 {len(lines)} 條直線")print(f"找到 {len(curves)} 條曲線")print(f"找到 {len(rects)} 個矩形")

應用場景:工程圖紙分析、設計文檔處理等

4.3 自定義提取策略

def custom_extract_method(page):# 獲取所有字符對象chars = page.chars# 按y坐標分組(行)lines = {}for char in chars:line_key = round(char["top"])if line_key not in lines:lines[line_key] = []lines[line_key].append(char)# 按x坐標排序并拼接文本result = []for y in sorted(lines.keys()):line_chars = sorted(lines[y], key=lambda c: c["x0"])line_text = "".join([c["text"] for c in line_chars])result.append(line_text)return "\n".join(result)with pdfplumber.open("custom.pdf") as pdf:page = pdf.pages[0]print(custom_extract_method(page))

應用場景:處理特殊格式的PDF文檔

5. 性能優化技巧

5.1 按需加載頁面

with pdfplumber.open("large.pdf") as pdf:# 只處理前5頁for page in pdf.pages[:5]:process(page.extract_text())

5.2 并行處理

from concurrent.futures import ThreadPoolExecutordef process_page(page):return page.extract_text()with pdfplumber.open("big_file.pdf") as pdf:with ThreadPoolExecutor(max_workers=4) as executor:results = list(executor.map(process_page, pdf.pages))

5.3 緩存處理結果

import pickledef extract_and_cache(pdf_path, cache_path):try:with open(cache_path, "rb") as f:return pickle.load(f)except FileNotFoundError:with pdfplumber.open(pdf_path) as pdf:data = [page.extract_text() for page in pdf.pages]with open(cache_path, "wb") as f:pickle.dump(data, f)return datatext_data = extract_and_cache("report.pdf", "report_cache.pkl")

6. 實際應用案例

6.1 發票信息提取系統

def extract_invoice_info(pdf_path):invoice_data = {"invoice_no": None,"date": None,"total": None}with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text = page.extract_text()lines = text.split("\n")for line in lines:if "發票號碼" in line:invoice_data["invoice_no"] = line.split(":")[1].strip()elif "日期" in line:invoice_data["date"] = line.split(":")[1].strip()elif "合計" in line:invoice_data["total"] = line.split()[-1]return invoice_data

6.2 學術論文分析

def analyze_paper(pdf_path):sections = {"abstract": "","introduction": "","conclusion": ""}with pdfplumber.open(pdf_path) as pdf:current_section = Nonefor page in pdf.pages:text = page.extract_text()for line in text.split("\n"):line = line.strip()if line.lower() == "abstract":current_section = "abstract"elif line.lower().startswith("1. introduction"):current_section = "introduction"elif line.lower().startswith("conclusion"):current_section = "conclusion"elif current_section:sections[current_section] += line + "\n"return sections

6.3 財務報表轉換

import csvdef convert_pdf_to_csv(pdf_path, csv_path):with pdfplumber.open(pdf_path) as pdf:with open(csv_path, "w", newline="") as f:writer = csv.writer(f)for page in pdf.pages:table = page.extract_table()if table:writer.writerows(table)

7. 常見問題與解決方案

7.1 中文亂碼問題

with pdfplumber.open("chinese.pdf") as pdf:page = pdf.pages[0]# 確保系統安裝了中文字體text = page.extract_text()print(text.encode("utf-8").decode("utf-8"))

解決方案

  1. 確保系統安裝了正確的字體
  2. 檢查Python環境編碼設置
  3. 使用支持中文的PDF解析器參數

7.2 表格識別不準確

table_settings = {"vertical_strategy": "lines","horizontal_strategy": "lines","explicit_vertical_lines": page.lines,"explicit_horizontal_lines": page.lines,"intersection_x_tolerance": 15,"intersection_y_tolerance": 15
}
table = page.extract_table(table_settings)

調整策略

  1. 嘗試不同的分割策略
  2. 調整容差參數
  3. 使用可視化調試工具

7.3 大文件處理內存不足

# 逐頁處理并立即釋放內存
with pdfplumber.open("huge.pdf") as pdf:for i, page in enumerate(pdf.pages):process(page.extract_text())# 手動釋放頁面資源pdf.release_resources()if i % 10 == 0:print(f"已處理 {i+1} 頁")

8. 總結與最佳實踐

8.1 pdfplumber核心優勢

  1. 精確的文本定位:保留文本在頁面中的位置信息
  2. 強大的表格提取:處理復雜表格結構能力突出
  3. 豐富的元數據:提供字體、大小等格式信息
  4. 可視化調試:直觀驗證解析結果
  5. 靈活的API:支持自定義提取邏輯

8.2 適用場景推薦

  1. 優先選擇pdfplumber

    • 需要精確文本位置信息的應用
    • 復雜PDF表格數據提取
    • 需要分析PDF格式和排版的場景
  2. 考慮其他方案

    • 僅需簡單文本提取(可考慮PyPDF2)
    • 需要編輯PDF(考慮PyMuPDF)
    • 超大PDF文件處理(考慮分頁處理)

8.3 最佳實踐建議

  1. 預處理PDF文件

    # 使用Ghostscript優化PDF
    import subprocess
    subprocess.run(["gs", "-sDEVICE=pdfwrite", "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sOutputFile=optimized.pdf", "original.pdf"])
    
  2. 組合使用多種工具

    # 結合PyMuPDF獲取更精確的文本位置
    import fitz
    doc = fitz.open("combined.pdf")
    
  3. 建立錯誤處理機制

    def safe_extract(pdf_path):try:with pdfplumber.open(pdf_path) as pdf:return pdf.pages[0].extract_text()except Exception as e:print(f"處理{pdf_path}時出錯: {str(e)}")return None
    
  4. 性能監控

    import time
    start = time.time()
    # pdf處理操作
    print(f"處理耗時: {time.time()-start:.2f}秒")
    

pdfplumber是Python生態中最強大的PDF解析庫之一,特別適合需要精確提取文本和表格數據的應用場景。通過合理使用其豐富的功能和靈活的API,可以解決大多數PDF處理需求。對于特殊需求,結合其他PDF處理工具和自定義邏輯,能夠構建出高效可靠的PDF處理流程。

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

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

相關文章

niuhe 插件教程 - 配置 MCP讓AI更聰明

niuhe 插件官方教程已經上線, 請訪問: http://niuhe.zuxing.net niuhe 連接 MCP 介紹 API 文檔的未來:MCP,讓協作像聊天一樣簡單. MCP 是 Model Context Protocol(模型上下文協議)的縮寫,是 2024 年 11 月 Claude 的公司 Anthropic 推出并開…

26考研——排序_插入排序(8)

408答疑 文章目錄 二、插入排序基本概念插入排序方法直接插入排序算法描述示例性能分析 折半插入排序改進點算法步驟性能分析 希爾排序相關概念示例分析希爾排序的效率效率分析空間復雜度時間復雜度 九、參考資料鮑魚科技課件26王道考研書 二、插入排序 基本概念 定義&#x…

精華貼分享|從不同的交易理論來理解頭肩形態,殊途同歸

本文來源于量化小論壇策略分享會板塊精華帖,作者為孫小迪,發布于2025年2月17日。 以下為精華帖正文: 01 前言 學習了一段時間交易后,我發現在幾百年的歷史中,不同門派的交易理論對同一種市場特征的稱呼不一樣&#x…

leetcode437.路徑總和|||

對于根結點來說,可以選擇當前結點為路徑也可以不選擇,但是一旦選擇當前結點為路徑那么后續都必須要選擇結點作為路徑,不然路徑不連續是不合法的,所以這里分開出來兩個方法進行遞歸 由于力扣最后一個用例解答錯誤,分析…

北斗導航 | 改進奇偶矢量法的接收機自主完好性監測算法原理,公式,應用,RAIM算法研究綜述,matlab代碼

改進奇偶矢量法的接收機自主完好性監測算法研究 摘要 接收機自主完好性監測(RAIM)是保障全球導航衛星系統(GNSS)安全性的核心技術。針對傳統奇偶矢量法在噪聲敏感性、多故障隔離能力上的缺陷,本文提出一種基于加權奇偶空間與動態閾值的改進算法。通過引入觀測值權重矩陣重…

深度神經網絡全解析:原理、結構與方法對比

深度神經網絡全解析:原理、結構與方法對比 1. 引言 隨著人工智能的發展,深度神經網絡(Deep Neural Network,DNN)已經成為圖像識別、自然語言處理、語音識別、自動駕駛等領域的核心技術。相比傳統機器學習方法&#x…

經典論文解讀系列:MapReduce 論文精讀總結:簡化大規模集群上的數據處理

🧠 MapReduce 論文解讀總結:簡化大規模集群上的數據處理 原文標題:MapReduce: Simplified Data Processing on Large Clusters 作者:Jeffrey Dean & Sanjay Ghemawat 發表時間:2004 年 發表機構:Google…

通過Appium理解MCP架構

MCP即Model Context Protocol(模型上下文協議),是由Anthropic公司于2024年11月26日推出的開放標準框架,旨在為大型語言模型與外部數據源、工具及系統建立標準化交互協議,以打破AI與數據之間的連接壁壘。 MCP架構與Appi…

網頁版五子棋項目的問題處理

文章目錄 config.WebSocketConfig將鍵值對加?OnlineUserManager中線程安全、鎖ObjectMapper來處理json針對多開情況的判定處理連接關閉、異常(玩家中途退出)后的不合理操作游戲大廳數據更新 config.WebSocketConfig 把MatchAPI注冊進去 ? 在addHandle…

【初探數據結構】歸并排序與計數排序的序曲

💬 歡迎討論:在閱讀過程中有任何疑問,歡迎在評論區留言,我們一起交流學習! 👍 點贊、收藏與分享:如果你覺得這篇文章對你有幫助,記得點贊、收藏,并分享給更多對數據結構感…

算法刷題記錄——LeetCode篇(8.7) [第761~770題](持續更新)

更新時間:2025-03-30 算法題解目錄匯總:算法刷題記錄——題解目錄匯總技術博客總目錄:計算機技術系列博客——目錄頁 優先整理熱門100及面試150,不定期持續更新,歡迎關注! 763. 劃分字母區間 給你一個字…

Pod 網絡與 CNI 的作用

在 Kubernetes 中,Pod 網絡 是實現容器間通信的核心機制,每個 Pod 擁有獨立的 IP 地址,可直接跨節點通信。CNI(Container Network Interface) 是 Kubernetes 的網絡插件標準,負責為 Pod 分配 IP、配置網絡規…

使用keepalived結合tomcat和nginx搭建三主熱備架構

角色主機名軟件IP地址用戶client172.25.250.90keepalivedVIP172.25.250.100keepalivedVIP172.25.250.101keepalivedVIP172.25.250.102masterserverAkeepalived, nginx172.25.250.30backupserverBkeepalived, nginx172.25.250.31backupserverCkeepalived, nginx172.25.250.32web…

STRUCTBERT:將語言結構融入預訓練以提升深度語言理解

【摘要】最近,預訓練語言模型BERT(及其經過穩健優化的版本RoBERTa)在自然語言理解(NLU)領域引起了廣泛關注,并在情感分類、自然語言推理、語義文本相似度和問答等各種NLU任務中達到了最先進的準確率。受到E…

leetcode_977. 有序數組的平方_java

977. 有序數組的平方https://leetcode.cn/problems/squares-of-a-sorted-array/ 1.題目 給你一個按 非遞減順序 排序的整數數組 nums,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。 示例 1: 輸入:nums [-4,-1…

Nginx—nginx.conf 配置結構詳解

一、nginx.conf 配置結構 函數 說明 main 全局配置 event 配置工作模式以及連接數 http http模塊相關配置 server 虛擬主機配置,可以有多個 location 路由規則,表達式 upstream 集群、內網服務器(負載均衡也在這里邊配&#xff…

斐波那契數列----C語言

關于斐波那契 已知: 問題背景:一對兔子從第3個月開始每月生一對新兔子,新兔子同樣在第3個月開始繁殖。 關鍵觀察: 第1個月:1對(初始兔子)。 第2個月:1對(未成熟&#…

vulhub靶場—— Tomcat8

目錄 一、漏洞描述 二、靶場搭建 三、漏洞復現 1、弱密碼 2、文件上傳 一、漏洞描述 環境描述: Tomcat 支持后臺部署 war 文件,可以直接將 webshell 部署到 web 目錄下。tomcat 默認的管理頁面 manager 使用 basic 認證用戶名和密碼登錄&#xff0…

使用 Spring AI Aliabab Module RAG 構建 Web Search 應用

使用 Spring AI Alibaba 構建大模型聯網搜索應用 Spring AI 實現了模塊化 RAG 架構,架構的靈感來自于論文“模塊化 RAG:將 RAG 系統轉變為類似樂高的可重構框架”中詳述的模塊化概念。 Spring AI 模塊化 RAG 體系 總體上分為以下幾個步驟: …

一些練習 C 語言的小游戲

一些練習 C 語言的小游戲 — 1. 猜數字游戲 描述:程序隨機生成一個數字,玩家需要猜測這個數字,并根據提示(太高或太低)調整猜測,直到猜中為止。 功能點: 隨機數生成 (rand() 函數)。循環和…