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支持 ,想偷懒于是只试了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表格时的参数设置补充

你可能感兴趣的:(Python解析PDF表格——PDFPlumber vs Camelot)