python学习笔记7-读取pdf并输出到excel

本文介绍如何使用Python和pdfminer库从PDF文件中提取文本,并通过正则表达式筛选特定信息,实现PDF文件的自动化重命名及信息输出到Excel。文章详细展示了代码实现过程,包括PDF解析、信息筛选、文件重命名和数据导出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

pip3 install --upgrade setuptools

pip3 install pdfminer3k

补充:好像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.匹配大写金额

    pattern = r"[壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟][壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟,元,圆,角,万,分,百,整,零]+[壹,贰,叁,肆,伍,陆,柒,捌,玖,拾,佰,仟,元,圆,角,万,分,百,整,零]"
    num4 = re.findall(pattern, a)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值