Python解析PDF表格——PDFPlumber vs Camelot

題圖來自Camelot: List o’ 10 Intriguing Mythical Places

為獲取LEED認(rèn)證項(xiàng)目的評(píng)分表明細(xì)喧务,可以從USGBC的項(xiàng)目頁面上爬取眯漩,或者從pdf格式的項(xiàng)目評(píng)分表中解析得到续膳。以重慶某LEED EM:OB v2009 Gold項(xiàng)目為例院尔,USGBC上公布的LEED項(xiàng)目得分表其格式并不統(tǒng)一,利用XPath爬取后需要進(jìn)一步清洗處理影钉。相對(duì)而言季惩,LEED項(xiàng)目所對(duì)應(yīng)的項(xiàng)目評(píng)分表PDF文件的數(shù)據(jù)更為規(guī)范完整录粱。因此考慮嘗試解析出PDF文件中的表格,以便后續(xù)分析画拾。
Python 處理PDF文件的程序包啥繁,pdfminer、tabula碾阁、pdfplumber输虱、camelot……查詢資料表明,似乎普遍認(rèn)為pdfminer的效果不怎么好脂凶,而tabula需要java支持^{[1-3]} 宪睹,想偷懶于是只試了pdfplumber和camelot。
安裝過程不贅述蚕钦,直接來看運(yùn)行結(jié)果亭病。

pdfplumber未能正確識(shí)別出表格

pdfplumber直接識(shí)別表格報(bào)錯(cuò)

如上圖,直接利用pdfplumber的extract_table()默認(rèn)參數(shù)下運(yùn)行報(bào)錯(cuò)嘶居,沒有正確解析出pdf文件中的表格罪帖。利用to_image()和debug_tablefinder()可視化的結(jié)果表明,pdfplumber沒能將表格行列正確解析邮屁。
相比之下整袁,camelot就相對(duì)省心得多。說相對(duì)省心是因?yàn)橛恿撸琧amelot能解析出pdf文件中的表格內(nèi)容坐昙,但必須指定read_pdf()命令中參數(shù)flavor='stream'而不能采用缺省值。如若不然芋忿,運(yùn)行時(shí)報(bào)錯(cuò) RuntimeError: Please make sure that Ghostscript is installed炸客,即便是已正確安裝Ghostscript疾棵,并且設(shè)置好了path路徑仍不可避免。
camelot默認(rèn)參數(shù)可解析出表格
如不指定flavor='stream'痹仙,camelot.read_pdf()報(bào)錯(cuò)
好在盡管camelot運(yùn)行時(shí)有些小波折是尔,但好歹將表格以及解析出來了,如下所示开仰。從這一點(diǎn)上比較拟枚,camelot完勝pdfplumber。
Camelot識(shí)別出了所有表格單元

由于Scorecard.pdf文件中的排版原因众弓,默認(rèn)參數(shù)得到的表格有空白行等情況梨州,不過這些都可以在識(shí)別出的DataFrame表格基礎(chǔ)上簡單后處理來解決。處理后的結(jié)果如下所示田轧。
camelot后處理后的最終結(jié)果

pdfplumber解析表格的替代解決方案

pdfplumber無法直接解析出Scorecard.pdf文件中的表格,但實(shí)際上要解決此問題也并非難事鞍恢。調(diào)整下思路傻粘,可先解析出pdf文件中的文本,讓后通過分列來得到表格帮掉。


pdfplumber嘗試解析文本

利用pdfplumber的extract_text()命令可解析出pdf文件中的文本弦悉,但由于本次需要解析的得分表pdf文件的排版的原因,左右兩個(gè)表格的文本行并未完全對(duì)齊蟆炊,因此如果直接解析完整頁面上的文本的話稽莉,文字會(huì)出錯(cuò)。先用corp()命令指定識(shí)別范圍涩搓,然后再extract_text()污秆,識(shí)別得到的文本列表如下所示。


extract_text()命令得到表格中的文本

先將字符串中'/'前后的空格去除后按空白字符分列昧甘,可以很方便的得到評(píng)分子項(xiàng)良拼、評(píng)價(jià)指標(biāo)描述以及得分分值。
將文本分列并轉(zhuǎn)為DataFrame格式表格

Camelot解析指定范圍內(nèi)的表格

對(duì)于類似本例中Scorecard.pdf表格排版有錯(cuò)位的情況充边,也可以按照表格在頁面中所處的位置庸推,指定表格識(shí)別的范圍。所用到的指令:camelot.plot()可以繪制出頁面的略圖浇冰,table_area參數(shù)可以指定表格識(shí)別的范圍贬媒。


camelot識(shí)別指定區(qū)域的表格

結(jié)論

  • pdfplumber和camelot均能最終得到LEED項(xiàng)目的評(píng)分表pdf文件中的表格,雖然二者實(shí)現(xiàn)方法有所不同肘习,但最終的目標(biāo)都已實(shí)現(xiàn)际乘。
  • 個(gè)人更傾向首選camelot。原因在于pdfplumber在識(shí)別文字時(shí)需事先指定表格對(duì)應(yīng)的頁面位置大致范圍井厌。而LEED認(rèn)證的版本與項(xiàng)目不同蚓庭,評(píng)價(jià)指標(biāo)與分值設(shè)置均不同致讥,意味著評(píng)分表的行數(shù)可能有所區(qū)別。如果后續(xù)想批處理識(shí)別多個(gè)項(xiàng)目的評(píng)分表pdf文件的話器赞,可能會(huì)導(dǎo)致出錯(cuò)垢袱。當(dāng)然也許是本人技術(shù)不到家,沒有去找出pdfplumber可用的參數(shù)設(shè)置港柜,感興趣的可在Github: pdfplumber 獲取更詳細(xì)的資料请契。
    關(guān)于Camelot識(shí)別pdf表格時(shí)遇到諸如多行數(shù)據(jù)自動(dòng)合并瑰钮、上下標(biāo)文字鳖孤、自動(dòng)擴(kuò)大識(shí)別區(qū)域等情況時(shí)的參數(shù)設(shè)置,可參見Camelot識(shí)別pdf表格時(shí)的參數(shù)設(shè)置補(bǔ)充熏版。

又及畔柔,Camelot原來是亞瑟王和圓桌騎士們的宮殿所在地氯夷,和Asgard的Valhalla一樣,也是傳說中的圣域靶擦。搜索camelot程序安裝包時(shí)無意中學(xué)到的腮考,漲知識(shí)了。

參考資料

[1] Python:解析PDF文本及表格——pdfminer玄捕、tabula踩蔚、pdfplumber 的用法及對(duì)比
[2] 用Python提取pdf文件中的表格數(shù)據(jù)
[3] python讀取pdf文件
[4] Github: pdfplumber
[5] Camelot: PDF Table Extraction for Humans
[6] ImageMagick Installation
[7] ImageMagick之PDF轉(zhuǎn)換成圖片(image)
[8] LEED 2009 for Existing Buildings: Operations & Maintenance
[9] Camelot - Wikipedia
[10] List o’ 10 Intriguing Mythical Places
[11] Camelot識(shí)別pdf表格時(shí)的參數(shù)設(shè)置補(bǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枚粘,隨后出現(xiàn)的幾起案子馅闽,更是在濱河造成了極大的恐慌,老刑警劉巖馍迄,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件福也,死亡現(xiàn)場離奇詭異,居然都是意外死亡柬姚,警方通過查閱死者的電腦和手機(jī)拟杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來量承,“玉大人搬设,你說我怎么就攤上這事∷汉矗” “怎么了拿穴?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忧风。 經(jīng)常有香客問我默色,道長,這世上最難降的妖魔是什么狮腿? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任腿宰,我火速辦了婚禮呕诉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吃度。我一直安慰自己甩挫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布椿每。 她就那樣靜靜地躺著伊者,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间护。 梳的紋絲不亂的頭發(fā)上亦渗,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音汁尺,去河邊找鬼法精。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痴突,可吹牛的內(nèi)容都是我干的亿虽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼苞也,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了粘秆?” 一聲冷哼從身側(cè)響起如迟,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攻走,沒想到半個(gè)月后殷勘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昔搂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年玲销,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘符。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贤斜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逛裤,到底是詐尸還是另有隱情瘩绒,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布带族,位于F島的核電站锁荔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝙砌。R本人自食惡果不足惜阳堕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一跋理、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恬总,春花似錦前普、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缀旁,卻和暖如春记劈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背并巍。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工目木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懊渡。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓刽射,卻偏偏與公主長得像,于是被迫代替她去往敵國和親剃执。 傳聞我的和親對(duì)象是個(gè)殘疾皇子誓禁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345