# invoiceocr **Repository Path**: lucky_cube/invoiceocr ## Basic Information - **Project Name**: invoiceocr - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 12 - **Created**: 2025-04-17 - **Last Updated**: 2025-04-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 批量识别增值税发票 发票识别这项技术早已集成在很多企业的报销系统中了,这似乎不是什么新鲜玩意。 但是对于审计来说,这些都是不能使用的,为啥?还不是因为穷嘛。 怎么办?自己动手,丰衣足食! 之前我有好几次在探索免费的方案,之前看过百度提供的API。 ![baidu](pictures/baidu.jpeg) 但是调用是有次数限制的。对于我的工作IT审计来说,要做那肯定是需要对几万、几十万以上的发票进行核查。这肯定不行的。 只能去找开源的ocr项目,之前看到了paddleocr发现可以很好的识别发票。 ![paddleocr](pictures/paddleocr.png) 但当时我感觉这个是非结构化的文本,而想要提取出我想要的关键信息,似乎没有想好怎么做。 直到我前天逛B站的时候,看到这个UP主的思路: https://www.bilibili.com/video/BV1JK4y1M7Sd 直接用正则表达式把公司名称、金额、发票号等信息提取出来不就完了吗? 终于跳出了想结构化数据的困境。 > Talk is cheap, show me your code. 代码我们一共分两步: 1. 将PDF转成PNG图片。 2. 利用paddleocr识别图片信息 ## PDF转PNG图片 需要安装fitz和PyMuPDF两个包: ```bash pip install fitz PyMuPDF ``` `pdf2img.py`文件代码: ```python import sys, fitz, os, datetime def pyMuPDF_fitz(pdf_path, image_path): pdfDoc = fitz.open(pdf_path) base_name = os.path.basename(pdf_path) pdf_name = os.path.splitext(base_name)[0] if pdfDoc.pageCount == 1: flag = True else: flag = False for pg in range(pdfDoc.pageCount): page = pdfDoc[pg] rotate = int(0) # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。 # 此处若是不做设置,默认图片大小为:792X612, dpi=96 zoom_x = 2 #(1.33333333-->1056x816) (2-->1584x1224) zoom_y = 2 mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate) pix = page.getPixmap(matrix=mat, alpha=False) if not os.path.exists(image_path):#判断存放图片的文件夹是否存在 os.makedirs(image_path) # 若图片文件夹不存在就创建 if flag: image_name = pdf_name + '.png' else: image_name = pdf_name + '_%s.png' % pg image_path = os.path.join(image_path,image_name) pix.writePNG(image_path)#将图片写入指定的文件夹内 if __name__ == "__main__": pdfPath = './TJB/餐饮94.pdf' imagePath = './img' pyMuPDF_fitz(pdfPath, imagePath) ``` 函数`pyMuPDF_fitz(pdf_path, image_path)`会将给定的pdf文件夹的文件转换为png图片并保存到image_path文件夹下。 > 代码来源:https://www.jianshu.com/p/f57cc64b9f5e ## paddleocr识别发票信息 需要安装`paddleocr`包: ```bash pip install paddleocr ``` 编写`ocr.py`文件代码: ```python from paddleocr import PaddleOCR import re from PIL import Image import pandas as pd def invoice_ocr(path): result = PaddleOCR().ocr(path) inform = [] for line in result: inform.append(line[1][0]) String2 = '【' + '】【'.join(inform) + '】' print(String2) if '发' in String2 or '票' in String2: print('yes') else: print('no') im = Image.open(path) out = im.transpose(Image.ROTATE_180) out.save(path) result = PaddleOCR().ocr(path) inform = [] for line in result: inform.append(line[1][0]) String2 = '【' + '】【'.join(inform) + '】' # 发票号码 try: number = re.findall('(?