您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

如何使用 Java 对收据的照片执行 OCR

时间:2022-07-15 11:48:45  来源:  作者:qaseven

本文的目的是演示一个专门设计用于对收据照片执行OCR(光学字符识别)操作并自动从中提取关键业务信息的 API,例如企业名称和地址、电话号码、收据总额等等。在页面的下方,我提供了代码示例和说明来帮助您在JAVA中构建 API 调用。

经营企业有数十种成本,管理这些成本的工作在复杂性上各不相同。虽然办公室租金、工资和供应商合同等公司支出是内部团队(即应付账款)可以直接处理的周期性和可管理的发票,但以客户晚餐、出租车乘车和团队郊游形式的员工支出需要公司报销,这只能通过员工交易的证明来完成。对于员工而言,证明此类交易需要向企业出示收据。除了显示最重要的外出总费用外,收据还提供员工企业可以验证的其他有用信息,包括员工访问的场所名称、网站、地址、电话号码、以及在该地点购买的特定商品或服务的清单。然而,尽管收据费用流程看似简单,但它往往存在重大技术缺陷:大多数企业已经完全数字化了他们的工资和费用程序,而收据仍然经常以硬拷贝形式获得。因此,将实物收据转换为数字形式提出了相关的业务技术挑战。

在高层次上,光学字符识别是指将硬拷贝文本内容数字化为数据可以很容易地在数据库中存储、查询和传输。为了实现数字化,文档的扫描或拍照图像由 OCR API/应用程序处理,并通过识别算法挑选出文档上的字符。文档的每一页都被分解成不同的组成部分(文本块、表格、图像等),这些部分中的每个字母都以数字方式重新创建,或者通过与一组存储的字母或数字字符进行比较,或者通过识别独特的形状/特征。毫无疑问,将 OCR 纳入世界各地的企业有助于提高工作流程效率。它不仅降低了数据输入服务的间接成本,而且还增强了具有硬拷贝来源的数据的可访问性。更远,

在智能手机之前,使用笨重的办公室扫描设备扫描文档是为 OCR 目的(或用于对象存储)创建文档数字副本的最常用方法。如今,随着手持智能手机的大量流通以及对远程工作的文化接受度不断提高,手机摄像头已成为 OCR 极其相关的 diy(自己动手)工具。从个人设备拍摄文档的粗略照片并将这些照片直接发送给相关利益相关者现在被认为是许多专业交易的标准做法,包括收据费用。

在可以通过个人设备为 OCR 拍照的文件中,收据是最明显的受益者之一。它们几乎不会在方便的时候收集:我们经常在离开出租车、走出餐厅或手拿一袋袋商品离开购物中心时收到收据。此外,收据通常由脆弱的材料制成,并且比大多数其他实物文件更容易损坏(如果它们没有得到充分维护)。这使得成功存储和移交实物收据副本的过程比我们收到的大多数其他实物文件更难,这些实物文件可能会被层压或整齐地塞在马尼拉信封中。为 OCR 拍摄收据的快速照片并将照片直接发送到相关费用处理应用程序的能力意味着减轻员工在较长时间内管理物理文档的负担。这种便利性极大地提高了费用处理效率,确保收据可以通过单一入口点汇集,既可以作为对象(例如,JPG 或 PNG 等照片文件)存储,也可以作为单独文档/应用程序中的可搜索文本存储。

使用 Cloudmersive Receipt OCR API 为您的业务包含收据 OCR 服务非常简单。该API支持数十种常用语言(包括英文、阿拉伯文、中文等),输出收据中包含的所有重要信息,包括收据时间戳、商家名称、商家网址、商家地址、商家电话号码、收据项目(包括每件商品的描述和价格),以及收货总额和小计。API 可以选择性地配置为包括高级识别和手写识别模式,并且您可以选择打开一个可选的预处理模式,该模式将在操作发生之前自动增强图像(这将纠正一些可能发生的小错误,同时拍摄原始照片)。以下,

首先,我们首先需要使用 Maven 安装 SDK 包。为此,我们首先在 pom.xml 中添加对存储库的引用:

XML

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

 

接下来,我们来引用 pom.xml 中的依赖:

XML

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

 

安装完成后,我们可以在文件顶部包含导入:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ImageOcrApi;

 

然后,我们可以使用下面的代码示例调用 Receipt OCR 函数。在这个阶段,您需要布置一些参数并决定您希望包含哪些可选功能。您的参数包括以下内容:

  1. 您要执行操作的输入文件
  2. 您的 Cloudmersive API 密钥(可以通过在我们的网站上注册一个免费帐户来获得,该帐户将提供每月 800 次 API 调用的限制)

您的可选功能包括以下内容:

  1. recognitionMode通过设置等于字符串来启用高级识别模式Advanced。
  2. recognitionMode通过设置等于字符串来启用手写识别模式EnableHandwriting。
  3. String Language通过设置等于包含首选语言的三字母标识符的字符串来设置语言(默认选项是英语) 。
  4. string preprocessing通过设置等于启用预处理(默认为禁用)Advanced。

 

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ImageOcrApi apiInstance = new ImageOcrApi();
File imageFile = new File("/path/to/inputfile"); // File | Image file to perform OCR on.  Common file formats such as PNG, JPEG are supported.
String recognitionMode = "recognitionMode_example"; // String | Optional, enable advanced recognition mode by specifying 'Advanced', enable handwriting recognition by specifying 'EnableHandwriting'.  Default is disabled.
String language = "language_example"; // String | Optional, language of the input document, default is English (ENG).  Possible values are ENG (English), ARA (Arabic), ZHO (Chinese - Simplified), ZHO-HANT (Chinese - Traditional), ASM (Assamese), AFR (Afrikaans), AMH (Amharic), AZE (Azerbaijani), AZE-CYRL (Azerbaijani - Cyrillic), BEL (Belarusian), BEN (Bengali), BOD (Tibetan), BOS (Bosnian), BUL (Bulgarian), CAT (Catalan; Valencian), CEB (Cebuano), CES (Czech), CHR (Cherokee), CYM (Welsh), DAN (Danish), DEU (German), DZO (Dzongkha), ELL (Greek), ENM (Archaic/Middle English), EPO (Esperanto), EST (Estonian), EUS (Basque), FAS (Persian), FIN (Finnish), FRA (French), FRK (Frankish), FRM (Middle-French), GLE (Irish), GLG (Galician), GRC (Ancient Greek), HAT (Hatian), HEB (Hebrew), HIN (Hindi), HRV (Croatian), HUN (Hungarian), IKU (Inuktitut), IND (Indonesian), ISL (Icelandic), ITA (Italian), ITA-OLD (Old - Italian), JAV (Javanese), JPN (Japanese), KAN (Kannada), KAT (Georgian), KAT-OLD (Old-Georgian), KAZ (Kazakh), KHM (Central Khmer), KIR (Kirghiz), KOR (Korean), KUR (Kurdish), LAO (Lao), LAT (Latin), LAV (Latvian), LIT (Lithuanian), MAL (Malayalam), MAR (Marathi), MKD (macedonian), MLT (Maltese), MSA (Malay), MYA (Burmese), NEP (Nepali), NLD (Dutch), NOR (Norwegian), ORI (Oriya), PAN (Panjabi), POL (Polish), POR (Portuguese), PUS (Pushto), RON (Romanian), RUS (Russian), SAN (Sanskrit), SIN (Sinhala), SLK (Slovak), SLV (Slovenian), SPA (Spanish), SPA-OLD (Old Spanish), SQI (Albanian), SRP (Serbian), SRP-LAT (Latin Serbian), SWA (Swahili), SWE (Swedish), SYR (Syriac), TAM (Tamil), TEL (Telugu), TGK (Tajik), TGL (Tagalog), THA (Thai), TIR (Tigrinya), TUR (Turkish), UIG (Uighur), UKR (Ukrainian), URD (Urdu), UZB (Uzbek), UZB-CYR (Cyrillic Uzbek), VIE (Vietnamese), YID (Yiddish)
String preprocessing = "preprocessing_example"; // String | Optional, preprocessing mode, default is 'None'.  Possible values are None (no preprocessing of the image), and 'Advanced' (automatic image enhancement of the image before OCR is Applied; this is recommended and needed to handle rotated receipts).
try {
    ReceiptRecognitionResult result = apiInstance.imageOcrPhotoRecognizeReceipt(imageFile, recognitionMode, language, preprocessing);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ImageOcrApi#imageOcrPhotoRecognizeReceipt");
    e.printStackTrace();
}

 

一旦您配置了可选功能,您的 API 调用就完成并准备好进行测试。下面,我提供了一个示例 API 响应模型 JSON 供您参考:

JSON

{
  "Successful": true,
  "Timestamp": "2022-07-14T14:33:18.565Z",
  "BusinessName": "string",
  "BusinessWebsite": "string",
  "AddressString": "string",
  "PhoneNumber": "string",
  "ReceiptItems": [
    {
      "ItemDescription": "string",
      "ItemPrice": 0
    }
  ],
  "ReceiptSubTotal": 0,
  "ReceiptTotal": 0
}

 

为了进一步提高 OCR 图像的质量,我建议深入研究预处理API 并测试可能解决最常见问题的那些。例如,在 OCR 照片中,在深色背景上以小角度查看文档是很常见的。借助有效的预处理服务,您可以自动检测这些角度并自动校正它们,从而确保您的 OCR 应用程序以尽可能高的准确度检测文本。



Tags: OCR   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文的目的是演示一个专门设计用于对收据照片执行OCR(光学字符识别)操作并自动从中提取关键业务信息的 API,例如企业名称和地址、电话号码、收据总额等等。在页面的下方,我提供...【详细内容】
2022-07-15  Tags: OCR  点击:(117)  评论:(0)  加入收藏
一直在写东西,有时候会遇到这种需求,就是把图片上的文字拷贝到自己的文章中,所以写了这个小工具。 配合Snipaste使用天衣无缝,所有的东西都在剪切板里交换,即Snipaste截取的图片...【详细内容】
2021-08-30  Tags: OCR  点击:(312)  评论:(0)  加入收藏
文字 OCR 识别技术现在已经相当成熟了,无论 其 准确度还是识别速度 都能够满足我们的日常需要;今天给大家介绍一个 Python 包,该包的主要功能就是用于 OCR 识别的,包的名字叫 Py...【详细内容】
2021-04-16  Tags: OCR  点击:(401)  评论:(0)  加入收藏
▌简易百科推荐
本文将介绍接下来的技巧和主题: 在包装器上使用基元字段(例如,布尔值 ->布尔值) 减少形成平面结构的类的数量(在一个或多个类中折叠类) 尽可能使用窄数据类型(例如,代替,代替等)short...【详细内容】
2022-11-02  一个即将退役的码农  今日头条  Tags:Java   点击:(1)  评论:(0)  加入收藏
原因:最近在用Sqlite存储数据,因涉及数据安全,所以需要数据库加密,Sqlite库默认不带加密功能 目前已知的对 SQLite 加密的工具主要有「[SQLite Encryption Extension (SEE)]、[S...【详细内容】
2022-11-01  水中影子621  今日头条  Tags:Java   点击:(17)  评论:(0)  加入收藏
对于数据抓取技术,本文介绍了java相关抓取工具,并附上demo源码供感兴趣的朋友测试!1)JDK自带HTTP连接,获取页面或Json 2) JDK自带URL连接,获取页面或Json 3)HttpClient Get工具,获取...【详细内容】
2022-10-31  MYJ2C混淆  今日头条  Tags:   点击:(6)  评论:(0)  加入收藏
前言说到java内部类,想必大家首先会想到比较常用的“匿名内部类”,但实际上,这只是内部类的其中一种使用方式而已。内部类的使用方式实际上总共包括:成员内部类, 方法局部类,匿名...【详细内容】
2022-10-27  马士兵Java架构  今日头条  Tags:java   点击:(9)  评论:(0)  加入收藏
在项目开发中,后端服务对外提供API接口一般都会关注响应时长。但是某些情况下,由于业务规划逻辑的原因,我们的接口可能会是一个聚合信息处理类的处理逻辑,比如我们从多个不同的...【详细内容】
2022-10-26  架构悟道  今日头条  Tags:JAVA   点击:(16)  评论:(0)  加入收藏
与 PHP 或 JavaScript 不同,Java 是一种强类型编程语言。这实质上意味着每个变量都必须使用预定义的数据类型声明,之后不能更改。Java中有两种数据类型: 原始数据类型 - int、...【详细内容】
2022-10-26   qaseven    Tags:Java   点击:(6)  评论:(0)  加入收藏
1、原理:基于javaAgent和Java字节码注入技术的java探针工具技术原理 2、原理分析动态代理功能实现说明,我们利用javaAgent和ASM字节码技术开发java探针工具,实现原理如下:jdk1.5...【详细内容】
2022-10-24  马士兵Java架构  今日头条  Tags:Java探针   点击:(13)  评论:(0)  加入收藏
简介前面在密码学入门一文中讲解了各种常见的密码学概念、算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍使用Java语言如何实现使用这些算法,并介绍一下使用过程...【详细内容】
2022-10-22  扣钉日记  今日头条  Tags:Java   点击:(4)  评论:(0)  加入收藏
简单描述java虚拟机内存分配与GC触发场景堆内存中,新生代和老年代分区图解 堆空间的参数设置-XX: +PrintFlagsInitial :查看所有的参数的默认初始值-XX: +PrintFlagsFinal :...【详细内容】
2022-10-21  chost-jie    Tags:java虚拟机   点击:(6)  评论:(0)  加入收藏
概述最近项目上反馈某个重要的定时任务突然不执行了,很头疼,开发环境和测试环境都没有出现过这个问题。定时任务采用的是 ScheduledThreadPoolExecutor,后来一看代码发现踩了一...【详细内容】
2022-10-21  Java架构学习指南  今日头条  Tags:   点击:(8)  评论:(0)  加入收藏
站内最新
站内热门
站内头条