当前位置 : 主页 > 编程语言 > python >

python:pdfminer接口测试

来源:互联网 收集:自由互联 发布时间:2022-06-15
目录: ​​pdfminer简介​​ pdfparser 简介 ​​back to top​​​ ​​to the end​​ pdfparser使用介绍 1 from pdfminer.pdfparser import PDFParser, PDFDocument pdfparser是一个pdf解析器,里面封装了PDFParser,


目录:

  • ​​pdfminer简介​​
  • pdfparser

 


简介

​​back to top​​​   ​​to the end​​


pdfparser使用介绍

1 from pdfminer.pdfparser import PDFParser, PDFDocument

  pdfparser是一个pdf解析器,里面封装了PDFParser, PDFDocument这两个我们常用的类。PDFParser从文件流中获取PDF对象;它可以通过引用set_document方法设置的PDF文档来处理间接引用;它还可读取每个PDF文件的交叉引用(xref),一般可以快速定位。由于PDF文件可能很大,通常不会立即加载。因此,PDF文档必须与PDF解析器协作,以便在处理过程中动态导入数据。

1 fp = open(path, 'rb') # 以二进制读模式打开
2 praser = PDFParser(fp)

  fp为文件流,这里我们使用open打开,产生一个二进制文件。parser是PDFParser的实例,fp为必传参数。parser可以使用的形式有:

Typical usage:
    parser = PDFParser(fp)
    parser.read_xref()
    parser.set_document(doc)
    parser.seek(offset)
    parser.nextobject()

  实例化之后的分析器:

  python:pdfminer接口测试_实例化

  

1 # 创建一个PDF文档
2 doc = PDFDocument()

  doc是PDFDocument的实例化对象,现在的doc像一张白纸,类默认封装很多方法,其中部分是内部方法,供类内调用,我们可以使用的典型方法有:

Typical usage:
    doc = PDFDocument()
    doc.set_parser(parser)
    doc.initialize(password)
    obj = doc.getobj(objid)1 # 连接分析器 与文档对象
2 praser.set_document(doc)
3 doc.set_parser(praser)

  将doc赋给praser,就像给一只钢笔配上了笔记本,单向传参是肯定不行的,因为doc本身封装了很多方法,其本身是需要用到praser这只笔的,所以要把praser传给doc。(praser不是拼写错误,而是在代码中进行区分)

  相互传参绑定之后,两个对象都发生了相应的变化,以parser为例:

  python:pdfminer接口测试_字符串_02

 

   注意doc上边有一个data的字符串,我们可以发现字符串:%PDF-1.7\n ,这个意思就是当前文本的PDF版本为1.7,PDF文件的具体格式介绍请移步:PDF格式详解。

1 # 文档初始化解密
2 # 没有密码 就创建一个空的字符串
3 doc.initialize()

  PDF文档很多时候是加密的,为了读取相应内容,需要给电脑赋予权限,这里当然是传入密码了,若文档密码很多,可以实例化一个秘密管理器。

  导入:from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

1 if not doc.is_extractable:
2 raise PDFTextExtractionNotAllowed

  判断是否可以将PDF文件转换成txt,不行就直接忽略,你也可以查看是否可以修改或直接print。因为在文档初始化密码时,我们生成了以下属性:

1 self.is_printable = bool(P & 4)
2 self.is_modifiable = bool(P & 8)
3 self.is_extractable = bool(P & 16)

  额,一般都不行啊,要是那么简单就好了。

 

​​back to top​​​   ​​to the end​​



文档解析

  先导入其他依赖

from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams

  PDFResourceManager:ResourceManager有助于重用共享资源,如字体和图像,这样大型对象就不会被多次分配。主要是procset、cmap、font。

  LAParams:封装了常用的参数,用于参数空间的构建。

  PDFPageAggregator:整合信息进行返回,类似于扫描器中的commander。LAParams实例化的参数主要是传给它,相当于指定指挥官的权限和能力。

  PDFPageInterpreter:用于创建一个PDF解释器对象,里面封装了很多方法,可以根据需要进行查找。它就相当于那个扫描器。

rsrcmgr = PDFResourceManager() # 创建资源管理器,负责资源调度,有益于资源共享。
laparams = LAParams() # 实例化默认参数空间
device = PDFPageAggregator(rsrcmgr, laparams=laparams) # 创建设备
interpreter = PDFPageInterpreter(rsrcmgr, device) # 创建解释器

  逐页分析

  我们可以通过doc.get_pages()获取一个生成器,生成器对应了PDF每一页的数据源与解析器等配置。

1 interpreter.process_page(pages.__next__())

  将某页的实例传入进行分析,如何返回?找设备的大脑,device是专门负责相应工作的。

1 # 接受该页面的LTPage对象
2 layout = device.get_result()

  python:pdfminer接口测试_封装_03

 

  layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox、 LTFigure、

    数据提取:

1 for x in layout:
2 if isinstance(x, LTTextBoxHorizontal):
3 # 需要写出编码格式
4 # 解决\u8457\u5f55\u683c\u5f0f\uff1a\u67cf\u6167乱码
5 results = x.get_text().encode('raw_unicode_escape').decode('unicode_escape')
6 print('**res:**\n' + results + '-'*20) # 不同实例对象LTPage的分割

  输出结果,以Page1为例:

  python:pdfminer接口测试_封装_04

 

 

 

 


 


清澈的爱,只为中国

网友评论