介紹
幾周前,我在空閑時間使用泰比公司(ABBYY)的FlexiCapture Engine試用版創建了一些簡單的OCR應用。FlexiCapture Engine 是一款用於創建數據捕捉應用的SDK,能夠打開圖像、PDF文件及掃描文件,對有價值的數據及字段進行分類及提取。提取的數據可導出至Excel、XML、CSV、PDF 格式文件,也可以導出至外部數據庫、DMS及ECM系統。
開始創建
在已經裝有開發工具(如MS Visual Studio)的電腦上安裝SDK,之后SDK會出現10多種示例應用程序,包括C++、C#、VB.NET、VB、Delphi、Java及數種腳本語言(JavaScript、Perl及 VBScript)的示例。如需快速着手開發,你可以使用代碼開發庫。代碼開發庫會對SDK編程的方方面面進行介紹。每一代碼開發庫組包含一個或多個代碼片段,並附有完成任務的逐步描述。

選擇需要處理的任務,然后閱讀完成任務的步驟介紹,查看已備好樣本的源代碼或運行准備執行。

我想單獨介紹的其中一個樣本是FlexiCapture Engine代碼片段,該樣本提供了一個簡短代碼片段集,顯示了快速進入應用程序界面(API)並開始開發應用程序不可缺少的典型應用范圍及編程任務。

現在,讓我們看看使用FlexiCapture Engine識別文件及導出結果的基本方法。
利用ABBYY FlexiCapture預配置項目進行處理
ABBYY FlexiCapture Engine能夠處理ABBYY FlexiCapture項目內的固定格式表格及靈活格式文件。要使用此功能,必須利用ABBYY FlexiCapture先創建一個項目,然后在ABBYY FlexiCapture Engine中使用該項目。ABBYY FlexiCapture Engine工具包及樣本庫中已包含了一個備好的FlexiCapture樣本項目。
一個FlexiCapture項目是一個將文檔集和處理這些文檔所需設置統一起來的單一環境。這些需要處理的文檔集稱作批量文件。項目結構(包括批量文件及零散文件)將在FlexiCapture Engine對象中重現。項目最關鍵的部分是一套針對固定格式及靈活格式頁面布局的【文件定義】,該【文件定義】用於數據提取,將決定所得數據的質量。
為了處理文件,我在項目中將圖像添加至一批量處理中。在識別過程中,程序選擇適合文件頁面的【文件定義】,應用該【文件定義】,然后利用選定的【文件定義】提取文件相關區域的數據。處理后的數據隨后被轉至外部文件夾。

在單一預配置項目中識別文件並導出其結果,需要采取以下基本步驟:
步驟1:加載FlexiCapture Engine
在利用ABBYY FlexiCapture Engine開始處理任務之前,需要創建引擎對象。引擎對象是ABBYY FlexiCapture Engine對象層級結構中的頂級對象,是ABBYY FlexiCapture Engine唯一可在外部創建的對象。
要創建引擎對象,需要使用InitializeEngine (InitializeEngineEx)導出功能。以下是ABBYY FlexiCapture Engine在C#中加載和初始化過程中的樣本代碼:
private IEngine loadEngine()
{
IEngine engine;
int hResult = InitializeEngine( FceConfig.GetDeveloperSN(), null, null, out engine );
Marshal.ThrowExceptionForHR( hResult );
return engine;
}
導出的引擎對象為單體形態,因此在使用ABBYY FlexiCapture Engine的單一實例應用中,僅可以創建一個此類對象。創建引擎對象的重復性嘗試將回歸同一對象。需要重點注意的是創建引擎對象的過程比較久,因為不僅需要加載FCEngine.dll,還需要加載一整套其它DLLs。
在創建引擎對象之后,就能夠在我的應用中使用ABBYY FlexiCapture Engine對象。然后可以根據選定的處理方法打開一個FlexiCapture項目或創建FlexiCapture處理程序。我會考慮使用第一種方法——通過配置好的FlexiCapture項目進行處理。
步驟2:打開項目
要准備預配置ABBYY FlexiCapture項目處理文件所需的程序,需要打開在ABBYY FlexiCapture中創建的項目。一個項目含有處理某一類型文件所需的所有設置:圖像導入參數、文件定義及批量文件處理。該項目文件夾必須含有該項目文件(.fcproj file)以及一個帶有【文件定義】的文件夾。
在ABBYY FlexiCapture Engine中,該項目由項目對象表示。要打開一個現有項目,可以使用引擎對象的OpenProject方法,並將完整路徑加入該項目文件作為第一個參數。這是用C#打開項目時的代碼示例:
//打開該項目示例
IProject project = engine.OpenProject("D:\\TestProject\\TestProject.fcproj\\Invoices_eng.fcproj" );
步驟3:添加圖像
項目打開后,就可以將新圖像添加至該項目中進行處理。圖像添加后,這些圖像被分組成文件,而這些文件會被添加至批處理。向批處理分配文件的原則由用戶自定義:可以在單個批處理中處理所有文件,或將同一日期添加的文件或單一批次掃描的批量文件生成批處理。
FlexiCapture Engine提供一組復制了項目邏輯結構的對象。批量處理與項目對象分別對應一個批處理及一個項目。項目對象含有一個批量處理對象集,由批量處理對象代表。這個對象集可以通過項目對象的批量處理屬性獲得。每一個批處理含有一套文件,可以通過項目對象的批量處理屬性獲得。文件由文件對象表示,一份文件由文件對象表示。
以下是添加圖像的C#代碼格式:
//添加一個新的批量處理
IBatch batch = project.Batches.AddNew( "TestBatch" );
//打開批量處理
batch.Open();
//添加圖像到批量處理
batch.AddImage("D:\\SampleImages\\Invoices_1.tif" );
batch.AddImage("D:\\SampleImages\\Invoices_2.tif" );
batch.AddImage("D:\\SampleImages\\Invoices_3.tif" );
步驟4:識別文件
在文件處理過程中,程序選擇適合文件頁面的【文件定義】,應用該【文件定義】,然后利用選定的【文件定義】提取文件相關區域的數據。ABBYY FlexiCapture Engine允許通過使用一種方法完成所有這些文件的處理步驟。一種識別文件的簡單途徑是使用批量處理對象的識別方法。你可以指定處理文件、識別方式以及適用的【文件定義】。
//在批量處理中識別所有圖像
batch.Recognize( null, RecognitionModeEnum.RM_ReRecognizeMinimal, null );
步驟5:導出結果
文件被識別后,需要保存識別的數據。首先,可以將提取的數據保存至XLS、DBF、TXT、CSV或XML格式的文件中,然后將文件的電子文檔保存為需要的格式,如PDF或PDF/A格式。這里可以使用項目或批量處理對象的導出方法。前者允許你從多個批處理中將結果導出,而后者用於將批處理中的多個文件導出。在導出時,可以通過ExportParams對象改變導出參數。例如,可以指定是否將字段坐標導入XML,或為圖像文件設定壓縮比等等。在默認模式下,【文件定義】中指定的參數將被使用。
//導出結果
batch.Export( null, null );
如果由於某些原因ABBYY FlexiCapture Engine提供的導出方法不合適我的任務,那么可以使用我自己的導出程序。例如,我可以轉化一份文件的所有字段,並將他們的數值導出至自定義格式文件。樣本代碼可以在我之前提到的代碼片段樣本中獲得。
完成批處理工作后,我調出對應批量處理對象的【關閉】方法關閉批量處理,並釋放一些資源(打開的批量處理不能被關閉)。該方法同樣適用於項目——我需要調出【項目】目標的【關閉】方法釋放一些資源(打開的項目不能被關閉)。
//關閉和刪除批處理
} finally {
batch.Close(); // Before the batch could be deleted, it has to be closed
project.Batches.DeleteAll();
}
最后步驟:卸載FlexiCapture Engine
使用ABBYY FlexiCapture Engine完成工作后,我需要使用DeinitializeEngine功能卸載引擎對象。
private void unloadEngine( ref IEngine engine )
{
engine = null;
int hResult = DeinitializeEngine();
Marshal.ThrowExceptionForHR( hResult );
}
在此,我分享一個非常有用的心得:你可以使用引擎對象的StartLogging方法讓錯誤、警告及方法調用記錄進入日志文件,同時它也可以幫助追蹤未被刪除及正確釋放的對象。
結論
如果你正在開發用於處理諸如發票、醫療表格、投保單、問卷調查表、測試表及身份證等的數據捕捉解決方案,開發人員可以考慮使用ABBYY FlexiCapture Engine SDK。它還可以針對各種不同的掃描設備和終端創建自定義數據捕捉解決方案。除了通過預配置FlexiCapture項目處理任務之外,FlexiCapture Engine還有其它方法實施數據捕捉應用——FlexiCapture Engine提供就緒的應用程序界面(API)用於創建簡單的【文件定義】,而無需使用FlexiCapture項目。這又是另一個完整的主題,我會盡快在另一篇心得中分享。
關於下載
我是在ABBYY官網提交申請下載的免費試用版本,試用申請頁面請點擊。
