简介

将纸质文档变为电子文档无疑又环保,还节省物理存储空间,但是有些情况它却没有节省空间或减少麻烦。电子报告或手动扫描纸质文档对账单、发票、财务报表的归档十分有用。但是,往电脑里录入这些纸质文档需要大量的时间和精力,而且保存的这些电子文档日后却很难查找它们,这又有什么好处呢?

对一个有好记性和习惯的人来说这可能不难,但是中型到大型企业有庞大的业务,每天有数百人需要处理成千上万的文档,又会怎样呢?没有某种程序的话,就需要巨大的人力开销,更大的问题是:会经常录错!

假设一下,你可以将所有扫描文件放在一个文件夹,然后自动以一致的习惯移动和重命名它们。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开始分类文档前,必须知道如何分类他们,分类通过创建一个主表单模板的集合完成。LEADTOOLS附带了一个主表单编辑器示例,使用它可以为两种不同的包含单独OCR字段的发票添加一个主表单,提取出发票日期,重命名文件。

clip_image001

图1:使用Master Form编辑器定义Master Form模板

现在我们定义了主表单,可以开始处理文档了。我们已经扫描了两个基于主表单的发票和一个没有已知模板的税单。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);
         }
      }
   }
}

clip_image002

图2 分类前的表单存储库和子文件夹

clip_image003

图3 分类后的表单存储库和子文件夹

正如你所看到的,两张发票与它们的主表单正确匹配,并根据数据字段重命名。此外,未分类的文档文件夹起到了自动防御的功能,允许应用程序通过最小的代价达到目的。当你有一个主表单集合中没有的新文档类型时,你所要做的只是将这些图像中的一个当做模板,提取出你想要的字段,将未分类的文档移回New文件夹,在下次程序运行时重新处理一次。

再进一步

这个简单的解决方案有着巨大的扩展性和适应性。例如,通过连接一个云服务如Google Docs、SkyDrive或 iCloud轻松管理你的在线文档。同样,企业可以调整它来监控和组织传入的传真和邮件附件,或使用识别出的字段数据,将其直接存入数据库。更重要的是,LEADTOOLS表单识别可以按你的意愿处理扫描文档中或多或少的数据,它的实用性已经远远超出了组织和归档。通过提取表单字段、复选框、发票金额等还能加速工作流。

获取支持

关于其他产品的更多信息,请访问我们的官方网站

欢迎下载免费的全功能评估版SDK,全功能试用版中有这个例子的全部源代码。

同时欢迎您使用评估版期间的免费技术支持