本教程演示如何根据MasterForm模板集合手动识别已填充的表单示例,然后使用LEADTOOLS低级表单接口手动处理表单以检索信息。这比自动执行过程提供了更多的控制。
| 概述 | |
|---|---|
| 总结 | 本教程介绍如何在Java应用程序中使用LEADTOOLS低级表单接口手动识别和处理表单。 |
| 完成时间 | 30分钟 |
| Visual Studio项目 | 下载教程项目(112kb) |
| 平台 | Java应用程序 |
| IDE | Eclipse / IntelliJ |
| 开发许可 | 下载LEADTOOLS |
| 用另一种语言试试 |
|
步骤熟悉创建项目的基本步骤添加引用和设置License教程,在工作之前手动识别和处理表单- Java教程。
中创建的项目的副本开始添加引用和设置License教程。如果该项目不可用,请按照该教程中的步骤创建它。
所需要的参考资料取决于项目的目的。引用可以由本地添加. jar档案位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Java.
本项目需要参考资料如下:
leadtools.jarleadtools.barcode.jarleadtools.codecs.jarleadtools.document.writer.jarleadtools.forms.auto.jarleadtools.forms.common.jarleadtools.forms.processing.jarleadtools.forms.recognition.jarleadtools.forms.recognition.ocr.jarleadtools.imageprocessing.core.jarleadtools.ocr.jarleadtools.svg.jar有关应用程序需要哪些JAR文件的完整列表,请参阅Java应用程序中包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。
随着项目的创建、引用的添加和许可的设置,编码就可以开始了。
打开_Main.java类Package Explorer.重命名_Main.java类ManuallyRecognizeAndProcessAFormTutorial.java.将下列语句添加到进口顶部的块。
进口java.io.File;进口java.io.IOException;进口java.nio.file.Files;进口java.nio.file.Paths;进口java.util。*;进口leadtools。*;进口leadtools.codecs。*;进口leadtools.document.writer。*;进口leadtools.forms.common。*;进口leadtools.forms.processing。*;进口leadtools.forms.recognition。*;进口leadtools.forms.recognition.ocr。*;进口leadtools.ocr。*;
修改main ()方法创建的新实例ManuallyRecognizeAndProcessAFormTutorial类和叫它是run ()方法,可选地传入以后可以使用的程序参数。下面将定义此方法。
公共静态无效main (String [] args){新ManuallyRecognizeAndProcessAFormTutorial () .run (args);}
在run ()方法,添加以下命令将库路径设置为C DLL文件所在的位置,并加载之前导入的LEADTOOLS库。
私人无效运行(String [] args){试一试{Platform.setLibPath (“C: \ \ LEADTOOLS22 \ \ Bin \ \ CDLL \ \ x64”);Platform.loadLibrary (LTLibrary.LEADTOOLS);Platform.loadLibrary (LTLibrary.CODECS);Platform.loadLibrary (LTLibrary.OCR);SetLicense ();InitFormsEngines ();CreateMasterFormAttributes ();RecognizeForm (formToRecognize);}抓(异常交货){System.err.println (ex.getMessage ());ex.printStackTrace ();}最后{如果(ocrEngine ! =零) {ocrEngine.shutdown ();ocrEngine.dispose ();}如果(编解码器! =零)codecs.dispose ();}}
请注意
的实例OcrEngine而且RasterCodecs将需要在它们被使用后被处理,以便正确地释放这些资源,如上面调用处理()方法。
将下面的全局变量添加到ManuallyRecognizeAndProcessAFormTutorial类。
私人OcrEngine =零;私人RasterCodecs codecs =零;私人FormRecognitionEngine =零;私人FormProcessingEngine processingEngine =零;私人字符串masterformDir =“C: \ \ LEADTOOLS22 \ \资源\ \图片\ \ \ \ \ \ OCR MasterForm集形式”;私人字符串formToRecognize =“C:\\LEADTOOLS22\\资源\\图像\\表单\\表单待识别\\OCR\\ w9_ocr_filling .tif”;
在ManuallyRecognizeAndProcessAFormTutorial类添加三个新方法命名InitFormsEngines (),CreateMasterFormAttributes (),RecognizeForm(字符串unindentifiedForm).方法中按顺序调用所有三个方法run ()方法,如上所示。的字符串参数传递给RecognizeForm ()方法将是字符串变量,该变量包含要识别的窗体的文件路径。为了本教程的目的,将使用以下文件路径中的TIFF文件:C:\LEADTOOLS22\资源\图像\表单\待识别表单\OCR\ w9_ocr_filling .tif
将下面的代码添加到InitFormsEngines ()方法初始化FormRecognitionEngine,FormProcessingEngine,并设置OcrEngine.
私人无效InitFormsEngines () {试一试{System.out.println (“初始化引擎……”);编解码器=新RasterCodecs ();.getLoad .getRasterizeDocument codecs.getOptions () () () .setResolution (300);recognitionEngine =新FormRecognitionEngine ();processingEngine =新FormProcessingEngine ();ocrEngine = OcrEngineManager.createEngine(ocrengintype . lead);ocrEngine.startup(编解码器,新DocumentWriter (),零,零);OcrObjectsManager =新OcrObjectsManager (ocrEngine);recognitionEngine.getObjectsManagers阀门()(ocrObjectsManager);processingEngine.setOcrEngine (ocrEngine);System.out.println (“引擎初始化成功。”);}抓(例外ex) {System.err.println (ex.getMessage ());ex.printStackTrace ();}}
在CreateMasterFormAttributes ()方法添加下面的代码以创建。斌每个主表单的文件,其中将包含用于在表单识别期间将主表单与已填充表单配对的主表单属性。
私人无效CreateMasterFormAttributes () {System.out.println (“处理MasterForm……”);//遍历文件夹中所有的。tif图像文件masterformOcrFolder =新文件(masterformDir);为masterformFile: masterformOcrFolder.listFiles((filename) -> . listfiles.endsWith .toLowerCase filename.toString () () (“.tif”))) {字符串masterformfileName = masterformFile.toString();字符串masterformName = masterformfileName.substring(masterformfileName.lastIndexOf (File.separator) + 1,masterformfileName.lastIndexOf (“。”));RasterImage image =零;试一试{图像=编解码器。load(masterformfileName, 0, CodecsLoadByteOrder.)Bgr_or_gray, 1, -1);masterFormAttributes = recognitionEngine。createMasterForm (masterformName UUID.randomUUID (),零);//获取每个页面的表单属性为(int我= 0;我< image.getPageCount ();我+ +){image.setPage (i + 1);recognitionEngine。addMasterFormPage (masterFormAttributes形象,零);}recognitionEngine.closeMasterForm (masterFormAttributes);//将属性写入文件Files.write(路径。get (masterformName +“。斌”)、masterFormAttributes.getData ());}抓(例外ex) {System.err.println (ex.getMessage ());ex.printStackTrace ();}最后{如果(图片! =零)image.dispose ();如果(编解码器! =零)codecs.dispose ();}}System.out.println (“主窗体处理完成。”);}
将下面的代码添加到RecognizeForm ()方法将给定表单加载为RasterImage并运行表单识别以将已填充的表单与相应的主表单配对。
私人无效识别表单(String unidentifiedform) {System.out.println (“认识形式……”);字符串projectDirectory = System.getProperty(“user.dir”);RasterImage image =零;试一试{图像=编解码器。load(unidentifiedform, 0, CodecsLoadByteOrder.)Bgr_or_gray, 1, -1);filledFormAttributes = recognitionEngine.createForm(零);为(int我= 0;我< image.getPageCount ();我+ +){image.setPage (i + 1);recognitionEngine。addFormPage (filledFormAttributes形象,零);}recognitionEngine.closeForm (filledFormAttributes);布尔发现=假;文件夹=新文件(projectDirectory);File[] folderBinFiles = folder.listFiles((filename) -> filename. tostring ().toLowerCase().endsWith(“。斌”));为(文件masterformBinFile: folderBinFiles){masterformBinFileName = masterformBinFile.toString();masterformName = masterformBinFileName.substring(masterformBinFileName.lastIndexOf (File.separator) + 1,masterformBinFileName.lastIndexOf (“。”));masterformXmlFilename = masterformDir +"\\" + masterformName + ". xml”;processingEngine.loadFields (masterformXmlFilename);//比较填充表单属性和主表单属性masterformAttributes =新FormRecognitionAttributes ();masterformAttributes.setData (Files.readAllBytes (masterformBinFile.toPath ()));FormRecognitionResult = recognitionEngine.compareForm(masterformAttributes, filledFormAttributes,零);//如果信心>=80,那么我们已经找到了主窗体如果(recogntionresult . getconfidence () >= 80) {列表alignments =新ArrayList < PageAlignment > (); 为(PageRecognitionResult pageResult: recognitionResult.getPageResults())alignments.add (pageResult.getAlignment ());System.out.println ("此表格已被公认为"+ masterformName": \ n ");ProcessForm(图片、平面图);发现=真正的;打破;}}如果(!)System.out.println (“这种形式无法被识别。”);}抓(例外ex) {System.err.println (ex.getMessage ());ex.printStackTrace ();}最后{如果(图片! =零)image.dispose ();}}
对象中创建一个新方法ManuallyRecognizeAndProcessAFormTutorial类命名ProcessForm(RasterImage图像,List.方法中调用此方法RecognizeForm ()方法,如上所示。将下面的代码添加到ProcessForm ()方法将已填充表单的处理结果显示到控制台。
私人无效ProcessForm(RasterImage图像,列表< pagealign > alignments) {字符串resultsMessage ="";//在所有页面的所有表单字段中显示处理后的文本值processingEngine。过程(图片、排列);为(FormPage: processingEngine.getPages())为(FormField: formPage)如果(formField ! =零)//为了便于演示,假设所有字段都是文本resultsMessage += String.format(“%s at %s = %s\n”,formField.getName (),.toString formField.getBounds () (),((TextFormFieldResult) formField.getResult ()) .getText ());如果(resultsMessage = =零|| resultsMessage =="")System.out.println (“没有字段被处理。”);其他的System.out.println (resultsMessage);}
按下运行项目Ctrl + F11,或选择执行命令->执行命令.
如果正确地执行了这些步骤,应用程序将在给定目录为每个主表单创建标识属性,加载指定的已填充表单,运行表单识别以将已填充的表单与适当的主表单配对,然后处理已填充的表单并将已处理的信息显示到控制台。
本教程展示了如何使用LEADTOOLS低级表单接口将图像识别为特定的表单,然后提取所有文本字段值以显示到控制台。它还涵盖了如何使用OcrEngine,FormRecognitionEngine,FormProcessingEngine,FormRecognitionAttributes,FormRecognitionResult类。