python读取pdf内容,python识别pdf文件
由于爬虫爬取的字段并不完整,需要解析PDF来获取部分字段,所以创建了这个博客。
一.环境配置
因为之前的项目是基于py2的,所以这次打算用py3,所以先配置py3的环境。我个人比较喜欢anaconda,因为里面内置了很多需要的第三方包,在安装一些其他包的时候不可避免的会用到一些依赖包,anaconda只是自带了一部分。(win,mac,linux都有。需要的话自己下载安装)。安装anaconda3需要很长时间。如果你很着急,安装python3就可以了。
配置所需的python3环境,然后就可以安装pdfminer模块了。
注意:python2中的pdfminer和python3中的pdfminer3k
Pip pdfminer 3K II。PDF Miner分析
附上pdfminer的文档。
解析PDF是一项非常耗时和消耗内存的工作,因此PDFMiner使用了一种称为惰性解析的策略,只在需要时进行解析,以减少时间和内存的使用。解析PDF至少需要两个类:PDFParser和PDFDocument。PDFParser从文件中提取数据,PDFDocument保存数据。此外,还需要PDFPageInterpreter来处理页面内容,由PDFDevice转换成我们需要的内容。PDFResourceManager用于保存字体或图片等共享内容。
更重要的是布局,主要包括以下几个部分:
LTPage
表示整个页面。可能包含子对象,如LTTextBox、LTFigure、LTImage、LTRect、LTCurve和LTLine。
三.代码实现
import urllibimport importlib,sysimportlib . reload(sys)from PDF miner . PDF parser import PDF parser,PDF document from PDF miner . PDF device import PDF device from PDF miner . PDF interper import PDF source manager,PDF pageinterpreter from PDF miner . converter import PDF pageaggregator from PDF miner . layout import lttextbox horizontal,laparams from PDF miner . PDF interper import pdftextractionnotalloweddef parse(DataIO,Save_path):parser=PDFParser(DataIO) #创建一个PDF文档。doc=PDFDocument() #分析器和文档相互连接。parser . set _ document(doc)doc . set _ parser(parser)#提供初始化密码,默认不为空。doc.initialize() #检查文档是否可以转换为TXT,如果不能,忽略如果不是doc . is _ extractable:raise pdftextextraction connected else:#创建PDF explorer,以管理共享资源rsrcmagr=PDFResourceManager() #创建PDF设备对象laparams=LAParams() #聚合资源管理器和设备对象device=pdfpageaggregator(rsrcmagr,Laparams=laparams) #创建PDF解释器对象interpreter=pdfpageinterpreter(rsrcmagr,device) #循环遍历一次处理一个页面内容#doc.get_pages()获取doc.get_pages()中页面的页面列表:interpreter . process _ page(page)# LTPage object layout=device . get _ result()#这里的布局是一个lt page对象,存放page #解析的各种对象一般包括LTTextBox、LTFigure、LTImage、Textboxholizontal等等。 #如果要获取文本,就得获取布局中x的对象的text属性:try: if (isinstance (x,lttextbox horizontal)):with open( % s (Save _ path),A )as f:result=x . get _ text()print(result)f . write(result \ n )except:print( failed )If _ _ name _= _ _ main _ _ :#解析本地PDF文本,保存到本地txt with open (r e: \ parse _ PDF \ 3.pdf , rb) as pdf _ html: parse (pdf _ html,r e: \ parse _ pdf \ d.txt) #要解析网络上的pdf,请将文本保存到本地# URL= https: # PDF _ html=urllib . urlpen(URL)。 read()# dataio=stringio(pdf _ html)# parse _ pdf(dataio,r e: \ parse _ pdf)四.代码分析
TXT不像word可以随意读取内容,所以PDF本身很难读取。用程序读取PDF时,也是读取二进制的PDF,然后转换成文本。
PDF更像一张图片。PDF更像是把所有内容放在一张纸的准确位置上。大多数情况下没有逻辑结构,比如句子或者段落,也无法适应页面大小的调整。PDFMiner试图通过猜测它们的布局来重建它们的结构,但并不保证一定有效。
让我们来分解流程图:
解析PDF时有两个核心方法:PDFParse和PDFDocument,可以一起使用解析PDF。
PDFParser从文件中获取数据。
PDFDocument将文档数据结构存储在内存中。
PDFPageInterpreter解析页面内容。
Pdf将解析的内容转换成您需要的内容。
PDFResourceManager存储共享资源,如字体或图片。
1.打开本地或网络PDF
#解析本地PDF文本,保存到本地TXT用Open (r e: \ parse _ PDF \ 3.pdf , rb )作为PDF _ html: parse (pdf _ html,r e: \ parse _ pdf \ d.txt) #解析网络上的PDF,保存文本到本地# URL= 3359 # PDF _ html=URL lib 2 . URL pen(URL)。Read () # parse _ pdf (pdf _ html,r e: \ parse _ pdf) 2。建立文档分析器和相关文档。
#使用文件对象parser=PDFParser(DataIO)创建PDF文档分析器#创建PDF文档doc=PDF document()# Interconnect parser . set _ document(doc)doc . set _ parser(parser)
3.文档密码初始化
#提供初始化密码,默认不为空doc.initialize() 4。创建一个解释器。
首先创建一个资源管理器和参数分析器。
#创建一个PDF explorer来管理共享资源rsrcmagr=PDFResourceManager() #创建一个PDF parameter对象laparams=LAParams()创建一个聚合器来接收explorer和参数。
创建解释器、接收资源管理器和聚合器。
#聚合资源管理器和设备对象device=PDF page aggregator(rsrcmagr,la params=la params) #创建一个PDF解释器对象解释器=pdfpageinterpreter (rsrcmagr,device)这样页面解释器就可以对PDF文档进行编码,并将其解释为Python可以识别的格式。
5.文本获取
使用doc.get_pages()获取所有页面,然后遍历每个页面,再使用interperter页面解释器逐个聚合页面,然后调用聚合器的get_result()获取布局中的每个内容。只有文字才能提出来,写成TXT。
对于文档中的页面。get _ pages():解释器。process _ page(page)# LTPage对象layout=device.get_result() #这里的layout是一个lt page对象,其中存储了page解析的各种对象#一般有一些对象如LTTextBox、LTFigure、LTImage、LTTextBoxHorizontal等。#如果要获取文本,就得获取布局中x的text属性:try: if (isinstance (x,lttextbox horizontal)):with open( % s (save _ path), a )as f:result=x . get _ text()print(result)f . write(result \ n )except:print( Failed )五.结果分析
如果PDF仅包含文本,则可以完全解析。如果包含图片,就没有办法获取,因为pdfminer只获取PDF中的文本。如果这个PDF本身不能提取文本,那么它将在
如果doc . is _ extractable:Raise PDFTEXTRACTIONTALLOWED抛出一个异常,我在测试带水印的PDF时抛出一个异常,所以这个非常有限,可以和OCR结合使用,因为涉及到公司代码的时候OCR部分不贴。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。