pdf 是一種便攜式文檔格式钞钙,由Adobe公司設(shè)計鳄橘。因為不受平臺限制声离,且方便保存和傳輸芒炼,所以pdf非常受歡迎。目前市場上有很多pdf工具术徊,大部分是閱讀類本刽,也有支持對pdf的修改、轉(zhuǎn)換等功能赠涮,但這部分工具不少是收費的子寓。這次介紹一個開源python工具庫-pdfplumber,可以方便地獲取pdf的各種信息笋除,包括文本斜友、表格、圖表垃它、尺寸等鲜屏。pdfplumber在github上有英文官方文檔烹看,后面我們會撿重點講解,先看下如何用pdfplumber提取pdf表格洛史?以NBA 2020-2021 常規(guī)賽數(shù)據(jù)作為范例惯殊,pdf表格如下:
第一步:使用pdfplumber提取表格文本
# 導(dǎo)入pdfplumber
import pdfplumber
# 讀取pdf文件,保存為pdf實例
pdf = pdfplumber.open("E:\\nba.pdf")
# 訪問第二頁
first_page = pdf.pages[1]
# 自動讀取表格信息也殖,返回列表
table = first_page.extract_table()
輸出:
第二步:整理成dataframe格式土思,保存為excel
import pandas as pd
# 將列表轉(zhuǎn)為df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])
# 保存excel
table_df.to_excel('test.xlsx')
table_df
輸出:
一個小小的腳本,不到十行代碼忆嗜,便將pdf表格提取并轉(zhuǎn)化為dataframe格式己儒,最終保存到excel。有個初步認(rèn)知后捆毫,接下來詳細講講pdfplumber的安裝址愿、導(dǎo)入、api接口等信息冻璃。
pdfplumber簡介
前面已經(jīng)介紹過pdfplumber的用途响谓,也用一個小案例展示了如何提取表格,我覺得對于pdfplumber只需要了解三點就可以省艳。1娘纷、它是一個純python第三方庫,適合python 3.x版本2跋炕、它用來查看pdf各類信息赖晶,能有效提取文本、表格3辐烂、它不支持修改或生成pdf遏插,也不支持對pdf掃描件的處理Github地址
https://github.com/jsvine/pdfplumber
pdfplumber安裝和導(dǎo)入
同其他python庫一樣,pdfplumber支持使用pip安裝纠修,在命令行輸入:
pip install pdfplumber
如果遇到安裝慢的問題胳嘲,可以替換鏡像源,會快很多扣草。pdfplumber安裝后了牛,用import導(dǎo)入即可使用:
import pdfplumber
....
pdfplumber簡單使用
pdfplumber中有兩個基礎(chǔ)類,PDF和Page辰妙∮セ觯看字面意思能猜出,前者是處理整個文檔密浑,后者是處理頁面蛙婴。「pdfplumber.PDF類」
屬性
描述
「pdfplumber.Page類」這是pdfplumber的核心功能,對pdf的大部分操作都是基于這個類尔破,包括提取文本街图、表格背传、尺寸等。這里暫不一一列舉它的屬性和方法台夺。通過一個簡單的案例径玖,就可以明白它們的作用。示例pdf文檔颤介,共兩頁:
1. 讀取pdf
# 導(dǎo)入pdfplumber
import pdfplumber
# 讀取pdf文件梳星,返回pdfplumber.PDF類的實例
pdf = pdfplumber.open("e:\\nba2.pdf")
2. 獲取該pdf文檔的信息
# 通過pdfplumber.PDF類的metadata屬性獲取pdf信息
pdf.metadata
輸出:
這些是pdf的基礎(chǔ)信息,包括作者滚朵、來源冤灾、日期等。
3. 總頁數(shù)
# 通過pdfplumber.PDF類的metadata屬性獲取pdf頁數(shù)
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()
# 將列表轉(zhuǎn)為df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])
table_df
pdfplumber提取表格有很多的細節(jié)需要處理,這里給到的范例表格線框比較規(guī)范移宅,所以能很簡單的提取归粉,但對于線框不完全(包含無線框)的表格,其效果就差了不少漏峰。在實際項目所需處理的pdf文檔中糠悼,線框完全及不完全的表格都比較多,為了能夠理解pdfplumber實現(xiàn)表格抽取的原理和方法浅乔,我們需要去細究相關(guān)參數(shù)的設(shè)置倔喂。正如案例所示,pdfplumber.Page對象的.extract_table()
方法可以提取表格靖苇,返回從頁面上最大的表中提取的文本席噩,以列表列表的形式顯示,結(jié)構(gòu)為row -> cell贤壁。「表格抽取參數(shù)設(shè)置」默認(rèn)情況下悼枢,extract_table
使用頁面的垂直和水平線(或矩形邊緣)作為單元格分隔符。該方法可以通過table_settings參數(shù)進行高度自定義芯砸∠糗剑可能的設(shè)置及其默認(rèn)值:
{
"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支持對圖表進行可視化調(diào)試给梅,能輸出圖像假丧,顯示如何提取表。
pdfplumber的獨特之處
python中有很多庫可以處理pdf动羽,比如PyPDF2包帚、pdfminer等,那pdfplumber的優(yōu)勢在哪呢运吓?
首先渴邦,pdfplumber能輕松訪問有關(guān)PDF對象的所有詳細信息疯趟,且用于提取文本和表格的方法高級可定制,使用者可根據(jù)表格的具體形式來調(diào)整參數(shù)谋梭。
最關(guān)鍵的是pdfplumber作者持續(xù)在維護該庫信峻,而同樣受歡迎的PyPDF2已經(jīng)不再維護了。