从PDF中提取信息----PDFMiner

今天由于某种原因需要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对

内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的

那种pdf文件,发现还是蛮好用的。

PDFMiner----python的解析器和分析器

1.官方文档:http://www.unixuser.org/~euske/python/pdfminer/index.html

2.特征

  • 完全使用python编写。 (适用于2.4或更新版本)
  • 解析,分析,并转换成PDF文档。
  • PDF-1.7规范的支持。 (几乎)
  • 中日韩语言和垂直书写脚本支持。
  • 各种字体类型(Type1、TrueType、Type3,和CID)的支持。
  • 基本加密(RC4)的支持。
  • PDF与HTML转换。
  • 纲要(TOC)的提取。
  • 标签内容提取。
  • 通过分组文本块重建原始的布局。

3.安装

注:使用源码安装,并且处理中日韩语言的时候还需要一个额外的安装步骤

4.用法

4.1解析pdf文件用到的类:

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

PDFMiner的类之间的关系图:

4.2基本用法

4.2.1解析pdf文件

 1 from pdfminer.pdfparser import PDFParser
 2 from pdfminer.pdfdocument import PDFDocument
 3 from pdfminer.pdfpage import PDFPage
 4 from pdfminer.pdfpage import PDFTextExtractionNotAllowed
 5 from pdfminer.pdfinterp import PDFResourceManager
 6 from pdfminer.pdfinterp import PDFPageInterpreter
 7 from pdfminer.pdfdevice import PDFDevice
 8
 9
10 fp = open(‘mypdf.pdf‘, ‘rb‘)
11 #创建一个PDF文档解析器对象
12 parser = PDFParser(fp)
13 #创建一个PDF文档对象存储文档结构
14 #提供密码初始化,没有就不用传该参数
15 document = PDFDocument(parser, password)
16 #检查文件是否允许文本提取
17 if not document.is_extractable:
18     raise PDFTextExtractionNotAllowed
19 #创建一个PDF资源管理器对象来存储共享资源
20 rsrcmgr = PDFResourceManager()
21 #创建一个pdf设备对象
22 device = PDFDevice(rsrcmgr)
23 #创建一个PDF解析器对象
24 interpreter = PDFPageInterpreter(rsrcmgr, device)
25 #处理文档当中的每个页面
26 for page in PDFPage.create_pages(document):
27     interpreter.process_page(page)

当然这只是进行解析,还可进行布局分析,我的数据就是从这一步的到的

4.2.2布局分析

首先对第一步的代码进行修改和增加

 1 from pdfminer.layout import LAParams
 2 from pdfminer.converter import PDFPageAggregator
 3
 4 # 设定参数进行分析
 5 laparams = LAParams()
 6 # 创建一个PDF页面聚合对象
 7 device = PDFPageAggregator(rsrcmgr, laparams=laparams)
 8 interpreter = PDFPageInterpreter(rsrcmgr, device)
 9 for page in PDFPage.create_pages(document):
10     interpreter.process_page(page)
11     # 接收该页面的LTPage对象
12     layout = device.get_result()

布局分析返回的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曲线

4.2.3获得目录(纲要)

 1 from pdfminer.pdfparser import PDFParser
 2 from pdfminer.pdfdocument import PDFDocument
 3
 4 # Open a PDF document.
 5 fp = open(‘mypdf.pdf‘, ‘rb‘)
 6 parser = PDFParser(fp)
 7 document = PDFDocument(parser, password)
 8
 9 # Get the outlines of the document.
10 outlines = document.get_outlines()
11 for (level,title,dest,a,se) in outlines:
12     print (level, title)

5.个人使用

 1 # -*- coding: utf-8 -*-
 2 from pdfminer.pdfparser import PDFParser
 3 from pdfminer.pdfdocument import PDFDocument
 4 from pdfminer.pdfpage import PDFPage
 5 from pdfminer.pdfpage import PDFTextExtractionNotAllowed
 6 from pdfminer.pdfinterp import PDFResourceManager
 7 from pdfminer.pdfinterp import PDFPageInterpreter
 8 from pdfminer.pdfdevice import PDFDevice
 9 from pdfminer.layout import *
10 from pdfminer.converter import PDFPageAggregator
11 import os
12 os.chdir(r‘F:\test‘)
13 fp = open(‘python.pdf‘, ‘rb‘)
14 #来创建一个pdf文档分析器
15 parser = PDFParser(fp)
16 #创建一个PDF文档对象存储文档结构
17 document = PDFDocument(parser)
18 # 检查文件是否允许文本提取
19 if not document.is_extractable:
20     raise PDFTextExtractionNotAllowed
21 else:
22     # 创建一个PDF资源管理器对象来存储共赏资源
23     rsrcmgr=PDFResourceManager()
24     # 设定参数进行分析
25     laparams=LAParams()
26     # 创建一个PDF设备对象
27     # device=PDFDevice(rsrcmgr)
28     device=PDFPageAggregator(rsrcmgr,laparams=laparams)
29     # 创建一个PDF解释器对象
30     interpreter=PDFPageInterpreter(rsrcmgr,device)
31     # 处理每一页
32     for page in PDFPage.create_pages(document):
33         interpreter.process_page(page)
34         # 接受该页面的LTPage对象
35         layout=device.get_result()
36         for x in layout:
37             if(isinstance(x,LTTextBoxHorizontal)):
38                 with open(‘a.txt‘,‘a‘) as f:
39                     f.write(x.get_text().encode(‘utf-8‘)+‘\n‘)

将书中的文本内容得到了,只是简单的使用,官方文档中讲解的很全面,在此只是做个小总结。

注:转载请注明出处

时间: 2024-10-24 11:59:58

从PDF中提取信息----PDFMiner的相关文章

怎样使用PDF编辑软件,怎么从PDF中提取单页

一份PDF文档可能不是每一页的内容都是我们所需要的,但是我们又不是直接将需要的部分复制下来,剩下的页面也不想直接的删除掉,那么我们可不可以提取呢?下面一起看PDF编辑器怎么提取pdf其中一页.就跟小编一起来看看下面的文章吧. 操作软件:迅捷PDF编辑器 1.打开运行迅捷PDF编辑器,在编辑器中打开需要修改的PDF文件. 2.打开文件后,选择编辑器中菜单栏里的文档,然后选择文档中的提取页面,点击提取页面工具. 3.还可以在左边缩略图的部分打开提取页面工具,点击鼠标右键,就会弹出一个框,然后选择提取

用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法长时间做某种重复性的枯燥操作.想象这样一个场景,我们有个几千行的表要填,需要根据姓名输入其对应的身份证号,但之前我们已经做过一个类似的表,同样的一些人的姓名跟身份证号是完整的,那么我们就需要通过一个个查找姓名,然后把身份证号码复制到我们当前要做的表里去. 当我日复一日重复着这些操作的时候,我都很想有

在excel单元格中提取信息

平时在excel中处理数据的时候,肯定会遇到在单元格提取信息的情况,比如在地址中提取省.市.地区等,如果数据源内容规整的话,可以直接使用left().right().mid()等函数直接提取,但是大多数情况下,数据源的内容比较混乱,这时的就提取需要一些函数的组合,比如下面这种: 上图中是一些地址,我们看到大部分还是按照省.市.区来排列的,但是其中有一些格式并不统一,比如第6行,如何解决,首先我们需要一个辅助列,这个辅助列表就是你希望提取出来的内容,比如我想提取城市,我就弄一个存储城市名的辅助列,

用PDFMiner从PDF中提取文本文字

1.下载并安装PDFMiner 从https://pypi.python.org/pypi/pdfminer/下载PDFMineer wget https://pypi.python.org/packages/57/4f/e1df0437858188d2d36466a7bb89aa024d252bd0b7e3ba90cbc567c6c0b8/pdfminer-20140328.tar.gz#md5=dfe3eb1b7b7017ab514aad6751a7c2ea 加压并安装 tar -zxvf

使用NPOI从Excel中提取图片及图片位置信息

原文:使用NPOI从Excel中提取图片及图片位置信息 问题背景: 话说,在ExcelReport的开发过程中,有一个比较棘手的问题:怎么复制图片呢? 当然,解决这个问题的第一步是:能使用NPOI提取到图片及图片的位置信息.到这里,一切想法都很顺利.但NPOI到底怎么提取图片及图片的位置信息呢?NPOI能不能提取到图片的位置信息呢? 这是两个问题.是两个让BaiGoogleDu几近沉默的问题.但官方教程的评论中还是流露出了答案的蛛丝马迹. 哇咔咔,这是我去看源码寻答案的的动力. 此处省去(N多字

检查打开的文件是不是ELF格式的文件,提取“特别”的节中的信息

//检查打开的文件是不是ELF格式的文件 //检验ELF头 //获得节头表的地址 //遍历节头表,依次查看一个节的属性,从节头字符串表中找到其名称,如果名称和"特别"的section名匹配,则找到此节的地址 //提取"特别"的节中的信息 //显示上面提取的信息 #include<stdio.h> #include<elf.h> #include<stdlib.h> #include<string.h> int main

第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

新建一个Java Project :LunceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene-analyzers-3.1.0.jar    (分词器) 3) lucene-highlighter-3.1.0.jar    (高亮器) 4) lucene-memory-3.1.0.jar       (高亮器) 新建实体类:Article, 属性:id,title,content; gett

在线提取PDF中图片和文字

无需下载软件,你就可以在线提取PDF中图片和文字,http://www.extractpdf.com/不仅可以获取本地PDF文档的图片和文字,还能获取远程PDF文档的图片和文字.如下图所示:结果本人测试,该工具非常好用,能够轻松提取pdf中图片打包下载(如下图所示),唯一不足的是它只能提取10M一下的PDF文档,对于大文档提取速度可能就力不从心了,总之,是个值得收藏的网站.虽然是英文网站,但是该pdf提取工具对中文支持非常好,不会出现乱码.

【BioCode】Elm格式中提取位点信息

说明: ①Elm格式: PLMD ID    Uniprot Accession    Position     Type     Sequence   Species    PMIDsPlMD编号 Uniprot数据库编号         位点 翻译后修饰类型 序列信息 物种 PMID PLMD-1   O00115     52     Ubiquitination  MIPLLLAALLCVPAGALTC Homo sapiens   21963094;23266961 ②代码说明:从上述