C# 通过阿里云 API 实现企业营业执照OCR识别

 

目录

应用场景

关于阿里云企业营业执照OCR识别

开发运行环境

类设计

类属性

类方法

实现代码

创建 Company 类

调用举例 

小结


应用场景

企业营业执照犹如个人的身份证一样,是​​​​​​​工商管理机关发给企业、个体经营者的准许从事某项生产活动的凭证。在企业会员后台注册系统中,验证电子营业执照是一项常用功能,用户上传电子营业执照图片,再通过云API服务的方式进行验证及提取相关的所有信息:主要包括工商信息(如公司名称、法人姓名、经营范围等),位置信息(如二维码位置、印章位置、国徽位置等)。

自动化提取的企业工商可以提高录入效率和准确率,另外位置信息可以帮助我们截取图象做更多的业务处理。

本文将以阿里云提供的 API 服务,实现通过对上传的企业营业执照电子图片进行OCR的识别功能。

关于阿里云企业营业执照OCR识别

官方介绍其每天更新全国企业、个体工商户的数据,为营业执照的OCR识别提供基础服务。

更多信息内容请参照:企业工商数据查询、公司营业执照验证、企业信息查询验证API接口【按天更新】支持新注册企业、个体工商户【最新版】_电商_数据_CRM-云市场-阿里云

开发前请准备如下操作:

1. 注册阿里云账号。

2. 获取开发者 AppCode,后继开发会用到。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

类设计

类 Company (企业类) 设计见下表:

类属性

序号属性名类型说明
1ErrorMessagestring发生任何异常返回的错误信息
2ResultJsonstring请求返回结果Json完整数据
3anglestring图片的角度(顺时针旋转),[0, 90, 180,270]
4reg_numstring注册号,没有识别出来时返回"FailInRecognition"
5namestring公司名称,没有识别出来时返回"FailInRecognition"
6typestring公司类型,没有识别出来时返回"FailInRecognition"
7personstring公司法人,没有识别出来时返回"FailInRecognition"
8establish_datestring公司注册日期(例:证件上为"2014年04月16日",算法返回"20140416")
9valid_periodstring公司营业期限终止日期(例:证件上为"2014年04月16日至2034年04月15日",算法返回"20340415"),当前算法将日期格式统一为输出为"年月日"(如"20391130"),并将"长期"表示为"29991231",若证件上没有营业期限,则默认其为"长期",返回"29991231"
10addressstring公司地址,没有识别出来时返回"FailInRecognition"
11capitalstring注册资本,没有识别出来时返回"FailInRecognition"
12businessstring#经营范围,没有识别出来时返回"FailInRecognition"
13emblemstring#国徽位置[top,left,height,width],没有识别出来时返回"FailInDetection"
14titlestring标题位置[top,left,height,width],没有识别出来时返回"FailInDetection"
15stampstring印章位置[top,left,height,width],没有识别出来时返回"FailInDetection"
16qrcodestring二维码位置[top,left,height,width],没有识别出来时返回"FailInDetection"
17is_graystring是否是复印件
18successstring识别成功与否 true/false

类方法

ocr_business_license 方法无返回类型,调用均返回对应的类属性数据,参数见如下表格:

序号参数名类型说明
1UrlorBase64string传递完整的图片 Url 或者图片的Base64编码

本方法返回 string 类型的对应属性值(如果成功的话)。

实现代码

创建 Company 类

public class Company
{public string ResultJson="";public string ErrorMessage = "";public string angle = "";// : float, #输入图片的角度(顺时针旋转),[0, 90, 180,270]public string reg_num = "";// : string, #注册号,没有识别出来时返回"FailInRecognition"public string name = "";// : string, #公司名称,没有识别出来时返回"FailInRecognition"public string type = "";// : string, #公司类型,没有识别出来时返回"FailInRecognition"public string person="";// : string, #公司法人,没有识别出来时返回"FailInRecognition"public string establish_date = "";// string, #公司注册日期(例:证件上为"2014年04月16日",算法返回"20140416")public string valid_period = "";//: string, #公司营业期限终止日期(例:证件上为"2014年04月16日至2034年04月15日",算法返回"20340415")//    #当前算法将日期格式统一为输出为"年月日"(如"20391130"),并将"长期"表示为"29991231",若证件上没有营业期限,则默认其为"长期",返回"29991231"。public string address = "";// : string, #公司地址,没有识别出来时返回"FailInRecognition"public string capital = "";// : string, #注册资本,没有识别出来时返回"FailInRecognition"public string business = "";// string, #经营范围,没有识别出来时返回"FailInRecognition"public string emblem = "";// : string, #国徽位置[top,left,height,width],没有识别出来时返回"FailInDetection"public string title = "";// : string, #标题位置[top,left,height,width],没有识别出来时返回"FailInDetection"public string stamp = "";// : string, #印章位置[top,left,height,width],没有识别出来时返回"FailInDetection"public string qrcode = "";// : string, #二维码位置[top,left,height,width],没有识别出来时返回"FailInDetection"public string is_gray = "";//: false,   #是否是复印件public string success="";// : bool, #识别成功与否 true/falsepublic void ocr_business_license(string UrlorBase64){string host = "https://dm-58.data.aliyun.com";string path = "/rest/160601/ocr/ocr_business_license.json";string method = "POST";String appcode = "您的AppCode";String querys = "";String bodys = "{\"image\":\""+UrlorBase64+"\"}"; String url = host + path;HttpWebRequest httpRequest = null;HttpWebResponse httpResponse = null;if (0 < querys.Length){url = url + "?" + querys;}if (host.Contains("https://")){ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);httpRequest = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));}else{httpRequest = (HttpWebRequest)WebRequest.Create(url);}httpRequest.Method = method;httpRequest.Headers.Add("Authorization", "APPCODE " + appcode);if (0 < bodys.Length){byte[] data = Encoding.UTF8.GetBytes(bodys);using (Stream stream = httpRequest.GetRequestStream()){stream.Write(data, 0, data.Length);}}try{httpResponse = (HttpWebResponse)httpRequest.GetResponse();}catch (WebException ex){ErrorMessage = ex.Message;httpResponse = (HttpWebResponse)ex.Response;return;}Stream st = httpResponse.GetResponseStream();StreamReader reader = new StreamReader(st, Encoding.GetEncoding("utf-8"));ResultJson = (reader.ReadToEnd());if (ResultJson.IndexOf("\"success\":true") == -1&& ResultJson.IndexOf("\"success\":false")==-1){return;}Newtonsoft.Json.Linq.JObject jsonObj = Newtonsoft.Json.Linq.JObject.Parse(ResultJson);angle = jsonObj["angle"].ToString();reg_num = jsonObj["reg_num"].ToString();name = jsonObj["name"].ToString();type = jsonObj["type"].ToString();person = jsonObj["person"].ToString();establish_date = jsonObj["establish_date"].ToString();valid_period = jsonObj["valid_period"].ToString();capital = jsonObj["capital"].ToString();business = jsonObj["business"].ToString();emblem = jsonObj["emblem"].ToString();title = jsonObj["title"].ToString();stamp = jsonObj["stamp"].ToString();qrcode = jsonObj["qrcode"].ToString();is_gray = jsonObj["is_gray"].ToString();success = jsonObj["success"].ToString();}
}

调用举例 

调用判断 success 字段是否为true,为true则表示成功,继续输出具体值。

示例代码如下:

string result_base64 = ImgToBase64String("d:\\1.jpg", true);
Company cp = new Company();
cp.ocr_business_license(result_base64);
if (cp.success == "true")
{Response.Write("图片的角度:" + cp.angle + "<br>");Response.Write("注册号:" + cp.reg_num + "<br>");Response.Write("公司名称:" + cp.name + "<br>");Response.Write("公司类型:" + cp.type + "<br>");Response.Write("公司法人:" + cp.person + "<br>");Response.Write("公司注册日期:" + cp.establish_date + "<br>");Response.Write("公司营业期限终止日期:" + cp.valid_period + "<br>");Response.Write("公司地址:" + cp.bussiness + "<br>");Response.Write("注册资本:" + cp.capital + "<br>");Response.Write("经营范围:" + cp.bussiness + "<br>");Response.Write("国徽位置:" + cp.emblem + "<br>");Response.Write("标题位置:" + cp.title + "<br>");Response.Write("印章位置:" + cp.stamp + "<br>");Response.Write("二维码位置:" + cp.qrcode + "<br>");Response.Write("是否是复印件:" + cp.bussiness + "<br>");
}
else
{Response.Write("错误信息:" + cp.ErrorMessage + "<br>");Response.Write("JSON返回信息:" + cp.ResultJson + "<br>");
}

小结

调用云接口服务需要费用,我们需要根据实际应用进行成本考虑,官方说明如果查询失败则不扣除费用,具体内容可参考本文第二小节关于阿里云关于阿里云企业营业执照OCR识别API中的链接。

 如何获取图像 base64 数据的方法请参照我的文章:《C# 自动填充文字内容到指定图片》

感谢您的阅读,希望本文能够对您有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux无网环境实现nginx免安装

需要用到的免安装文件可以通过下面链接下载 https://download.csdn.net/download/zzchances/89164996 安装sh脚本如下: #!/bin/bash # 当前目录 base=$(cd `dirname $0`;pwd) # 检查 /etc/nginx 目录是否存在,如果不存在则创建 if [ ! -d "/etc/nginx" ]; then …

Ribbon饥饿加载

Ribbon默认开启的是懒加载&#xff0c;在第一次访问的时候才会进行创建LoadBalanceClient,请求时间会很长。而饥饿模式会在项目启动的是后就创建&#xff0c;降低第一次访问时的功耗&#xff0c; 开启Ribbon饥饿加载 ribbon:eager-load:enbled: true#配置单个clients: userse…

干货:一篇文章让你掌握用户运营 沈阳新媒体运营培训

用户对于产品的重要性不言而喻&#xff0c;而用户运营作为最接近用户的一环&#xff0c;自然而然受到了各大互联网公司的重视。想要掌握用户运营&#xff0c;必须得先知道其市场需求和主要技能&#xff0c;本文从这两个方面对用户运营展开了分析拆解&#xff0c;梳理用户运营的…

Unity DOTS 1.0 (5) Baking System、Baking phases 和 Baking World

Baking System 一个 baking system在处理数据的方式上不同于baker。和baker一个一个处理components不同&#xff0c;它是进行批处理的&#xff0c;并且它可以经由job 和burst 大幅提升处理性能。baking system是在entity创建完成后运行&#xff0c;所以它可以访问到所有初始创…

实现printf功能代码效果

1、使用 vsnprintf 模拟 printf 功能 非宏定义情境下&#xff0c;可以用作开启通讯口调试功能 实际上是通过 vsnprintf 将接收到的 format格式化后解析到缓存区&#xff0c;这里存在缓存区大小限制&#xff0c;以及代码大小区别 #include <stdarg.h> #include "std…

Docker 备忘清单(二)

1、Docker 容器 1.1、启动和停止 docker start nginx-server 开始 docker stop nginx-server 停止 docker restart nginx-server 重启 docker pause nginx-server 暂停 docker unpause nginx-server 取消暂停 docker wait nginx-server 阻塞容器 docker kill nginx-server 发…

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

探索常见经典目标检测算法:从YOLO到Faster R-CNN

目标检测是计算机视觉领域中的重要任务之一&#xff0c;它旨在从图像或视频中检测出目标的位置和类别。随着深度学习技术的发展&#xff0c;许多经典的目标检测算法相继出现&#xff0c;其中包括YOLO&#xff08;You Only Look Once&#xff09;、Faster R-CNN&#xff08;Regi…

Chrome为什么不用COOKIE

Chrome浏览器并不是完全不使用cookie&#xff0c;而是对第三方cookie的处理方式进行了调整。Chrome允许用户根据需要选择是否允许第三方cookie&#xff0c;或者在无痕模式下阻止它们。这样的设计旨在平衡用户体验、网站功能和隐私保护。 第三方cookie是在用户访问一个网站时&a…

parallels desktop 19密钥分享 附PD虚拟机安装教程 支持M/intel

PD19虚拟机安装破解教程 Parallels Desktop 百度网盘下载&#xff1a;https://pan.baidu.com/s/1ezQmJAjIx796NEr9WZbcOg 提取码: 8w61 &#xff08;地址容易失效&#xff0c;来之不易&#xff0c;务必点赞和收藏&#xff0c;如果失效了请到评论区留言反馈&#xff09; 注意&…

VPP 源码学习总结

当我们在VPP/plugins目录下注册了自己的node后&#xff0c; 肯定有一个node.func(), 那这个函数是如何执行到的呢&#xff1a; 1. 首先我们要看一下这个插件注册的时候做了什么&#xff0c; 假设node 如下&#xff1a; 编译成功后&#xff0c; 我们可以从函数vlib_plugin_earl…

Telegram mini app 登录小部件 | 自定义登录按钮 或 静默登录

先说我遇到的问题&#xff0c;我按照流程接入了 telegram 登录小部件&#xff0c;在 PC 或者 H5 可以拿到数据&#xff08;不管是选择回调函数还是回调地址的形式都可以&#xff09;&#xff0c;但是在 telegram mini app 中登录拿不到数据&#xff0c;在 telegram 中 我点击登…

常见排序算法(Java代码实现)

前言 学习算法和数据结构必备算法逻辑动态演示网站&#xff0c;收藏到就是赚到&#xff0c;链接: 数据结构动态演示网站 下面的代码单独理解会比较抽象&#xff0c;建议结合动态演示学习&#xff0c;更加直观 常见排序算法&#xff08;时间复杂度&#xff09; O(n^2)&#x…

【Nginx】(三) Nginx配置文件精解:从入门到精通的完整指南

Nginx&#xff0c;作为一款功能强大的 Web 服务器和反向代理软件&#xff0c;已经成为实现这些目标的行业标准。然而&#xff0c;Nginx的强大功能往往伴随着复杂的配置需求。对于想快速掌握 Nginx 配置的人来说&#xff0c;理解其配置文件的结构至关重要。 在本文中&#xff0…

RabbitMQ笔记(基础篇)

视频&#xff1a; MQ基础-01.RabbitMQ课程介绍_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1mN4y1Z7t9?p1&vd_sourced0ea58f1127eed138a4ba5421c577eb1 一、RabbitMQ简介 1.同步调用 优势&#xff1a;时效性强&#xff0c;等待结果后才返回 劣势&#xff1…

虚拟化与Docker基本概念与Docker的安装

Docker Docker 是一个开源的应用容器引擎&#xff0c;它最初是用 Go 语言开发的。Docker 允许开发者将应用程序及其依赖、库和环境打包到一个可移植的容器中&#xff0c;这个容器可以在任何支持 Docker 的 Linux 或 Windows 机器上运行&#xff0c;保证了应用在不同环境之间的…

【行为型模式】备忘录模式

一、备忘录模式概述 备忘录模式定义&#xff1a;又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern)&#xff0c;是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;这样我们就可以在需要的时候将该对…

STM32几种库的比较,HAL、标准库、LL库!

STM32是一系列由STMicroelectronics公司生产的微控制器系列。它们基于ARM Cortex-M内核&#xff0c;提供了广泛的性能和功能。STM32系列拥有多个型号和系列&#xff0c;每个型号都有不同的特性和功能。 STMicroelectronics提供了名为STM32Cube的软件生态系统&#xff0c;其中包…

【14-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

InstantMesh:利用稀疏视图大规模重建模型从单张图像高效生成3D网格

作者&#xff1a;Jiale Xu&#xff0c;Weihao Cheng&#xff0c;Yiming Gao等 编译&#xff1a;东岸因为一点人工一点智能 InstantMesh&#xff1a;利用稀疏视图大规模重建模型从单张图像高效生成3D网格在这项工作中&#xff0c;我们提出了InstantMesh&#xff0c;一个开源的…