解析PDF文件以及解决编码问题
1、解析pdf文件
最近需要将pdf中文本提取出来,于是就了解了一下pdfminer
首先安装:pip3 install pdfminer3k
之后就是用pdfminer解析,不多说,直接上代码,这些代码都是参考各位前辈
from pdfminer.pdfparser import PDFParser,PDFDocument
from pdfminer.pdfinterp import PDFResourceManager,PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal,LAParams,LTImage
import os
path=''
def pdf_to_word(folder,password):
#获取指定目录下的所有文件
files=os.listdir(folder)
pdfFiles=[f for f in files if f.endswith('.pdf')]
#获取pdf类型的文件,放到一个列表中
for pdfFile in pdfFiles:
print(pdfFile)
#将目录和文件合并成一个路径 os.path.join('root','test','runoob.txt') ##root/test/runoob.txt
# pdfPath=os.path.join(folder,pdfFile)
#设置将要转换后存放word文件的路径
# wdPath=pdfPath
#判断是否已经存在对应的文件,如果不存在就加入到存放的路径中去
# if wdPath[-4:]!='.docx':
# wdPath=wdPath+'.docx'
fn=open(path+"/{}".format(pdfFile),'rb')
#创建一个PDF文本档分析器:PDFParser
parser=PDFParser(fn)
#创建一个PDF文档:PDFDocumeng
doc=PDFDocument()
#链接分析器与文档
parser.set_document(doc)
doc.set_parser(parser)
#提供出事话的密码,如果没有密码,输入空字符串
doc.initialize('')
#检测文档是否提供txt转换,不提供就直接忽略
if not doc.is_extractable:
print('PDFTextExtractionNotAllowed')
else:
#创建PDF资源管理器:PDFResourceManager
resource=PDFResourceManager()
#创建一个PDF参数分析器:;AParams
laparams=LAParams()
#创建聚合器,用于读取文档的对象:PDFPageAggregator
device=PDFPageAggregator(resource,laparams=laparams)
#创建解释器,对文档编码,解释成python能够识别的格式:PDFPageInterpreter
interpreter=PDFPageInterpreter(resource,device)
#doc.get_pages()是获取page列表的一个方法
num_page,num_image,num_Text=0,0,0
for page in doc.get_pages():
pdf_str=''
#利用解释器的peocess_page()方法解析单独页数
interpreter.process_page(page)
layout=device.get_result()
for out in layout:
if isinstance(out,LTTextBoxHorizontal):
num_Text+=1
print(type(out.get_text()))
pdf_str+=out.get_text().strip()
if isinstance(out,LTImage):
num_image+=1
print(pdf_str)
# with open(wdPath,'a',encoding='utf-8') as f:
# f.write(out.get_text()+'\n')
if __name__=='__main__':
pdf_to_word(path,'')
2、解决编码问题
如果首次这样运行的话,会输出两行文字:
WARNING:root:GBK2K-H
WARNING:root:GBK2K-v
我的平台是ubuntu
我这边是在路径下放了两个pdf文件,一个pdf中是文本,另一个是Image
所以就继续找原因,后面发现是编码问题。
pdfminer3k不能解析特殊字体,需要下载相应的字体包来解决
字体包下载链接:https://github.com/euske/pdfminer/pull/71/commits/2103e5875ef04cfaf424b25d2fd0dc9535a90714#diff-11a7e5c9b1cb16f0ae7d0276f643956d
这里有很多的字体包,看看你的警告是属于哪种字体,就下载相应的字体包。
下载完成之后,不要解压直接放在 pdfminer/cmap文件夹下
pdfminer/cmap文件夹:我的这个是通过pip安装的,找到自己的python包,进去找到里面的相关文件夹就可以了。
再次运行。发现不报刚刚的警告了。但是有了新的问题
然后下面就会以有一堆的cid:xxx
着说明编码问题已经解决了,现在需要的解码。同样的在上面的链接找到图片中相应解码包,这里需要的就是
再以同样的方法保存到同样的位置就可以了。然后就完美的输出文本了。