Python解析PDF表格——PDFPlumber vs Camelot

题图来自Camelot: List o’ 10 Intriguing Mythical Places

为获取LEED认证项目的评分表明细,可以从USGBC的项目页面上爬取,或者从pdf格式的项目评分表中解析得到。以重庆某LEED EM:OB v2009 Gold项目为例,USGBC上公布的LEED项目得分表其格式并不统一,利用XPath爬取后需要进一步清洗处理。相对而言,LEED项目所对应的项目评分表PDF文件的数据更为规范完整。因此考虑尝试解析出PDF文件中的表格,以便后续分析。
Python 处理PDF文件的程序包,pdfminer、tabula、pdfplumber、camelot……查询资料表明,似乎普遍认为pdfminer的效果不怎么好,而tabula需要java支持^{[1-3]} ,想偷懒于是只试了pdfplumber和camelot。
安装过程不赘述,直接来看运行结果。

pdfplumber未能正确识别出表格

pdfplumber直接识别表格报错

如上图,直接利用pdfplumber的extract_table()默认参数下运行报错,没有正确解析出pdf文件中的表格。利用to_image()和debug_tablefinder()可视化的结果表明,pdfplumber没能将表格行列正确解析。
相比之下,camelot就相对省心得多。说相对省心是因为,camelot能解析出pdf文件中的表格内容,但必须指定read_pdf()命令中参数flavor='stream'而不能采用缺省值。如若不然,运行时报错 RuntimeError: Please make sure that Ghostscript is installed,即便是已正确安装Ghostscript,并且设置好了path路径仍不可避免。
camelot默认参数可解析出表格
如不指定flavor='stream',camelot.read_pdf()报错
好在尽管camelot运行时有些小波折,但好歹将表格以及解析出来了,如下所示。从这一点上比较,camelot完胜pdfplumber。
Camelot识别出了所有表格单元

由于Scorecard.pdf文件中的排版原因,默认参数得到的表格有空白行等情况,不过这些都可以在识别出的DataFrame表格基础上简单后处理来解决。处理后的结果如下所示。
camelot后处理后的最终结果

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

pdfplumber无法直接解析出Scorecard.pdf文件中的表格,但实际上要解决此问题也并非难事。调整下思路,可先解析出pdf文件中的文本,让后通过分列来得到表格。


pdfplumber尝试解析文本

利用pdfplumber的extract_text()命令可解析出pdf文件中的文本,但由于本次需要解析的得分表pdf文件的排版的原因,左右两个表格的文本行并未完全对齐,因此如果直接解析完整页面上的文本的话,文字会出错。先用corp()命令指定识别范围,然后再extract_text(),识别得到的文本列表如下所示。


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

先将字符串中'/'前后的空格去除后按空白字符分列,可以很方便的得到评分子项、评价指标描述以及得分分值。
将文本分列并转为DataFrame格式表格

Camelot解析指定范围内的表格

对于类似本例中Scorecard.pdf表格排版有错位的情况,也可以按照表格在页面中所处的位置,指定表格识别的范围。所用到的指令:camelot.plot()可以绘制出页面的略图,table_area参数可以指定表格识别的范围。


camelot识别指定区域的表格

结论

  • pdfplumber和camelot均能最终得到LEED项目的评分表pdf文件中的表格,虽然二者实现方法有所不同,但最终的目标都已实现。
  • 个人更倾向首选camelot。原因在于pdfplumber在识别文字时需事先指定表格对应的页面位置大致范围。而LEED认证的版本与项目不同,评价指标与分值设置均不同,意味着评分表的行数可能有所区别。如果后续想批处理识别多个项目的评分表pdf文件的话,可能会导致出错。当然也许是本人技术不到家,没有去找出pdfplumber可用的参数设置,感兴趣的可在Github: pdfplumber 获取更详细的资料。
    关于Camelot识别pdf表格时遇到诸如多行数据自动合并、上下标文字、自动扩大识别区域等情况时的参数设置,可参见Camelot识别pdf表格时的参数设置补充

又及,Camelot原来是亚瑟王和圆桌骑士们的宫殿所在地,和Asgard的Valhalla一样,也是传说中的圣域。搜索camelot程序安装包时无意中学到的,涨知识了。

参考资料

[1] Python:解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比
[2] 用Python提取pdf文件中的表格数据
[3] python读取pdf文件
[4] Github: pdfplumber
[5] Camelot: PDF Table Extraction for Humans
[6] ImageMagick Installation
[7] ImageMagick之PDF转换成图片(image)
[8] LEED 2009 for Existing Buildings: Operations & Maintenance
[9] Camelot - Wikipedia
[10] List o’ 10 Intriguing Mythical Places
[11] Camelot识别pdf表格时的参数设置补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270