python使用pdfminer解析pdf文件的方法示例


Posted in Python onDecember 20, 2018

最近要做个从 pdf 文件中抽取文本内容的工具,大概查了一下 python 里可以使用 pdfminer 来实现。下面就看看怎样使用吧。
PDFMiner是一个可以从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它注重的完全是获取和分析文本数据。PDFMiner允许你获取某一页中文本的准确位置和一些诸如字体、行数的信息。它包括一个PDF转换器,可以把PDF文件转换成HTML等格式。它还有一个扩展的PDF解析器,可以用于除文本分析以外的其他用途。

PDFMiner内置两个好用的工具:pdf2txt.py和dumppdf.py

pdf2txt.py从PDF文件中提取所有文本内容。但不能识别画成图片的文本,这需要特征识别。对于加密的PDF你需要提供一个密码才能解析,对于没有提取权限的PDF文档你得不到任何文本。

dumppdf.py把PDF文件内容变成pseudo-XML格式。这个程序主要用于debug,但是它也可能用于提取一些有意义的内容(比如图片)。

官方主页:https://euske.github.io/pdfminer/

其特征有:1、完全使用python编写。(适用于2.4或更新版本)2、解析,分析,并转换成PDF文档。3、PDF-1.7规范的支持。(几乎)4、中日韩语言和垂直书写脚本支持。5、各种字体类型(Type1、TrueType、Type3,和CID)的支持。6、基本加密(RC4)的支持。7、PDF与HTML转换。8、纲要(TOC)的提取。9、标签内容提取。10、通过分组文本块重建原始的布局。
如果你的Python有安装pip模块,就可以通过命令“python pip install pdfminer”,自动安装pdfminer。

解析pdf文件用到的类:

  • PDFParser:从一个文件中获取数据
  • PDFDocument:保存获取的数据,和PDFParser是相互关联的
  • PDFPageInterpreter处理页面内容
  • PDFDevice将其翻译成你需要的格式
  • PDFResourceManager用于存储共享资源,如字体或图像。

python的工具,安装当然是使用pip安装了。

pip install pdfminer

命令行方式

为了使用方便,pdfminer 提供了一个命令行工具来直接转换pdf文件,使用方法如下:

pdf2txt.py <path_to_pdf_file>

编程方式

除了命令行方式以外,对于复杂应用场景,pdfminer 也提供了以编程方式来转换 pdf 文件,主要使用下面几个类来实现:

  • PDFParser: 用来解析pdf文件。
  • PDFDocument:用来保存 PDFParser 解析后的对象。
  • PDFPageInterpreter:用来处理解析后的文档页面内容。
  • PDFResourceManager:pdf 共享资源管理器,用于存储共享资源,如字体或图像。

下面看一个例子:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams
import StringIO


class PDFUtils():

  def __init__(self):
    pass

  def pdf2txt(self, path):
    output = StringIO.StringIO()
    with open(path, 'rb') as f:
      praser = PDFParser(f)

      doc = PDFDocument(praser)

      if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed

      pdfrm = PDFResourceManager()

      laparams = LAParams()

      device = PDFPageAggregator(pdfrm, laparams=laparams)

      interpreter = PDFPageInterpreter(pdfrm, device)

      for page in PDFPage.create_pages(doc):
        interpreter.process_page(page)
        layout = device.get_result()
        for x in layout:
          if hasattr(x, "get_text"):
            content = x.get_text()
            output.write(content)

    content = output.getvalue()
    output.close()
    return content


if __name__ == '__main__':
  path = u'/tmp/abc.pdf'
  pdf_utils = PDFUtils()
  print pdf_utils.pdf2txt(path)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用PyFetion来发送短信的例子
Apr 22 Python
Python中使用logging模块打印log日志详解
Apr 05 Python
Python制作简易注册登录系统
Dec 15 Python
Python爬虫包BeautifulSoup简介与安装(一)
Jun 17 Python
谈一谈基于python的面向对象编程基础
May 21 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
python scrapy重复执行实现代码详解
Dec 28 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
python爬虫泛滥的解决方法详解
Nov 25 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
详解Python requests模块
Jun 21 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 Python
python爬取指定微信公众号文章
Dec 20 #Python
在Django中URL正则表达式匹配的方法
Dec 20 #Python
python采集微信公众号文章
Dec 20 #Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 #Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 #Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 #Python
python爬虫超时的处理的实例
Dec 19 #Python
You might like
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
鼠标移到导航当前位置的LI变色处于选中状态
2013/08/23 Javascript
Json和Jsonp理论实例代码详解
2013/11/15 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
vue引入axios同源跨域问题
2018/09/27 Javascript
微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码
2018/11/09 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
Python实现拼接多张图片的方法
2014/12/01 Python
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
在mac下查找python包存放路径site-packages的实现方法
2018/11/06 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
python多进程并行代码实例
2019/09/30 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
移动通信行业实习自我鉴定
2013/09/28 职场文书
英文求职信结束语大全
2013/10/26 职场文书
参观接待方案
2014/03/17 职场文书
5.12护士节演讲稿
2014/04/30 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
骨干教师个人总结
2015/02/11 职场文书
工作会议通知
2015/04/15 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android