解析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包,进去找到里面的相关文件夹就可以了。
再次运行。发现不报刚刚的警告了。但是有了新的问题
解析PDF文件以及解决编码问题
然后下面就会以有一堆的cid:xxx
着说明编码问题已经解决了,现在需要的解码。同样的在上面的链接找到图片中相应解码包,这里需要的就是
解析PDF文件以及解决编码问题
再以同样的方法保存到同样的位置就可以了。然后就完美的输出文本了。