python:pdfminer接口测试

目录:

 


 

简介

 

 

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()

  实例化之后的分析器:

  

 

 

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为例:

  

 

   注意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()

  

 

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

    数据提取:

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为例:

  

 

 

 

 


 

posted @ 2020-05-14 12:00  巴蜀秀才  阅读(603)  评论(0编辑  收藏  举报