Python识别二维码获取电子发票基本信息

因工作需要,每月需要对大量的电子发票重命名,命名格式为发票代码_发票号码.pdf,几经尝试,发现同样是pdf格式的电子发票,使用pdfplumber读取出来的文字信息却有很大不同,一些通行费发票可以很好地识别出全部内容,非通行费的电子发票却只能读取出一部分发票信息,而且最需要的发票代码和发票号码恰恰是读取不出来的。在网上一番查找之后,最终实现通过识别电子发票左上角的二维码来读取发票代码发票号码等基本信息并对pdf文件进行重命名。

import os
import fitz
from pyzbar.pyzbar import decode
from PIL import Image

def get_filepath(base_path):
    '''获取当前路径下所有的电子发票pdf文件路径'''
    file_paths = []
    file_names = os.listdir(base_path)
    for file_name in file_names:
        if file_name.endswith('.pdf'):
            file_paths.append(os.path.join(base_path, file_name))
    return file_paths

def rename_pdf(file_paths):
    '''逐一对所有电子发票文件左上角的二维码识别并重命名文件'''
    for file_path in file_paths:
        result = get_qrcode(file_path)
        results = list(result.split(','))
        new_name = results[2] + "_" + results[3] + ".pdf"
        new_file_path = os.path.dirname(file_path) + '\\' + new_name       
        os.rename(file_path, new_file_path)

def get_qrcode(file_path):
    '''提取pdf文件中左上角的二维码并识别'''
    pdfDoc = fitz.open(file_path)
    page = pdfDoc[0]    #只对第一页的二维码进行识别
    rotate = int(0)
    zoom_x = 3.0
    zoom_y = 3.0
    mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
    rect = page.rect
    mp = rect.tl + (rect.br - rect.tl) * 1 / 5
    clip = fitz.Rect(rect.tl, mp)
    pix = page.getPixmap(matrix=mat, alpha=False, clip=clip)
    img = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)  
    barcodes = decode(img)
    for barcode in barcodes:
        result = barcode.data.decode("utf-8")
        return result

if __name__ == '__main__':
    base_path = os.getcwd()
    all_files = get_filepath(base_path)
    rename_pdf(all_files)

虽然功能比较单一,但是不管黑猫白猫,能抓老鼠就是好猫

参考博文: https://www.cnblogs.com/new-june/p/11995496.html

  • 7
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值