pdf内容提取,pdf数据提取
PDFMiner是一个可以从PDF文档中提取信息的工具。与其他PDF相关工具不同,它完全专注于获取和分析文本数据。PDFMiner允许您获取文本在特定页面中的确切位置以及一些信息,如字体和行号。它包括一个PDF转换器,可以将PDF文件转换成HTML和其他格式。它还有一个扩展的PDF解析器,除了文本分析之外,还可以用于其他目的。
Pdf2txt.py和dumppdf.py
pdf2txt.py
内置了两个简单易用的工具,可以从Pdf文件中提取所有文本内容。但是它不能识别画成图片的文字,这就需要特征识别。对于加密的PDF,您需要提供密码来解析它。对于没有提取权限的PDF文档,无法获取任何文本。dumppdf.py
将PDF文件内容更改为伪XML格式。这个程序主要用于调试,但也可能用于提取一些有意义的内容(比如图片)。官方主页:https://euske.github.io/pdfminer/
其特点如下:1 .它是用python写的。(适用于2.4或更高版本)2 .解析、分析并转换为PDF文档。3.支持PDF-1.7规范。(差不多)4。支持中文、日文和韩文以及竖排书写脚本。5.支持各种字体类型(Type1、TrueType、Type3和CID)。6.支持基本加密(RC4)。7.PDF和HTML之间的转换。8.轮廓提取。9.标签内容提取。10.通过组合文本块来重建原始布局。
如果在Python中安装了pip模块,可以通过命令“python pip install pdfminer”自动安装pdfminer。
解析pdf文件用到的类:
从文件中获取数据
PDFDocument:保存采集的数据,该数据与PDFParser相关。
PDFPageInterpreter处理页面内容。
PDFDevice将其翻译成您需要的格式。
PDFResourceManager用于存储共享资源,如字体或图像。
PDFMiner的类之间的关系图:
Layout分析返回的PDF文档中每个页面的LTPage对象。该对象和页面中包含的子对象形成一个树形结构。如图所示:
LTPage:表示整页。可能包含LTTextBox、LTFigure、LTImage、LTRect、LTCurve和LTLine子对象。
LTTextBox:表示一组文本块可以包含在一个矩形区域中。请注意,此框是通过几何分析创建的,并不一定代表文本的逻辑边界。它包含LTTextLine对象的列表。使用get_text()方法返回文本内容。
LTTextLine:包含表示单个文本行的LTChar对象列表。字符对齐可以是水平对齐,也可以是垂直对齐,这取决于文本的书写模式。使用get_text()方法返回文本内容。
LTAnno:在文本中,字母实际上被表示为Unicode字符串。需要注意的是,虽然LTChar对象有实际边界,但LTAnno对象没有,因为这些是“虚拟”字符,是在布局分析后根据两个字符之间的关系(例如,空格)插入的。
LTImage:表示一个图像对象。嵌入的图像可以是JPEG或其他格式,但目前PDFMiner并没有在图形对象上投入太多精力。
LTLine:表示直线。可用于分隔文本或绘图。
LTRect:表示一个矩形。可用于框架的另一个图片或数字。
LTCurve:表示一般的贝塞尔曲线。
(1)获取PDF文档目录(纲要)
#!/usr/ajdwdm/python #-*-编码:utf-8-*-从pdfmainer.pdf解析器导入pdf解析器从pdfmainer.pdf文档导入pdf文档#获取目录(大纲)#打开一个pdf文件FP=Open(U F: PDF 2013 000608 _ Sunshine Shares _ 2013年报(更新)_1.pdf ,Rb )解析器=pdf解析器(FP)文档=pdf文档(解析器)#。获得的文档的目录(大纲)=document.get _ lines () for (level,title,dest,a,se) in lines:打印级别,title
(2)读取pdf文本内容
下面我们使用pdfminer来读取pdf文档中的文本内容:
#!/usr/ajd WDM/python #-*-编码:utf-8-*-来自pdf miner。转换器从pdf miner导入pdf页面聚合器。pdf解析器从pdf miner导入pdf解析器。pdf文档从pdf miner导入pdf文档。pdf页面从pdf miner导入pdf页面。pdf页面从pdf miner导入pdftextextractionnotallowed。pdf interp从pdf miner导入pdf source manager。pdf interper从pdf miner导入pdf页面解释器。可移植文档格式文件的扩展名(portable document format的缩写)打开一个可移植文档格式文件的扩展名(可移植文档格式的缩写)文件FP=open(u f: pdf 2013 000001 _平安银行_2013年年度报告_2562.pdf , rb)#创建一个便携文档格式文档解析器对象parser=PDFParser(fp)#创建一个便携文档格式文档对象存储文档结构#提供密码初始化,没有就不用传该参数# document=文档(解析器,密码)文档=文档(解析器)#检查文件是否允许文本提取如果不是可提取的文档:引发PDFTextExtractionNotAllowed#创建一个便携文档格式资源管理器对象来存储共享资源#缓存=假不缓存rsrcmgr=PDFResourceManager(caching=False)#创建一个便携文档格式设备对象laparams=LAParams()#创建一个便携文档格式页面聚合对象device=pdf页面聚合器(rsrcmgr,laparams=laparams)#创建一个便携文档格式解析器对象interpreter=PDFPageInterpreter(rsrcmgr,device)#处理文档当中的每个页面# doc.get_pages()获取页,面,张,版列表#对于I,枚举中的第页(文档。get _ pages()):# pdf page。创建_页面(文档)获取页,面,张,版列表的另一种方式替换=重新。编译(r s );# 循环遍历列表,每次处理一个页,面,张,版的内容对于PDFPage.create_pages(文档)中的页面:口译员。process _ page(第页)#接受该页面的LTPage对象layout=device.get_result() #这里布局是一个LTPage对象里面存放着这个页,面,张,版解析出的各种对象# 一般包括LTTextBox,LTFigure,LTImage,LTTextBoxHorizontal等等布局中的x:#如果x是水平文本对象的话if(isinstance(x,lttextbox horizontal)):text=re。sub(replace,,x.get_text()) if len(text)!=0:打印文本
(3)保存pdf文本内容
如果你想要把可移植文档格式文件的扩展名(可移植文档格式的缩写)文档文本保存为文本文件(文本文件)的话,可以参考下面的程序:
#!/usr/ajd WDM/python #-*-编码:utf-8-*-导入OSI导入引用来自pdf miner。pdf interp从pdf miner导入pdf源管理器、pdf页面解释器。pdf页面从pdf miner导入pdf页面。从pdf miner导入文本转换器。布局导入参数#将一个可移植文档格式文件的扩展名(可移植文档格式的缩写)转换成txt def pdftottxt(文件路径,输出路径):try: fp=file(文件路径, rb) outfp=file(输出路径, w) #创建一个便携文档格式资源管理器对象来存储共享资源#缓存=假不缓存rsrcmgr=PDFResourceManager(caching=False)#创建一个便携文档格式设备对象laparams=LAParams()device=text converter(rsrcmgr,outfp,codec=utf-8 ,LAParams=LAParams,imagewriter=None) #创建一个便携文档格式解析器对象PDFPage.get_pages(fp,pagenos=set(),maxpages=0,password= ,caching=False,check_extractable=True)中的页,面,张,版的解释器(rsrcmgr,设备):页面。旋转=页面。旋转% 360解释器。process _ page(第页)#关闭输入流fp.close() #关闭输出流设备。close()outp。flush()outp。close()异常除外,e: print 异常:%s ,e # pdf toxt(u f: pdf 2013 000001 _平安银行_2013年年度报告_2562.pdf ,utest.txt)#一个文件夹下的所有可移植文档格式文件的扩展名(可移植文档格式的缩写)文档转换成txt def pdf totxt(fileDir):files=OS。list dir(fileDir)tarDir=fileDir txt 如果不是OS。路径。exists(tarDir):OS。mkdir(tarDir)replace=re。编译(r ).可移植文档格式文件的扩展名(portable document format的缩写)格式,回复我)对于文件中的文件:file path=fileDir file out path=tarDir re。sub(replace ,file) .txt pdfTotxt(filePath,outPath)print Saved outpathfottxt(u f: pdf 2013 )遗憾的是,pdfminer无法维持可移植文档格式文件的扩展名(可移植文档格式的缩写)文本的布局,而且读写速度对比pdfbox真的好慢。