📌 pdfplumber
解析 PDF 表格的原理
pdfplumber
處理表格的原理是基于幾何分析(geometric analysis),它通過分析 PDF 頁面中的線條、單元格間距和文本分布,提取表格數據。它主要利用 垂直線(vertical lines)、水平線(horizontal lines)、字符間距(whitespace) 來定位表格結構。
1. pdfplumber
處理表格的主要步驟
pdfplumber
解析表格的流程如下:
1?? 解析 PDF 頁面
- 讀取 PDF 并將其轉換為對象
- 提取 PDF 內部的文字、線條、圖片等元素
2?? 檢測表格的行列
- 通過 文本對齊、線條檢測 確定行(rows)和列(columns)
- 通過字符間距(whitespace)識別列間分隔
- 通過水平線(horizontal lines)和垂直線(vertical lines) 定位表格
3?? 提取表格數據
- 逐行讀取表格中的數據
- 解析文本,去除噪聲
- 按行/列組織數據,并返回結構化格式(list of lists)
2. pdfplumber
的表格解析方法
pdfplumber
提供了多種策略來解析 PDF 表格:
🔹 方法 1:默認 extract_tables()
(自動解析)
默認情況下,pdfplumber
采用 基于空白間距 的方式自動解析表格:
import pdfplumberwith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0] # 選擇第一頁tables = page.extract_tables() # 提取表格for table in tables:for row in table:print(row) # 逐行打印表格內容
📌 解析
- 適用于 表格線較為清晰 的 PDF。
extract_tables()
自動檢測表格行列,返回list of lists
結構。
🔹 方法 2:基于 “線條檢測” 解析表格
對于 含有網格線(gridlines) 的表格,可以使用 extract_table()
指定 基于線條 解析:
with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]table = page.extract_table({"vertical_strategy": "lines", # 按垂直線識別列"horizontal_strategy": "lines", # 按水平線識別行})print(table)
📌 解析
- 適用于清晰的表格(有垂直和水平分隔線)。
- 不會受文本對齊方式影響。
🔹 方法 3:基于 “字符間距” 解析表格
對于 無明顯表格線(如 Excel 轉換的 PDF),可以使用 text-based
方法:
with pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]table = page.extract_table({"vertical_strategy": "text", # 按字符間距識別列"horizontal_strategy": "text", # 按行間距識別行})print(table)
📌 解析
- 適用于無表格線的表格(如文本表格)。
- 依賴文本間的空白間隔來檢測列分隔。
🔹 方法 4:混合策略(線條 + 文字)
如果 PDF 部分表格有線條,部分表格僅靠對齊,可以使用混合策略:
table = page.extract_table({"vertical_strategy": "lines_strict", # 先查找垂直線,無法識別時再看文本對齊"horizontal_strategy": "lines_strict","explicit_vertical_lines": [], # 手動指定垂直線"explicit_horizontal_lines": [], # 手動指定水平線
})
📌 解析
- 結合線條和文本排布,適用于復雜表格。
3. pdfplumber
表格解析的原理
📍 3.1 主要的表格檢測策略
pdfplumber
采用以下三種核心策略來解析表格:
策略 | 描述 | 適用情況 |
---|---|---|
lines(線條) | 通過垂直線、水平線 檢測行列 | 網格表格(有清晰的邊框線) |
text(字符間距) | 通過文本間距 識別列 | 無表格線的文本表格 |
explicit(手動指定) | 人工提供表格邊界坐標 | 復雜表格,自動策略失效時 |
📍 3.2 pdfplumber
具體的表格解析步驟
- 檢測 PDF 頁面中的所有對象
- 解析 PDF 頁面中的文本、線條、圖片、填充元素。
- 識別表格結構
- 通過線條或字符間距 確定表格的行列。
- 提取表格內容
- 讀取單元格內容,并組織成
list of lists
結構。
- 讀取單元格內容,并組織成
- 返回結構化數據
- 以 二維列表 (
list[list[str]]
) 形式返回結果。
- 以 二維列表 (
4. pdfplumber
解析表格的優勢
? 適配多種表格類型
- 既支持 網格表格,也支持文本對齊表格。
? 支持精確行列定位
- 能提取行列坐標、單元格邊界。
? 兼容復雜 PDF
- 可解析 旋轉的表格、合并單元格、跨頁表格。
? 可結合 NLP 進一步清理數據
- 提取表格后,可用
pandas
進行清理:import pandas as pd df = pd.DataFrame(table) df.dropna(inplace=True) # 清除空白行
5. pdfplumber
表格解析的局限性
? 無法完美解析所有表格
- 合并單元格、復雜嵌套表格 可能無法正確拆分。
? 需要手動調整參數
- 對不同的 PDF 可能需要調整
vertical_strategy
、horizontal_strategy
。
? 跨頁表格處理較難
pdfplumber
只能按頁解析,對于分散在多頁的表格 需要手動拼接。
6. 總結
📌 pdfplumber
處理 PDF 表格的原理:
- 采用 幾何分析(基于線條檢測或字符間距)。
- 可自動解析 行、列,并返回 結構化數據。
- 適用于 財務報表、合同、科學文獻等表格數據提取。
📌 核心策略
- 基于線條(適用于網格表格)
- 基于文本間距(適用于文本表格)
- 混合模式(適用于復雜表格)
📌 適用場景
? 財務報表 🏦
? 論文數據 📊
? 合同、發票 📄
? 表單解析 📝
🚀 如果你的 PDF 里包含表格數據,pdfplumber
是一個強大的工具! 🎯