美文网首页初学者
Python解析PDF表格——PDFPlumber vs Cam

Python解析PDF表格——PDFPlumber vs Cam

作者: askka | 来源:发表于2019-07-20 21:08 被阅读22次

    题图来自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原来是亚瑟王和圆桌骑士们的宫殿所在地,和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

    相关文章

      网友评论

        本文标题:Python解析PDF表格——PDFPlumber vs Cam

        本文链接:https://www.haomeiwen.com/subject/meldlctx.html