zoukankan      html  css  js  c++  java
  • 从PDF中提取信息----PDFMiner

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

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

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

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

    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的类之间的关系图:

    http://www.unixuser.org/~euske/python/pdfminer/objrel.png

    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对象。这个对象和页内包含的子对象,形成一个树结构

    如图所示:

    http://www.unixuser.org/~euske/python/pdfminer/layout.png

    • 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:	est')
    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')+'
    ')

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

    注:转载请注明出处

  • 相关阅读:
    Gradle中的buildScript,gradle wrapper,dependencies等一些基础知识
    在liferay 7中如何删除service builder已经生成的数据库table
    settings.gradle与build.gradle有什么区别
    如何建一个Liferay 7的theme
    如何在IDE的开发环境中启动Studio和本地build出一个product
    Lunix文件的读写权限问题
    liferay 7用OSGi的方式修改默认权限
    Liferay 7 module项目的依赖问题
    城市选择
    2016/04/26 流程 数据库lcdb 四个表 1,用户表users 2,流程表(设定有哪些流程)liucheng 3,流程发起者表(记录谁发起到哪里) 4,流程经过的人员表 flowpath (order排序)
  • 原文地址:https://www.cnblogs.com/RoundGirl/p/4979267.html
Copyright © 2011-2022 走看看