您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > 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   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
如何使用 Java 对收据的照片执行 OCR
本文的目的是演示一个专门设计用于对收据照片执行OCR(光学字符识别)操作并自动从中提取关键业务信息的 API,例如企业名称和地址、电话号码、收据总额等等。在页面的下方,我提供...【详细内容】
2022-07-15  Search: OCR  点击:(588)  评论:(0)  加入收藏
百度API OCR小工具
一直在写东西,有时候会遇到这种需求,就是把图片上的文字拷贝到自己的文章中,所以写了这个小工具。 配合Snipaste使用天衣无缝,所有的东西都在剪切板里交换,即Snipaste截取的图片...【详细内容】
2021-08-30  Search: OCR  点击:(507)  评论:(0)  加入收藏
介绍一个Python 包,几行代码可实现 OCR 文本识别
文字 OCR 识别技术现在已经相当成熟了,无论 其 准确度还是识别速度 都能够满足我们的日常需要;今天给大家介绍一个 Python 包,该包的主要功能就是用于 OCR 识别的,包的名字叫 Py...【详细内容】
2021-04-16  Search: OCR  点击:(582)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(18)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(34)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(63)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(78)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(78)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(100)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(108)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条