Python 第三方模块之 PDFMiner(pdf信息提取)

PDFMiner简介

pdf提取目前的解决方案大致只有pyPDF和PDFMiner。据说PDFMiner更适合文本的解析,首先说明的是解析PDF是非常蛋疼的事,即使是PDFMiner对于格式不工整的PDF解析效果也不怎么样,所以连PDFMiner的开发者都吐槽PDF is evil. 不过这些并不重要。

PDFMiner是一个可以从PDF文档中提取信息的工具。与其他PDF相关的工具不同,它注重的完全是获取和分析文本数据。PDFMiner允许你获取某一页中文本的准确位置和一些诸如字体、行数的信息。它包括一个PDF转换器,可以把PDF文件转换成HTML等格式。它还有一个扩展的PDF解析器,可以用于除文本分析以外的其他用途。

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

  • pdf2txt.py从PDF文件中提取所有文本内容。但不能识别画成图片的文本,这需要特征识别。对于加密的PDF你需要提供一个密码才能解析,对于没有提取权限的PDF文档你得不到任何文本。
  • dumppdf.py把PDF文件内容变成pseudo-XML格式。这个程序主要用于debug,但是它也可能用于提取一些有意义的内容(比如图片)。

PDFMiner在python2中名为PDFMiner,在python3中名为PDFMiner3k,分别上链接

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

pdfminer3k  官方主页:https://pypi.org/project/pdfminer3k/
pdfminer3k  github主页:https://github.com/jaepil/pdfminer3k

解析pdf文件用到的类:

  • PDFParser:PDF文档分析器:从一个文件中获取数据
  • PDFDocument:PDF文档对象:保存获取的数据,和PDFParser是相互关联的
  • PDFPageInterpreter:PDF文档解析器:处理页面内容,变成Python可以解析
  • PDFResourceManager:PDF资源管理器:用于存储共享资源,如字体或图像。
  • PDFDevice: 将其翻译成你需要的格式
  • LAParams:PDF参数分析器:分析pdf文件参数
  • PDFPageAggregator:PDF聚合器:读取获取的文档对象

他们之间的关系图如下:

 

布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象,形成一个树结构,如图所示:

 

  • LTPage :表示整个页。可能会含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子对象。
  • LTTextBox:表示一组文本块可能包含在一个矩形区域。注意此box是由几何分析中创建,并且不一定
    表示该文本的一个逻辑边界。它包含LTTextLine对象的列表。使用 get_text()方法返回的文本内容。
  • LTTextLine :包含表示单个文本行LTChar对象的列表。字符对齐要么​​水平或垂直,取决于文本的写入模式。
    get_text()方法返回的文本内容。
  • LTChar
  • LTAnno:在文本中实际的字母表示为Unicode字符串(?)。需要注意的是,虽然一个LTChar对象具有实际边界,
    LTAnno对象没有,因为这些是“虚拟”的字符,根据两个字符间的关系(例如,一个空格)由布局分析后插入。
  • LTImage:表示一个图像对象。嵌入式图像可以是JPEG或其它格式,但是目前PDFMiner没有放置太多精力在图形对象。
  • LTLine:代表一条直线。可用于分离文本或附图。
  • LTRect:表示矩形。可用于框架的另一图片或数字。
  • LTCurve:表示一个通用的Bezier曲线

一个简单的示例

# encoding: utf-8
import sys
import importlib
importlib.reload(sys)
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowedpath ="C:\\Users\\admin\\Desktop\\t.pdf"
def parse():fp = open(path, 'rb') #用文件对象来创建一个pdf文档分析器PDFParserpraser = PDFParser(fp)# 创建一个PDF文档PDFDocumentdoc = PDFDocument()# 连接分析器 与文档对象praser.set_document(doc)doc.set_parser(praser)# 提供初始化密码,如果没有密码 就创建一个空的字符串doc.initialize()# 检测文档是否提供txt转换,不提供就忽略if not doc.is_extractable:raise PDFTextExtractionNotAllowedelse:# 创建PDf 资源管理器 来管理共享资源PDFResourceManagerrsrcmgr = PDFResourceManager()# 创建一个PDF设备对象LAParamslaparams = LAParams()# 创建聚合器,用于读取文档的对象PDFPageAggregatordevice = PDFPageAggregator(rsrcmgr, laparams=laparams)# 创建一个PDF解释器对象,对文档编码,解释成Python能够识别的格式:PDFPageInterpreterinterpreter = PDFPageInterpreter(rsrcmgr, device)# 循环遍历列表,每次处理一个page的内容for page in doc.get_pages(): # doc.get_pages() 获取page列表# 利用解释器的process_page()方法解析读取单独页数interpreter.process_page(page)# 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象,一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal等等,想要获取文本就获得对象的text属性,# 使用聚合器get_result()方法获取页面内容layout = device.get_result()for x in layout:if (isinstance(x, LTTextBoxHorizontal)):#需要写出编码格式with open(r'C:\Users\admin\Desktop\1.txt', 'a',encoding='utf-8') as f:results = x.get_text()f.write(results + '\n')if __name__ == '__main__':parse()

或者使用官方的一个例子,简单写如下

rsrcmgr = PDFResourceManager(caching=caching)    # 创建一个PDF资源管理器对象来存储共赏资源
outfp = io.open(outfile, 'wt', encoding=codec, errors='ignore')    #指定outfile
device = XMLConverter(rsrcmgr, outfp, laparams=laparams, outdir=outdir)
fp = io.open(file, 'rb')     #来创建一个pdf文档分析器
process_pdf(rsrcmgr, device, fp, pagenos, maxpages=maxpages, password=password, caching=caching, check_extractable=True)   #调用process_pdf
fp.close()
device.close()
outfp.close()
参考链接:
https://blog.csdn.net/liuqingpeng_1/article/details/79560753
https://www.zhangshengrong.com/p/Z9a2AAy1Vk/
https://blog.csdn.net/qq_29750461/article/details/80011255
https://blog.csdn.net/sinat_37967865/article/details/80145487

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TFS2017持续发布中调用PowerShell启停远程应用程序

目前团队项目中有多个Web、服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行。停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题。这种模式消耗的很多…

Flask 多线程

参数 app.run()中可以接受两个参数,分别是threaded和processes,用于开启线程支持和进程支持。 threaded: 是否开启多线程,默认不开启。 if __name__ __main__:app.run(threadedTrue)processes:进程数量&#xff0c…

40天python入门教程_Python入门教程超详细1小时学会Python

Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的Python程序.为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.思路:用shell编程.(Linux通常是bash而Windows是批处理脚本).例如,在Windo…

基于LVS对LAMP做负载均衡集群

一、简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要…

Python_Day1

1、猜年龄游戏: (1):每循环3次,counter值返回为0,重新开始循环;(2):continue 意思是跳出当前循环;(3)&#xff1…

kafka 入门

初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的 基于发布订阅模式的消息引擎系统。 Kafka 的基本术语 消息&#xf…

实体词典 情感词典_tidytextpy包 | 对三体进行情感分析

腾讯课堂 | Python网络爬虫与文本分析TidyTextPy前天我分享了 tidytext | 耳目一新的R-style文本分析库 但是tidytext不够完善,我在tidytext基础上增加了情感词典,可以进行情感计算,为了区别前者,将其命名为tidytextpy。大家有时间…

TensorFlow实现LeNet5模型

# -*- coding: utf-8 -*-import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 获取mnist数据mnist input_data.read_data_sets("MNIST_data/", one_hotTrue)# 注册默认session 后面操作无需指定session 不同sesson之间的数据是独立…

Python基础第一天

一、内容 二、练习 练习1 题目&#xff1a;使用while循环输出1 2 3 4 5 6 8 9 10 方法一&#xff1a; 图示&#xff1a; 代码&#xff1a; count 1 while count < 11:if count ! 7:print(count)count 1输出结果&#xff1a; 1 2 3 4 5 6 8 9 10 View Code方法二&#xff1…

python flask 上传下载 api_Flask 文件下载API

给前端提供一个文件下载接口时, 遇到了文件名乱码的问题, 几经折腾总算实现效果, 代码如下:import requestsfrom flask import Response, jsonify, request, stream_with_contextfrom flask_login import login_requiredfrom . import bpfrom .models import Coursewarebp.rout…

OpenGL实用开源代码列表

有了网络的最大好处就是可以资源共享。网络是最大的知识库&#xff0c;也是最好的老师&#xff0c;正所谓“没有你想不到的&#xff0c;只有你找不到的”。以下是我收集的以游戏编程&#xff0c;OpenGL 3D编程相关的免费扩展库资料。不断更新中&#xff0c;如果你有好的建义&am…

vaOJ10369 - Arctic Network

1 /*2 The first line of each test case contains 1 < S < 100, the number of satellite channels!3 注意&#xff1a;S表示一共有多少个卫星&#xff0c;那么就是有 最多有S-1个通道&#xff01; 然后将最小生成树中的后边的 S-1通道去掉就行了&#xff01; 4…

python-kafka 常用 api 汇总

简介 python连接kafka的标准库&#xff0c;kafka-python和pykafka。kafka-python使用的人多是比较成熟的库&#xff0c;kafka-python并没有zk的支持。pykafka是Samsa的升级版本&#xff0c;使用samsa连接zookeeper&#xff0c;生产者直接连接kafka服务器列表&#xff0c;消费者…

scp选择二进制_二进制传输与文本传输区别

Ftp&#xff0c;winscp等工具下载文件时候有选项&#xff0c;可选的有二进制方式和文本方式。文本方式又称为ASCII方式两者区别如下。ASCII 方式和BINARY方式的区别是回车换行的处理&#xff0c;binary方式不对数据执行任何处理&#xff0c;ASCII 方式将回车换行转换为本机的回…

在ffmpeg中加入x264模块

引言&#xff1a;最近一直致力于多媒体应用开发&#xff0c;一说起编码解码就不得不说下FFmpeg。FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统&#xff0c;但是可以在大多数操作系统中编译和使用。下面就详细介…

RabbitMQ实例教程:发布/订阅者消息队列

消息交换机&#xff08;Exchange&#xff09; RabbitMQ消息模型的核心理念是生产者永远不会直接发送任何消息给队列&#xff0c;一般的情况生产者甚至不知道消息应该发送到哪些队列。 相反的&#xff0c;生产者只能发送消息给交换机&#xff08;Exchange&#xff09;。交换机的…

OAuth 2.0(网转)

&#xff08;一&#xff09;背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准&#xff0c;目前在国内还没有很靠谱的技术资料。为了弘扬“开放精神”&#xff0c;让业内的人更容易理解“开放平台”相关技术&#xff0c;进而长远地促进国内开放平台领域的发展&#xf…

kafka 自动提交 和 手动提交

Consumer 需要向 Kafka 汇报自己的位移数据&#xff0c;这个汇报过程被称为提交位移&#xff08;Committing Offsets&#xff09;。因为 Consumer 能够同时消费多个分区的数据&#xff0c;所以位移的提交实际上是在分区粒度上进行的&#xff0c;即 Consumer 需要为分配给它的每…

axios vue 回调函数_vue中ajax请求与axios包完美处理

这次给大家带来vue中ajax请求与axios包完美处理&#xff0c;vue中ajax请求与axios包处理的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。在vue中&#xff0c;经常会用到数据请求&#xff0c;常用的有&#xff1a;vue-resourse、axios今天我说的是axio…

用int还是用Integer?

昨天例行code review时大家有讨论到int和Integer的比较和使用。 这里做个整理&#xff0c;发表一下个人的看法。【int和Integer的区别】int是java提供的8种原始类型之一&#xff0c;java为每个原始类型提供了封装类&#xff0c;Integer是int的封装类。int默认值是0&#xff0c;…