pdf是一種便攜式文檔格式,由Adobe公司設計。因為不受平台限制,且方便保存和傳輸,所以pdf非常受歡迎。
目前市場上有很多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類」

「pdfplumber.Page類」
這是pdfplumber的核心功能,對pdf的大部分操作都是基於這個類,包括提取文本、表格、尺寸等。
這里暫不一一列舉它的屬性和方法。
通過一個簡單的案例,就可以明白它們的作用。示例pdf文檔,共兩頁:

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

這些是pdf的基礎信息,包括作者、來源、日期等。
3.總頁數
# 通過pdfplumber.PDF類的metadata屬性獲取pdf頁數 len(pdf.pages)
4.讀取第一頁的頁寬、頁高等信息
# 第一頁pdfplumber.Page實例 first_page = pdf.pages[0] # 查看頁碼 print('頁碼:',first_page.page_number) # 查看頁寬 print('頁寬:'first_page.width) # 查看頁高 print('頁高:'first_page.height)
輸出:

5.讀取第一頁的文本
# 讀取文本 text = first_page.extract_text() print(text)
輸出:

6.讀取第二頁的表格
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已經不再維護了。
源碼:https://pan.baidu.com/s/1COX_JUYeNxwvaMe4NFy6AA 提取碼: q3a7