Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

1. Python办公自动化

在日常工作中,很多重复性的工作可以通过Python编写程序实现自动化,从而提高工作效率。本文将介绍如何使用Python批量识别发票并录入到Excel表格中,实现办公自动化。

2. 发票识别和录入

在实现发票识别和录入之前,需要引入相关的Python库。本文使用的是Python的两个强大的库:PIL和pytesseract。

2.1 PIL库

PIL是Python Imaging Library的缩写,它是一个有关图像处理的Python库,除了基本的图像处理功能外,还提供了很多高级的处理功能。在本文中,使用PIL库来对图片进行处理。

from PIL import Image

2.2 pytesseract库

pytesseract是一个Python库,可用于OCR(Optical Character Recognition)图像识别,它可以对一张图片中的文本进行识别,并转化为字符串。在本文中,使用pytesseract库对发票图片中的文本进行识别。

注意:需要事先安装tesseract-ocr软件,以便使pytesseract库能够正常运作。

import pytesseract

2.3 发票识别

在发票识别过程中,首先需要对发票图片进行处理,使其符合识别要求。根据发票的实际情况,发票图片需要进行如下处理:

灰度化:将发票图片转化为灰度图像;

二值化:将灰度图像转化为黑白二值图像;

降噪处理:去除图像中的噪声干扰。

在处理之后,使用pytesseract库对处理后的发票图片进行识别。

# 打开发票图片

img = Image.open('invoice.jpg')

# 灰度化

img = img.convert('L')

# 二值化

threshold = 140

table = []

for i in range(256):

if i < threshold:

table.append(0)

else:

table.append(1)

img = img.point(table, '1')

# 降噪处理

img = img.filter(ImageFilter.MedianFilter())

# OCR识别

text = pytesseract.image_to_string(img, lang='chi_sim')

识别过程大致如上代码所示,其中借助ImageFilter.MedianFilter()进行降噪处理,从而去除噪声干扰,提高识别准确率。另外,使用lang参数指定当前文本的语言类型为中文汉字(简体)。

2.4 发票信息提取

在发票信息提取过程中,需要针对发票中不同的信息项进行分类提取,包括:发票代码、发票号码、开票日期、购买方名称、购买方纳税人识别号、销售方名称、销售方纳税人识别号、商品列表等。每个信息项需要使用正则表达式匹配发票字符串中对应的文本,并逐项提取。

2.5 发票信息录入

在发票信息识别和提取完成后,需要将发票信息录入到Excel表格中。Python中使用openpyxl库,打开并操作Excel表格。根据读取的发票信息将其逐项按照Excel表头的对应位置进行填写。

# 打开Excel表格

workbook = openpyxl.load_workbook('invoices.xlsx')

# 选择工作表

sheet = workbook.active

# 将发票信息逐项填写至Excel表格

row = sheet.max_row + 1

sheet.cell(row, 1, invoice_code)

sheet.cell(row, 2, invoice_number)

sheet.cell(row, 3, invoice_date)

sheet.cell(row, 4, buyer_name)

sheet.cell(row, 5, buyer_taxpayer_id)

sheet.cell(row, 6, seller_name)

sheet.cell(row, 7, seller_taxpayer_id)

在代码中,使用sheet.cell()方法根据指定的行、列数,将发票信息填写到Excel表格中。

3. 完整代码

from PIL import Image,ImageFilter

import pytesseract

import re

import openpyxl

# 处理发票图片

def process_img(path):

img = Image.open(path)

# 转换为灰度图像

img = img.convert('L')

# 二值化

threshold = 140

table = []

for i in range(256):

if i < threshold:

table.append(0)

else:

table.append(1)

img = img.point(table, '1')

# 降噪处理

img = img.filter(ImageFilter.MedianFilter())

# OCR识别

text = pytesseract.image_to_string(img, lang='chi_sim')

return text

# 提取发票信息

def extract_info(text):

# 提取发票代码

invoice_code = re.findall(r'发票代码:([A-Z0-9]+)', text)[0].strip()

# 提取发票号码

invoice_number = re.findall(r'发票号码:([A-Z0-9]+)', text)[0].strip()

# 提取开票日期

invoice_date = re.findall(r'开票日期:((\d{4}年)?\d{1,2}月\d{1,2}日)', text)[0][0].strip()

# 提取购买方名称

buyer_name = re.findall(r'名称:([\u4e00-\u9fa5]+)', text)[0].strip()

# 提取购买方纳税人识别号

buyer_taxpayer_id = re.findall(r'纳税人识别号:([A-Z0-9]+)', text)[0].strip()

# 提取销售方名称

seller_name = re.findall(r'名称:([\u4e00-\u9fa5]+)', text)[1].strip()

# 提取销售方纳税人识别号

seller_taxpayer_id = re.findall(r'纳税人识别号:([A-Z0-9]+)', text)[1].strip()

# 正则表达式提取商品列表

goods_list = re.findall(r'(([\u4e00-\u9fa5]+\d+[\u4e00-\u9fa5]+)(\d+\.\d{2})(\d+\.\d{2})(\d+\.\d{2}))', text)

# 将商品列表格式化

goods_list = [list(item) for item in goods_list]

for i in range(len(goods_list)):

goods_list[i][2] = float(goods_list[i][2])

goods_list[i][3] = float(goods_list[i][3])

goods_list[i][4] = float(goods_list[i][4])

return invoice_code, invoice_number, invoice_date, buyer_name, buyer_taxpayer_id, seller_name, seller_taxpayer_id, goods_list

# 录入发票信息至Excel表格

def write_to_excel(invoice_code, invoice_number, invoice_date, buyer_name, buyer_taxpayer_id, seller_name, seller_taxpayer_id, goods_list):

# 打开Excel表格

workbook = openpyxl.load_workbook('invoices.xlsx')

# 选择工作表

sheet = workbook.active

# 将发票信息逐项填写至Excel表格

row = sheet.max_row + 1

sheet.cell(row, 1, invoice_code)

sheet.cell(row, 2, invoice_number)

sheet.cell(row, 3, invoice_date)

sheet.cell(row, 4, buyer_name)

sheet.cell(row, 5, buyer_taxpayer_id)

sheet.cell(row, 6, seller_name)

sheet.cell(row, 7, seller_taxpayer_id)

# 填写商品列表

for i in range(len(goods_list)):

sheet.cell(row+i, 8, goods_list[i][0])

sheet.cell(row+i, 9, goods_list[i][1])

sheet.cell(row+i, 10, goods_list[i][2])

sheet.cell(row+i, 11, goods_list[i][3])

sheet.cell(row+i, 12, goods_list[i][4])

# 保存Excel表格

workbook.save('invoices.xlsx')

# 测试

if __name__ == '__main__':

# 处理发票图片

text = process_img('invoice.jpg')

# 提取发票信息

(invoice_code, invoice_number, invoice_date, buyer_name,

buyer_taxpayer_id, seller_name, seller_taxpayer_id, goods_list) = extract_info(text)

# 录入发票信息至Excel表格

write_to_excel(invoice_code, invoice_number, invoice_date, buyer_name,

buyer_taxpayer_id, seller_name, seller_taxpayer_id, goods_list)

4. 总结

通过本文的介绍,我们了解了如何使用Python批量识别发票,并将其录入到Excel表格中。这种办公自动化的方式可以大大提高工作效率,降低工作量,进一步提升工作效益。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签