当前位置:   article > 正文

python学习笔记7-读取pdf并输出到excel_用python实现对pdf文本的读取并按句划分作为一列输出一个excel

用python实现对pdf文本的读取并按句划分作为一列输出一个excel

遇到个需求要读取pdf里面的内容,看看能不能整,百度了下可以用pdfminer。

参考:https://jingyan.baidu.com/article/ceb9fb10a5da888cad2ba03b.html
注意,py3.8不要直接pip install pdfminer或者pdfminer3k,我试了不行。
win下在cmd里用下面的方式可以

pip3 install --upgrade setuptools

pip3 install pdfminer3k
  • 1
  • 2
  • 3

补充:好像pdfminer3k更新了,使用方法有所变动,如果下面的代码不能使用,就做以下修改:
1.更改引用
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage

2.更改页面读取方式:
doc = PDFDocument(parser)

for page in PDFPage.create_pages(doc):

搞定了初级代码,虽然不完善,比如没有异常处理什么的,但也能用了,按照上面的装好,据说是能读图片的,但是这次只用读文字,这里的需求是遍历目录找到pdf,抽取其中的某些字段然后用于重命名该pdf。
下面是代码:(后面已补充输出到excel的方法)

import os, sys
import re
import time
import xlsxwriter 
import logging		#暂时没用
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams, LTTextBox, LTTextLine
#关闭日志向上传送
logging.propagate = False
#设置日志级别
logging.getLogger().setLevel(logging.ERROR)

#获取指定路径下所有pdf文件list
#def get_all_pdf(path):
#    return [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f)) and f.endswith('.pdf')]

#解析pdf并返回解析字串
def pdfreader(input_path):
    with open(input_path,'rb') as fd:
        #创建一个pdf解析器
        prase=PDFParser(fd)
        #创建一个pdf文档
        doc = PDFDocument()
        #互相连接
        prase.set_document(doc)
        doc.set_parser(prase)
        #检查文本是否可以提取
        #doc初始化,不初始化的话下面的if就会报错。
        doc.initialize("")
        if not doc.is_extractable:
            print("PDFTextExtractionNotAllowed")
        else:
            #创建一个pdf管理器
            resmgr  = PDFResourceManager()
            #创建一个PDF参数分析器:LAParams
            laparams = LAParams()
            #设置文本边界
            laparams.char_margin = 1.0
            laparams.word_margin = 1.0
            #创建聚合器,用于读取文档的对象:PDFPageAggregator
            device = PDFPageAggregator(resmgr, laparams=laparams)
            #创建解释器,对文档编码,解释成Python能够识别的格式:PDFPageInterpreter
            interpreter = PDFPageInterpreter(resmgr,device)
            #创建一个空的提取文本对象
            extracted_text = ''
            #doc.get_pages()可以提取页面
            for page in doc.get_pages():
                #利用解释器的process_page()方法解析读取单独页数
                interpreter.process_page(page)
                #这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象
                layouts = device.get_result()
                #每一个LTTextBOX或者LTTextLine都输出到extracted_text
                for out in layouts:
                    if isinstance(out, LTTextBox) or isinstance(out, LTTextLine):
                        extracted_text += out.get_text()
            print(extracted_text)
            return extracted_text

#对解析的pdf文件进行筛选,找出需要的字串
def pdf_screen(pdfinfo):
    #筛选条件,不太会正则匹配,这里是试出来的条件
    pattern = re.compile('号码No\.+\n+\w[A-Za-z0-9_-]+\w')
    pattern2 = re.compile('合同(批文)号\n+\w[A-Za-z0-9_-]+\w')
    #筛选
    if re.findall(pattern, pdfinfo):
        #二次筛选,通过换行符进行拆分
        namenum1 = str(re.findall(pattern, pdfinfo)[0]).split('\n')[1]
    else: namenum1='未匹配到1'
    if re.findall(pattern2, pdfinfo):
        namenum2 = str(re.findall(pattern2, pdfinfo)[0]).split('\n')[1]
    else: namenum2='未匹配到2'
    return namenum1,namenum2

#另一种一种判断后缀名的方法
#def is_suffix_pdf(suffix: str):
#    if suffix == '.pdf':
#        return True
#    return False


#利用筛选的信息给pdf重命名
def pdfrename(path):
    num=10
    oldpdflist=[]
    newpdflist=[]
    # 遍历指定文件夹寻找pdf文件清单
    #存放数据
    t1 = []
    t2 = []
   
    for root,dirs,files in os.walk(path):
        for name in files:
            #name2,suffix=os.path.splitext(name)
            #if is_suffix_pdf(suffix):
                #pdflist.append(name)
                #print(pdflist)
            if name.endswith('.pdf'):
                #保险起见存个原名,虽然也没啥用,需要的话可以输出。
                oldpdflist.append(name)
                #读取这个pdf
                tt=pdfreader(os.path.join(root,name))
                #筛选
                namenum1,namenum2=pdf_screen(tt)
                #改名
                oldname= os.path.join(root,name)
                newname= os.path.join(root,str(namenum2)+str(namenum1)+str(num)+'.pdf')

                newpdflist.append(str(namenum2)+str(namenum1)+str(num)+'.pdf')

                if oldname!=newname:
                    os.rename(oldname,newname)
                num+=num
                print(newname,end='\n')
                t1.append(namenum1)
                t2.append(namenum2)
                
                
        #因为是补充的也不知道对没对齐,反正是和for一列的
        #创建excel
        workbook = xlsxwriter.Workbook('output.xlsx')
        #设置表名
        worksheet = workbook.add_worksheet('pdf')
        #设置列宽
        worksheet.set_column('A:D', 30)
        #设置标题
        worksheet.write('A1' , '号码')
        worksheet.write('B1' , '合同号')
        worksheet.write('C1', '日期')
        #插入数据
        for i in range(0,len(t1)):

            worksheet.write('A'+str(i+2), t1[i])
            worksheet.write('B' + str(i+2), t2[i])

        workbook.close()

    return newpdflist

if __name__=='__main__':
	#设定需要处理的文件夹
    dopdf = pdfrename(r'E:\新建文件夹')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143

简单模版
1.匹配大写金额

    pattern = r"[壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟][壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟,元,圆,角,万,分,百,整,零]+[壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟,元,圆,角,万,分,百,整,零]"
    num4 = re.findall(pattern, a)
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51539?site
推荐阅读
相关标签
  

闽ICP备14008679号