首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

三大神器助力Python提取pdf文档信息

今年最后一篇技术文章来袭了。。。

今天这篇文章是今年最后一篇文章了,因此也是一篇非常有用的技术文章,你可以现在只了解一下并进行收藏,等你需要用到的时候再拿出来看一看,这样就好了。

这个是我上个月接的一个私活,帮一个人读取PDF里面的信息,特别是含有很多表格的PDF。以前我进行文章识别的时候都是使用OCR。现在这个用不了,因为里面的表格数据太多了,而且每个表格的样式又是不一样,所以真正做到完全识别是需要花费很多时间,而且光一篇文章是讲不完的,因此我这里也只是挑重要的介绍,能识别大部分的表格,并以JSON格式将识别结果进行返回。

在识别过程中,我使用了很多第三库,但是由于本文篇幅限制,我就简单介绍pdfminer和pdfplumber,着重介绍camelot。通过介绍你可以有目的性的选择自己需要的库。注意我使用的Python版本为3.6。

首先介绍pdfminer。pdfminer是一个从PDF文档中提取信息的工具。与其他pdf相关的工具不同,它完全专注于获取和分析文本数据。PDFMiner允许获取页面中文本的确切位置,以及其他信息,比如字体或行。它包括一 个PDF转换器,可以将PDF文件转换成其他文本格式(如HTML)。 它有一个可扩展的PDF解析器,可以用于其他目的而不是文本分析。所以说它的功能还是非常强大的。官方文档:

由于pdfminer存在python2和python3的版本,而我们需要的是python3的版本,因此相应的安装命令为:

在使用过程中,可能需要安装其他的依赖包,这个可以使用Alt+Enter组合键进行导入安装。下面将演示如何使用它。首先我们需要识别这张图片上的所有文字,并以原来所在的行进行返回:

相关的代码如下:

运行结果如下:

总的来说识别程度还是不错的,排版也可以接受,但是对于下面这张图就无法进行合适的排版并进行输出了:

我们仅仅修改文件名称,那么输出的结果将会是这样:

我重写了代码,发现对英文格式可以进行精确输出,但是中文依旧还是和上面的结果一样,所以就没有贴代码了。因为中文的格式和英文的差很多,很难做到百分百的精确输出。所以你们如果有好的方法点击阅读原文,留言和我交流啊。

前面是针对本地的pdf,那么有小伙伴们就要问了,如果是线上的pdf呢?我们应该怎么办?别急这里就教你如何解决。

首先我们将本地的pdf使用浏览器进行打开,这样就模拟了线上的文件。然后就是书写代码了,其实这个代码和之前的几乎完全一样,就是path发生了变化,因此我们需要传入URL。(注意一下URL里面最好不要含有中文,因为URL是byte类型不是String类型)

相应的代码如下:

怎么样,是不是代码几乎一样,运行结果和前面的也是完全一样,因此就不贴代码了。

现在我们试试这个文档,这个文档是我做的,里面非常复杂,数字,字母,中文,符号,空格,就连单元格也有合并的。

使用之前的代码能读出来,结果就是这样:

依旧还是以空格和行数表示实际的行,但是能做到这样已经不错了。这个同样是支持多页扫描的,这里我就不介绍了,你们有需要的可以参看官方文档。

pdfplumber介绍

前面介绍了pdfminer,下面我们来介绍另外一个神器pdfplumber。看到名字你就知道它支持多页扫描的,实际上我们今天介绍的三个神器都支持多页扫描,但是就是精度上有些差别而已。这个神器的官方地址在这里:

它相应的安装命令为:

这个库非常适合含有表格的pdf文档的提取,为了更好的进行测试,你可以点击这里下载该文件,或者该网站的其他pdf文档。

由于这个pdf很长,大概有85页,因此这里就只提取出一页进行测试:

运行结果:

[[,"门类名称及代码"],[1,"行业大类代码"],[2,"行业大类名称"],[3,"上市公司代码"],[4,"上市公司简称"]]

[[,"农、林、牧、渔业(A)"],[1,"01"],[2,"农业"],[3,"000998"],[4,"隆平高科"]]

看到没,因为这里我是用json格式进行输出,而且是每一个单元格都有一个id,这样使得每行不区分单元格的大小,也就是说原本多个单元格合并而成的单元格,就是一个大的单元格,其余就被删除了,无法进行下面的扫描。提示一下,我们可以根据坐标来进行扫描。由于这里只是单纯的介绍一下,所以就不详细展开了。

camelot介绍

为什么我们这里着重介绍这个呢?因为这个的官方文档介绍的很详细,而且对新手非常友好,因此强烈建议大家使用这个。

camelot的官方文档在这里:

同样,相应的安装命令如下:

我们现在来测试之前的那个special.pdf文档,之前说了这个很不规则,非常具有代表性:

相应的测试代码如下:

运行结果:

这个尽管有空格,但是它默认会将合并的单元格进行隐藏拆分,这样原来显示的信息就占了第一个单元格,其余的将以空格进行填充。

上面代码中的camelot.read_pdf()就是camelot从表格中提取数据的函数,里面的参数为PDF文件存放的路径,pages是pdf的页数(默认为第一页),以及解析表格的方法(stream和lattice两个方法)。表格解析方法默认为lattice,stream方法默认会把整个PDF页面当做一个表格来解析。这样就有时候会产生严重的后果,所以大部分情况下,我们都是需要指定解析页面中的区域,你可以使用table_area这个参数来完成区域的指定。

我们第一个神器是将数据存为了txt,第二个神器是将数据存为了json,而第三个神器就比较流弊了,它可以将提取后的数据直接转化为pandas,csv,json,html等函数,就像前面的tables[0].df,tables[0].to_csv()函数那样。我们举个例子,将解析后的数据存为csv文件:

运行一下,当前位置就出现了该csv文件:

看到没有,仅仅两行代码就将那么复杂的数据进行了提取,并保存为csv格式,这简直是太神奇了。

接下来我们继续将之前那个上市公司行业分类结果进行提取:

相应的代码如下:

运行结果:

看到没有,这个代码就实现了该图片的提取,同时在pyvharm的右侧也出现了一张坐标图,所以你完全可以根据它进行坐标的选取:

看到没有,这里的蓝色柱就是代表数据,不过它也有一个缺点就是无法做到精确的范围限定,虽说有坐标,但是你很难获取它的精确坐标。但是就目前而言,它能做到这样已经很不错了。

上面介绍的三个神器,大家可以按照自己的具体应用场景来进行使用,尽管它们各有优缺点,但是你们可以结合起来使用,就能达到自己的目的了。

最后如果本文对你有点帮助,不妨分享出去,或者给点赞赏,给小编一包辣条吃。

— — Evny

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190126G0FVL000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券