前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >C#实战:使用腾讯云智能结构化识别服务轻松提取物流送货单信息,解决仓储物流信息录入的效率问题

C#实战:使用腾讯云智能结构化识别服务轻松提取物流送货单信息,解决仓储物流信息录入的效率问题

原创
作者头像
IT技术分享社区
发布2024-12-16 14:11:45
发布2024-12-16 14:11:45
17900
代码可运行
举报
文章被收录于专栏:IT技术分享社区IT技术分享社区
运行总次数:0
代码可运行

对于生产制造型企业来说,信息化建设是非常重要的环节,如何高效的解决信息过程中信息高效率的录入对于信息化建设的推进和人工效率的提升非常的有帮助,今天从物流环节给大家介绍一下如何通过腾讯云智能结构化识别服务轻松提取送货单的信息,通过该功能可以减少物流人员信息的录入也可以大幅度减少人工录入出错后无法排查追溯原因的困境。本文通过C#+WinForm的方式给出一个实际的案例来实现,希望对大家能有所帮助!

一、智能结构化服务介绍

官网:

https://cloud.tencent.com/product/smart-ocr?from_column=20421&from=20421

智能结构化(Smart Structure Optical Character Recognition)融合了业界顶尖的深度学习技术、图像检测技术以及OCR大模型能力,实现了对任意版式结构化信息的精准抽取。无论是规范的固定卡证还是繁杂的物流单据,它都能轻松应对,实现智能化识别。此产品通过预学习构建键值对应关系,并支持客户定制模板,从而大幅提高数据提取与录入的效率。智能结构化适用于众多场景,包括政务处理、票据核销、行业表单处理以及国际物流管理等。

二、开发完整流程

● 开通智能化服务

● 申请创建开发者密钥

● 创建C#项目编写代码集成Demo

2.1 开通智能化结构服务

首先需要使用自己的账户登录腾讯云官网,然后进入文字识别服务控制台,开通服务。

开通服务后可以通过控制台查看资源包,开通后默认有1000次的免费额度,方便大家本地开发测试,确认符合功能需求后后再去购买资源包,最后部署到生产环境使用。这个对于企业开发者还是非常有好的。

2.2 创建开发者密钥

因为需要本地调用接口集成开发,需要申请开发者密钥,然后创建开发者密钥,当然如果之前创建过的话可以忽略该步骤。创建成功之后如下:

特点注意:一定要妥善保护后自己的开发密钥,避免泄露,造成重大财产损失。

2.3 创建项目编写代码集成

首先从网络上找到一张送货单单据,具体如下图:

本次实现的是通过该单据识别图片中的:

收货单位、送货单号、客户地址、送货日期、合计 五个字段

首先打开VS2022创建一个WinForm项目,

项目名称为DeliveryNoteRecognitionDemo,具体创建如下图:

然后点击创建按钮来初始化项目。项目初始化如下:

安装腾讯云文字识别的依赖包依赖包搜索TencentCloudSDK.Ocr

安装成功后如下

接着创建一个送货单识别工具类DeliveryNoteRecognitionUtils.cs

具体代码如下:

代码语言:javascript
代码运行次数:0
复制
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TencentCloud.Common;
using TencentCloud.Common.Profile;
using TencentCloud.Ocr.V20181119;
using TencentCloud.Ocr.V20181119.Models;

namespace DeliveryNoteRecognitionDemo
{
    /// <summary>
    /// 送货单识别工具类
    /// </summary>
    public class DeliveryNoteRecognitionUtils
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="imageUrl">图片URL</param>
        /// <returns></returns>
        public static DeliveryNoteRecognitionModel Get(string imageUrl)
        {
            // 注意密钥妥善保存,避免泄露,可以放入配置文件或者数据库中
            Credential cred = new Credential
            {
                SecretId = "",
                SecretKey = ""
            };
            // 实例化一个client选项,可选的,没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            // 实例化一个http选项,可选的,没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.Endpoint = ("ocr.tencentcloudapi.com");
            clientProfile.HttpProfile = httpProfile;

            // 实例化要请求产品的client对象,clientProfile是可选的
            OcrClient client = new OcrClient(cred, "", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            SmartStructuralProRequest req = new SmartStructuralProRequest();  
            req.ImageUrl = imageUrl;         
            req.ItemNames = new string[] { "收货单位", "送货单号", "客户地址", "送货日期", "合计" };
            DeliveryNoteRecognitionModel deliveryNoteRecognitionModel = new DeliveryNoteRecognitionModel();
            // 返回的resp是一个SmartStructuralProResponse的实例,与请求对象对应
            SmartStructuralProResponse resp = client.SmartStructuralProSync(req);
            JObject jsonObject = JObject.Parse(AbstractModel.ToJsonString(resp));
            deliveryNoteRecognitionModel.Consignee = jsonObject["StructuralList"][0]["Groups"][0]["Lines"][0]["Value"]["AutoContent"].ToString();
            deliveryNoteRecognitionModel.DeliveryNoteNumber = jsonObject["StructuralList"][1]["Groups"][0]["Lines"][0]["Value"]["AutoContent"].ToString();
            deliveryNoteRecognitionModel.CustomerAddress = jsonObject["StructuralList"][2]["Groups"][0]["Lines"][0]["Value"]["AutoContent"].ToString();
            deliveryNoteRecognitionModel.DeliveryDate = jsonObject["StructuralList"][3]["Groups"][0]["Lines"][0]["Value"]["AutoContent"].ToString();
            deliveryNoteRecognitionModel.TotalAmount = jsonObject["StructuralList"][4]["Groups"][0]["Lines"][0]["Value"]["AutoContent"].ToString();
            return deliveryNoteRecognitionModel;
        }
    }
}

说明:因为json结构比较复杂,目前不采用实体的方式获取字段属性,直接根据自定义的字段顺序进行获取,大家注意获取的顺序号。避免出现获取的字段对不上。

界面设计

这里增加一个图片地址的输入框和查询按钮,另外增加一个分组展示解析结果,具体后台代码如下:

代码语言:javascript
代码运行次数:0
复制
  private void btnSearch_Click(object sender, EventArgs e)
        {
            string url = txtImageUrl.Text;
            if (string.IsNullOrWhiteSpace(url))
            {
                MessageBox.Show("请输入查询送货单图片的URL");
            }
            else
            {
                DeliveryNoteRecognitionModel model = DeliveryNoteRecognitionUtils.Get(url);
                txtAddress.Text = model.CustomerAddress;
                txtDate.Text = model.DeliveryDate;
                txtAmount.Text = model.TotalAmount;
                txtBillNo.Text = model.DeliveryNoteNumber;
                txtReceiveCompany.Text = model.Consignee;
            }
        }

界面效果如下:

调试获取请求的数据如下图:

json格式的数据

返回的json数据

代码语言:javascript
代码运行次数:0
复制
{
	"Angle": 0.0,
	"StructuralList": [{
		"Groups": [{
			"Lines": [{
				"Key": {
					"AutoName": "收货单位",
					"ConfigName": null
				},
				"Value": {
					"AutoContent": "源悦餐饮连锁有限公司",
					"Coord": {
						"LeftTop": {
							"X": 0,
							"Y": 0
						},
						"RightTop": {
							"X": 0,
							"Y": 0
						},
						"RightBottom": {
							"X": 0,
							"Y": 0
						},
						"LeftBottom": {
							"X": 0,
							"Y": 0
						}
					}
				}
			}]
		}]
	}, {
		"Groups": [{
			"Lines": [{
				"Key": {
					"AutoName": "送货单号",
					"ConfigName": null
				},
				"Value": {
					"AutoContent": "NO:HT202402040010",
					"Coord": {
						"LeftTop": {
							"X": 0,
							"Y": 0
						},
						"RightTop": {
							"X": 0,
							"Y": 0
						},
						"RightBottom": {
							"X": 0,
							"Y": 0
						},
						"LeftBottom": {
							"X": 0,
							"Y": 0
						}
					}
				}
			}]
		}]
	}, {
		"Groups": [{
			"Lines": [{
				"Key": {
					"AutoName": "客户地址",
					"ConfigName": null
				},
				"Value": {
					"AutoContent": "陕西省西安市高新技术产业开发区1000号",
					"Coord": {
						"LeftTop": {
							"X": 0,
							"Y": 0
						},
						"RightTop": {
							"X": 0,
							"Y": 0
						},
						"RightBottom": {
							"X": 0,
							"Y": 0
						},
						"LeftBottom": {
							"X": 0,
							"Y": 0
						}
					}
				}
			}]
		}]
	}, {
		"Groups": [{
			"Lines": [{
				"Key": {
					"AutoName": "送货日期",
					"ConfigName": null
				},
				"Value": {
					"AutoContent": "2024/2/4",
					"Coord": {
						"LeftTop": {
							"X": 0,
							"Y": 0
						},
						"RightTop": {
							"X": 0,
							"Y": 0
						},
						"RightBottom": {
							"X": 0,
							"Y": 0
						},
						"LeftBottom": {
							"X": 0,
							"Y": 0
						}
					}
				}
			}]
		}]
	}, {
		"Groups": [{
			"Lines": [{
				"Key": {
					"AutoName": "合计",
					"ConfigName": null
				},
				"Value": {
					"AutoContent": "¥1,733,000.00",
					"Coord": {
						"LeftTop": {
							"X": 0,
							"Y": 0
						},
						"RightTop": {
							"X": 0,
							"Y": 0
						},
						"RightBottom": {
							"X": 0,
							"Y": 0
						},
						"LeftBottom": {
							"X": 0,
							"Y": 0
						}
					}
				}
			}]
		}]
	}],
	"WordList": [],
	"RequestId": "b1c0bc85-ead7-4fd7-86e8-88683613fcce"
}

最终界面结果如下:

三、总结

通过以上案例可以借助腾讯云智能化结构服务轻松提取送货单的信息,大家如果使用的时候只需要把该服务器封装为API接口就可以轻松和其他系统进行对接集成,非常实用。当然也可以通过该案例去集成更多的场景,比如出货、发货标签的识别、质量检验单的识别、出入库单据的识别、客户发票、应付单等等各种单据的识别都可以做到。通过腾讯云智能化结构服务可以大大节省人工录入的准确率和效率。还是非常实用的,感兴趣的朋友可以自己体验一下,大家如果有问题欢迎评论区沟通交流!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、智能结构化服务介绍
  • 二、开发完整流程
    • 2.1 开通智能化结构服务
    • 2.2 创建开发者密钥
    • 2.3 创建项目编写代码集成
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档