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文件写入实例分析
Apr 08 Python
Python实现控制台进度条功能
Jan 04 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
简单了解python模块概念
Jan 11 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python爬虫-模拟微博登录功能
Sep 12 Python
Python实现AI换脸功能
Apr 10 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 Python
python 利用toapi库自动生成api
Oct 19 Python
python定时截屏实现
Nov 02 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
利用PHP动态生成VRML网页
2006/10/09 PHP
php开发环境配置记录
2011/01/14 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
Yii框架实现多数据库配置和操作的方法
2017/05/25 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
初识Node.js
2014/09/03 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
[01:13]这,就是刀塔
2014/07/16 DOTA
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
对Python信号处理模块signal详解
2019/01/09 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
python实现自动清理重复文件
2020/08/24 Python
工程监理应届生求职信
2013/11/09 职场文书
管理科学大学生求职信
2013/11/13 职场文书
汽车促销活动方案
2014/03/31 职场文书
电台编导求职信
2014/05/06 职场文书
学雷锋标语
2014/06/25 职场文书
见义勇为事迹材料
2014/12/24 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python
Pytest中conftest.py的用法
2021/06/27 Python
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android