原創|使用教程|編輯:龔雪|2015-07-10 09:59:59.000|閱讀 727 次
概述:使用LEADTOOLS創建的應用程序可以將一個掃描文檔與已經的模板比較,并對文檔類型正確分類。當正確識別一個文檔后,LEADTOOLS可以從表單中已定義的位置提取文字、選項、條碼等。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
將紙質文檔變為電子文檔無疑又環保,還節省物理存儲空間,但是有些情況它卻沒有節省空間或減少麻煩。電子報告或手動掃描紙質文檔對賬單、發票、財務報表的歸檔十分有用。但是,往電腦里錄入這些紙質文檔需要大量的時間和精力,而且保存的這些電子文檔日后卻很難查找它們,這又有什么好處呢?
對一個有好記性和習慣的人來說這可能不難,但是中型到大型企業有龐大的業務,每天有數百人需要處理成千上萬的文檔,又會怎樣呢?沒有某種程序的話,就需要巨大的人力開銷,更大的問題是:會經常錄錯!
假設一下,你可以將所有掃描文件放在一個文件夾,然后自動以一致的習慣移動和重命名它們。LEADTOOLS OCR表單識別和處理擁有高級、靈活和強大的圖形庫,完全可以滿足你的要求。使用LEADTOOLS創建的應用程序可以將一個掃描文檔與已經的模板比較,并對文檔類型正確分類。當正確識別一個文檔后,LEADTOOLS可以從表單中已定義的位置提取文字、選項、條碼等。
解決困境的第一步是處理和管理一個中心文檔數據庫,所有的掃描文檔會放到這個位置進行分類。有多種方法可以完成,如使用一個web服務或一個機器人按下一個按鈕。此例中選擇的方法是一個簡單的控制臺應用程序,它與Windows的任務調度器一起運行完成調度。
管理文檔庫的代碼相對來說簡單,因為它主要使用了System.IO命名空間的基本文件和文件夾操作。然后應用程序最重要的部分傳遞到了文檔分類器上,它封裝了LEADTOOLS表單識別功能,返回用戶移動和重命名文檔時使用的數據。
// 為新文檔檢查掃描文檔存儲庫 string[] newDocuments = Directory.GetFiles(docRepositoryNewDocs); DocumentClassifier docClassifier = new DocumentClassifier(docRepositoryMasterForms); string movedDocumentName, masterFormSubFolder; foreach (string currentDoc in newDocuments) { movedDocumentName = null; // 嘗試將此文檔與已知的文檔類型匹配 ClassifiedDocument classifiedDoc = docClassifier.ClassifyDocument(currentDoc); if (classifiedDoc.MasterFormName != null) { // 如果不存在,為Master Form添加子文件夾 masterFormSubFolder = string.Format(@"{0}{1}\", docRepositoryRoot,classifiedDoc.MasterFormName); if (!Directory.Exists(masterFormSubFolder)) Directory.CreateDirectory(masterFormSubFolder); // 根據找到的日期,重命名文件 if (classifiedDoc.DocumentDate != DateTime.MinValue) { movedDocumentName = string.Format("{0}{1}{2}", masterFormSubFolder, classifiedDoc.DocumentDate.ToString("yyyyMMdd"), currentDoc.Substring(currentDoc.LastIndexOf('.'), currentDoc.Length - currentDoc.LastIndexOf('.'))); } else { // 沒有找到用來重命名的日期,就移走它 movedDocumentName = currentDoc.Replace(docRepositoryNewDocs, masterFormSubFolder); } } else { movedDocumentName = currentDoc.Replace(docRepositoryNewDocs, docRepositoryUnclassifiedDocs); } if (!string.IsNullOrEmpty(movedDocumentName)) File.Move(currentDoc, movedDocumentName); }
在LEADTOOLS開始分類文檔前,必須知道如何分類他們,分類通過創建一個主表單模板的集合完成。LEADTOOLS附帶了一個主表單編輯器示例,使用它可以為兩種不同的包含單獨OCR字段的發票添加一個主表單,提取出發票日期,重命名文件。
現在我們定義了主表單,可以開始處理文檔了。我們已經掃描了兩個基于主表單的發票和一個沒有已知模板的稅單。LEADTOOLS會將New文件夾中的每一個文件與主模板比較。如果找到了匹配項,它會處理文檔字段,返回表單的名稱和日期字段。
// 為機器上的每一個處理器創建OCR引擎。在識別和處理過程中,允許線程的優先使用 ocrEngines = new List<IOcrEngine>(); for (int i = 0; i < Environment.ProcessorCount; i++) { ocrEngines.Add(OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false)); ocrEngines[i].Startup(formsCodec, null, String.Empty, String.Empty); } // 將存儲庫指向包含已有主表單的文件夾 formsRepository = new DiskMasterFormsRepository(formsCodec, _MasterFormFolder); autoEngine = new AutoFormsEngine(formsRepository, ocrEngines, null, AutoFormsRecognitionManager.Default | AutoFormsRecognitionManager.Ocr, 30, 70, true); // 在這個文檔上運行表單識別 AutoFormsRunResult runResult = autoEngine.Run(document, null); if (runResult != null) { // 在此例中,我們使用了兩種信息來組織分類的表單: // 1.子文件夾使用表單的名字 // 2.文件名使用 "ClassificationRenameDate" 字段 retClassifiedDocument.MasterFormName = runResult.RecognitionResult.MasterForm.Name; // 處理識別的表單,提取想要的信息 foreach (FormPage formPage in runResult.FormFields) { foreach (FormField field in formPage) { if (field != null && field.Name == "ClassificationRenameDate") { retClassifiedDocument.DocumentDate = DateTime.Parse(( field.Result as TextFormFieldResult).Text); } } } }
正如你所看到的,兩張發票與它們的主表單正確匹配,并根據數據字段重命名。此外,未分類的文檔文件夾起到了自動防御的功能,允許應用程序通過最小的代價達到目的。當你有一個主表單集合中沒有的新文檔類型時,你所要做的只是將這些圖像中的一個當做模板,提取出你想要的字段,將未分類的文檔移回New文件夾,在下次程序運行時重新處理一次。
這個簡單的解決方案有著巨大的擴展性和適應性。例如,通過連接一個云服務如Google Docs、SkyDrive或 iCloud輕松管理你的在線文檔。同樣,企業可以調整它來監控和組織傳入的傳真和郵件附件,或使用識別出的字段數據,將其直接存入數據庫。更重要的是,LEADTOOLS表單識別可以按你的意愿處理掃描文檔中或多或少的數據,它的實用性已經遠遠超出了組織和歸檔。通過提取表單字段、復選框、發票金額等還能加速工作流。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn