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表格中。这种办公自动化的方式可以大大提高工作效率,降低工作量,进一步提升工作效益。