ABBYY FlexiCapture Engine能够为用户的软件解决方案提供嵌入式图像数据提取技术,降低开发成本。
本文将从程序员的视角来介绍如何使用该SDK:让您有机会与API亲密接触,并向您传授独家秘诀,让您可以将此SDK轻松自然地集成到大多数应用程序(桌面程序、服务器、云系统等)中去。
______________________________________________________________________
首先,我们来了解如何使用FlexiCapture Engine(这种情况非常适合于简单的桌面应用程序)进行基本的图像数据提取,然后,我们将探讨在此基础上可以作哪些改变,以便适应用户的应用需求,以及实现方式。
宣传材料介绍的图像数据提取流程如下:
代码如下所示(参见注解):
[C #]
// 载入当前进程FCEngine
IEngineLoader engineLoader = New FCEngine.InprocLoader();
IEngine Engine = engineLoader.Load(serialNumber, "" );
// 创建处理器实例,并进行设置,添加一个或多个文档定义
IFlexiCaptureProcessor = Engine processor.CreateFlexiCaptureProcessor();
processor.AddDocumentDefinitionFile(sampleFolder + "Invoice_eng.fcdot");
// 将图像文件添加到内部处理队列
processor.AddImageFile(sampleFolder + "Invoices_1.tif");
processor.AddImageFile(sampleFolder + "Invoices_2.tif");
// 开始识别,获得首个(也是唯一的)结果文档
IDocument document = processor.RecognizeNextDocument();
assert(document!= null); // 没有处理错误
assert(document.DocumentDefinition ! = null); //定义文档类型,提取数据
assert(document.Pages.Count == 2 ); //两个图像都添加到文档中
//获取并使用提取出来的数据
string = InvoiceNumber Documents.Sections[0].Fields[0].Value.AsString; //为简单起见,通过索引来访问
现在,我们来详细介绍这个应用的每个步骤,它们分别对应于上述各个代码段:
下载 FlexiCapture Engine
加载对象就相当于加载引擎并初始化可执行模块,按照规则,只需在启动或首次使用时执行此操作即可。
有几种加载方案。如上例所示,Engine可以直接加载到主进程中,这适用于简单的桌面应用程序。另外,也可以通过独立的进程加载Engine,这样可以提升可靠性,对于服务器解决方案,推荐使用这种方案。
当通过独立进程启动Engine时,您就可以管理该进程的优先级别和运行时间。您也可以创建一系列进程,此时这些进程会同时运行Engine,它们彼此完全独立,而且会周期性地循环。(代码示例中提供了现成的系列进程实现代码。)
Engine的使用几乎不依赖于加载方式,所以相同的代码可以重复使用,但您可以选择易于执行的加载方式。
创建和配置 CPU
FlexiCapture Processor是一种小型可配置的处理对象,它接收输入图像,并将它们转换成包含输出数据的文件。在单个进程中,这种对象的数量只受可用资源的限制。可以在每次使用前新建处理器,也可以将处理器存储在缓存中(这样可以节省加载布局所用的时间)。
要启动处理器,需要指定一组文档布局。你可以如示例中那样,直接上传存储在磁盘文件中的现成布局,也可以通过存储器(应用程序资源、数据库、共享的网络存储器等)上的字节流上传布局。您还可以临时从头创建文档定义,或者基于“灵活”或“固定”的几何布局描述创建文档定义。(一般建议使用事先创建并经过visual FlexiCapture工具调试过的模板。在有些情况下,可能需要通过API创建或修改定义。例如,如果你要处理一批类似的表格,表格的几何布局随年份而不同,但数据语义或多或少都相同,那么,为了简化维护工作,你就可以这样做)。
通过使用多个处理器,我们可以进行多级处理,其中一个处理器在入口处基于一些简单的规则对文档进行基本分类,并将结果传送到某个专用处理器那里,这个专用处理器会检测出文件的准确类型并提取数据。当需要处理大量不同的文件类型时,这种方法可以提高性能。此外,多个专用处理器可以并行工作,从而进一步提升整个解决方案的处理能力。
输入图像
处理器可以接受一系列图像。在最简单的情况下,可能正如示例中一样,它们只是一些文件链接 – 这些链接会被添加到处理器的内部队列中。您还可以创建一个自定义原始图像队列,将其输入到处理器中。
经处理器请求,自定义队列可以提供指向图像文件(存储器流)或被下载图像(FlexiCapture Engine内部格式)的链接。根据最新方案,您还可以先对图像进行预处理(使用内置的成像工具或自定义算法),然后再发送给处理器。此外,用户在自定义队列时,可以让处理器等候下一个图像出现(描述如下)。
操作循环
在上例中,系统只需要识别一个文件,这是个很普通的任务。然而,在更多的情况下,我们可以在此创建一个处理循环,系统每次从队列中选择一列图像,将其转化成与之对应的一个最终文档或者错误(无法访问图像、图像破碎等)。
通过自定义队列和图像处理循环,处理器可以拉式接收图像,它会将图像从队列中“抽”出来,而且在加载下一幅图像时可能会挂起。
一个图像队列也可以同时由多个处理器进行处理,因此非常容易实现并行化处理(多个CPU同时不间歇地从队列中“抽取”图像加以处理,在示例中可以找到这种方法的实现编码)。
处理结果
处理器会生成输出文件,文件中包含树状结构,节点上储存着提取的数据以及图像页面,页面几何布局显示出被搜索数据的位置。
文档中的数据可以直接检索,或独立存储在文件或数据库中(包括图像的必要组件),或进行进一步的处理。您还可以通过内置的导出工具将数据导出为它所支持的文件格式。
您也可以将文档作为中间结果保存为文件或存储器流,后期再封送或进一步加工。比如,后期再使用内置的验证工具核查数据。
通过内置的验证工具,可以将数据分组,从而尽可能地减少手动验证大量数据所需要的时间。除这个方法以外,通常还可以通过编程轻松地完成验证(绕过文件,对照数据库、字典、校验和等来验证数据)。
自定义引用解析机制
在上例中,我们使用引用链接,以文件系统路径的形式来引用文档定义文件和图像文件。使用引用链接通常很方便,您可以推迟加载对象,直到必要的时候再加载。链接在进程之间传递起来也更为容易。
通过重新定义引用解析机制,您完全可以根据自身的需求,重新设计处理器的引用处理规则。将链接简单地当做字符串,对此机制而言不会导致任何混淆。链接可能是URL或数据库中的标识符,也可能是两者的组合并具有协议标识。引用解析机制只需找到路径对应的本地磁盘(临时)文件或存储器字节流即可。
此外,通过引用也定义了返回对象的保存期管理协议(以便及时地删除临时文件和从存储器上卸载对象)。
结论
产品介绍中的应用示例涵盖了本文描述的大多数问题。这样,使用ABBYY FlexiCapture Engine技术的开发人员就可以立足于业已成熟的工作方案,根据自身的需求在此基础上加以改进。应用示例包括下列应用程序:
1.桌面应用程序(使用单独的处理器,直接下载到用户进程中,图像为磁盘上的系列文件)
2.高性能的多线程服务器程序(多个CPU从共享队列中提取图像)
3.Web服务(多个处理器同时处理客户端请求)
还有一段代码是专门为程序员写的,它包含许多现成的小脚本,这些脚本和开发人员当初设计得一模一样,并已经完成了测试。
我们还提供了一个很好的帮助文档,它详细描述了所有的对象、方法及其应用。
如果您想了解有关ABBYY FlexiCapture Engine的更多信息,可以查看online ABBYY。
开发人员产品部Alexei Kalyuzhny