如何使用 python 提取 PDF 表格及文本椅野,并保存到 Excel?

image.png

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類」
屬性
描述

image.png

「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)不再維護了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓮床,一起剝皮案震驚了整個濱河市盹舞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隘庄,老刑警劉巖踢步,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丑掺,居然都是意外死亡获印,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門街州,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兼丰,“玉大人,你說我怎么就攤上這事唆缴〉胤啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵琐谤,是天一觀的道長蟆技。 經(jīng)常有香客問我,道長斗忌,這世上最難降的妖魔是什么质礼? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮织阳,結(jié)果婚禮上眶蕉,老公的妹妹穿的比我還像新娘。我一直安慰自己唧躲,他們只是感情好造挽,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弄痹,像睡著了一般饭入。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肛真,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天谐丢,我揣著相機與錄音,去河邊找鬼。 笑死乾忱,一個胖子當(dāng)著我的面吹牛讥珍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窄瘟,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼衷佃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹄葱?” 一聲冷哼從身側(cè)響起纲酗,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎新蟆,沒想到半個月后觅赊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡琼稻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年吮螺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帕翻。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸠补,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀掸,到底是詐尸還是另有隱情紫岩,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布睬塌,位于F島的核電站泉蝌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揩晴。R本人自食惡果不足惜勋陪,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硫兰。 院中可真熱鬧诅愚,春花似錦、人聲如沸劫映。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泳赋。三九已至雌桑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摹蘑,已是汗流浹背筹燕。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留衅鹿,地道東北人撒踪。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像大渤,于是被迫代替她去往敵國和親制妄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

推薦閱讀更多精彩內(nèi)容