如何使用 python 提取 pdf 表格及文本,並保存到 excel

pdf 是一種便攜式文檔格式,由 Adobe 公司設計。因爲不受平臺限制,且方便保存和傳輸,所以 pdf 非常受歡迎。

目前市場上有很多 pdf 工具,大部分是閱讀類,也有支持對 pdf 的修改、轉換等功能,但這部分工具不少是收費的。

這次介紹一個開源 python 工具庫 - pdfplumber,可以方便地獲取 pdf 的各種信息,包括文本、表格、圖表、尺寸等。

pdfplumber 在 github 上有英文官方文檔,後面我們會撿重點講解,先看下如何用 pdfplumber 提取 pdf 表格?

以 NBA 2020-2021 常規賽數據作爲範例,pdf 表格如下:

第一步:使用 pdfplumber 提取表格文本

# 導入pdfplumber
import pdfplumber

# 讀取pdf文件,保存爲pdf實例
pdf =  pdfplumber.open("E:\\nba.pdf") 

# 訪問第二頁
first_page = pdf.pages[1]

# 自動讀取表格信息,返回列表
table = first_page.extract_table()

table

輸出:

第二步:整理成 dataframe 格式,保存爲 excel

import pandas as pd

# 將列表轉爲df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

# 保存excel
table_df.to_excel('test.xlsx')

table_df

輸出:

一個小小的腳本,不到十行代碼,便將 pdf 表格提取並轉化爲 dataframe 格式,最終保存到 excel。

有個初步認知後,接下來詳細講講 pdfplumber 的安裝、導入、api 接口等信息。

pdfplumber 簡介

前面已經介紹過 pdfplumber 的用途,也用一個小案例展示瞭如何提取表格,我覺得對於 pdfplumber 只需要瞭解三點就可以。

1、它是一個純 python 第三方庫,適合 python 3.x 版本

2、它用來查看 pdf 各類信息,能有效提取文本、表格

3、它不支持修改或生成 pdf,也不支持對 pdf 掃描件的處理

Github 地址 https://github.com/jsvine/pdfplumber

pdfplumber 安裝和導入

同其他 python 庫一樣,pdfplumber 支持使用 pip 安裝,在命令行輸入:

pip install pdfplumber

如果遇到安裝慢的問題,可以替換鏡像源,會快很多。

pdfplumber 安裝後,用 import 導入即可使用:

import pdfplumber
....

pdfplumber 簡單使用

pdfplumber 中有兩個基礎類,PDF 和 Page。看字面意思能猜出,前者是處理整個文檔,後者是處理頁面。

「pdfplumber.PDF 類」

i8AwzU

「pdfplumber.Page 類」

這是 pdfplumber 的核心功能,對 pdf 的大部分操作都是基於這個類,包括提取文本、表格、尺寸等。

這裏暫不一一列舉它的屬性和方法。

通過一個簡單的案例,就可以明白它們的作用。示例 pdf 文檔,共兩頁:

  1. 讀取 pdf
# 導入pdfplumber
import pdfplumber

# 讀取pdf文件,返回pdfplumber.PDF類的實例
pdf = pdfplumber.open("e:\\nba2.pdf")
  1. 獲取該 pdf 文檔的信息
# 通過pdfplumber.PDF類的metadata屬性獲取pdf信息
pdf.metadata

輸出:

這些是 pdf 的基礎信息,包括作者、來源、日期等。

  1. 總頁數
# 通過pdfplumber.PDF類的metadata屬性獲取pdf頁數
len(pdf.pages)
  1. 讀取第一頁的頁寬、頁高等信息
# 第一頁pdfplumber.Page實例
first_page = pdf.pages[0]

# 查看頁碼
print('頁碼:',first_page.page_number)

# 查看頁寬
print('頁寬:'first_page.width)

# 查看頁高
print('頁高:'first_page.height)

輸出:

  1. 讀取第一頁的文本
# 讀取文本
text = first_page.extract_text()
print(text)

輸出:

  1. 讀取第二頁的表格
import pandas as pd

# 第二頁pdfplumber.Page實例
first_page = pdf.pages[1]

# 自動讀取表格信息,返回列表
table = first_page.extract_tables()

# 將列表轉爲df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

table_df

pdfplumber 提取表格有很多的細節需要處理,這裏給到的範例表格線框比較規範,所以能很簡單的提取,但對於線框不完全(包含無線框)的表格,其效果就差了不少。

在實際項目所需處理的 pdf 文檔中,線框完全及不完全的表格都比較多,爲了能夠理解 pdfplumber 實現表格抽取的原理和方法,我們需要去細究相關參數的設置。

正如案例所示,pdfplumber.Page 對象的.extract_table()方法可以提取表格,返回從頁面上最大的表中提取的文本,以列表列表的形式顯示,結構爲 row -> cell。

「表格抽取參數設置」

默認情況下,extract_table使用頁面的垂直和水平線(或矩形邊緣)作爲單元格分隔符。該方法可以通過 table_settings 參數進行高度自定義。可能的設置及其默認值:

{
    "vertical_strategy""lines", 
    "horizontal_strategy""lines",
    "explicit_vertical_lines"[],
    "explicit_horizontal_lines"[],
    "snap_tolerance": 3,
    "join_tolerance": 3,
    "edge_min_length": 3,
    "min_words_vertical": 3,
    "min_words_horizontal": 1,
    "keep_blank_chars": False,
    "text_tolerance": 3,
    "text_x_tolerance": None,
    "text_y_tolerance": None,
    "intersection_tolerance": 3,
    "intersection_x_tolerance": None,
    "intersection_y_tolerance": None,
}

pdfplumber 支持對圖表進行可視化調試,能輸出圖像,顯示如何提取表。

pdfplumber 的獨特之處

python 中有很多庫可以處理 pdf,比如 PyPDF2、pdfminer 等,那 pdfplumber 的優勢在哪呢?

首先,pdfplumber 能輕鬆訪問有關 PDF 對象的所有詳細信息,且用於提取文本和表格的方法高級可定製,使用者可根據表格的具體形式來調整參數。

最關鍵的是 pdfplumber 作者持續在維護該庫,而同樣受歡迎的 PyPDF2 已經不再維護了。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/T7BlWqzQselDUd86aKJ8DA