Leadtools.Forms.Ocr Namespace > IOcrPage Interface : RecognizeText Method |
string RecognizeText( OcrProgressCallback callback )
'Declaration Function RecognizeText( _ ByVal callback As OcrProgressCallback _ ) As String
'Usage Dim instance As IOcrPage Dim callback As OcrProgressCallback Dim value As String value = instance.RecognizeText(callback)
string RecognizeText( OcrProgressCallback callback )
function Leadtools.Forms.Ocr.IOcrPage.RecognizeText( callback )
String^ RecognizeText( OcrProgressCallback^ callback )
Before calling this method call AutoPreprocess Method to perform automatic pre-processing to improve image quality.
Use this method to get the document result in a simple System.String object. Getting the result as text is helpful in situations when adding zones manually for form processing. For example, suppose the form you are processing has two areas of interests, a name field at coordinates 100, 100, 400, 120 and a social security number at coordinates 100, 200, 400, 220. You can structure your application as follows:
OcrZone nameZone = new OcrZone(); nameZone.ZoneType = OcrZoneType.Text; nameZone.Bounds = new LogicalRectangle(100, 100, 400, 120); ocrPage.Zones.Add(nameZone);
string name = ocrPage.RecognizeText(null);
ocrPage.Zones.Clear();
If this page is not a black/white one (i.e. it contains a gray-scale or a 24-bit color image), then an implicit secondary image conversion step will be performed automatically to convert the image to a B/W one.
RecognizeText utilizes the zone information to activate the appropriate recognition module on every zone Zones property. Each recognition module recognizes the page parts assigned to it in the zones.
If the zone collection Zones of this IOcrPage is empty (i.e. there are no zones defined), then the page-layout decomposition process will be activated automatically in order to create a zone list for the image, before recognition. Hence, AutoZone will be implicitly called.
Note: If this IOcrPage is an empty page, in other words, when the OCR engine performs automatic page decomposing with the AutoZone method and could not find any zones in it, the RecognizeText method will fail with an exception. It is recommended you call AutoZone and then check if there is at least one zone found by the engine (using Zones.Count). If the count is zero, do not call RecognizeText.
If a recognition module is not able to recognize an object (i.e. character, or checkmark etc.), this object will be marked as a rejected one. It will become marked by a rejection symbol during conversion to the final output document. Note that IOcrDocumentManager.RejectionSymbol can be set to specify the rejection symbol used in the final document.
This method uses the checking subsystem (IOcrSpellCheckManager) to either flag suspicious characters or words, or to allow auto-correction during the recognition process.
You can use the OcrProgressCallback to show the operation progress or to abort it. For more information and an example, refer to OcrProgressCallback.
Since the format of the recognized data file is not documented, you can use GetRecognizedCharacters and SetRecognizedCharacters to examine or modify the data. Any changes you make to the recognition data will be saved in the resulting document when you save IOcrDocument.
After the page is successfully recognized, the value of the IsRecognized property should be true.
Use Unrecognize to clear the recognition data stored in a page.
Use Recognize to keep the recognition data stored internally inside the page. You can later use the methods of the IOcrDocument object that owns this page or pages to save the data to a file or memory using the many formats supported by this IOcrEngine such as Text, PDF or Microsoft Word.
Since the recognition algorithm may use the checking subsystem, you must set up the IOcrSpellCheckManager prior to calling RecognizeText.
To get the accuracy and timing data of the latest successful recognition process use GetLastStatistic after calling Recognize.
Note on AutoZone/Recognize and the page image: In certain cases, AutoZone and Recognize will perform image processing on the page that might result in the page being manipulated. For example, if you add a zone of type table, the engine might automatically deskew the page if required. This result in the image representation of the image to be different after AutoZone or Recognize is called. If your application has a requirement to view the image of the page, then call GetRasterImage after AutoZone or Recognize to get the latest version of the image representation of the page in case it has changed. The LEADTOOLS Main OCR C# and VB demos do exactly that.
Public Sub RecognizeTextExample() ' Get the form file name Console.WriteLine("Setting up the form...") Dim formFileName As String = GetMyForm() ' Assume we get the field informations from an external source such as a database or an XML file Dim fieldNames() As String = _ { _ "Name", _ "Address", _ "SSN" _ } Dim fieldBounds() As LogicalRectangle = _ { _ New LogicalRectangle(800, 160, 1500, 220, LogicalUnit.Pixel), _ New LogicalRectangle(800, 560, 1500, 220, LogicalUnit.Pixel), _ New LogicalRectangle(800, 960, 1500, 220, LogicalUnit.Pixel) _ } Dim fieldCount As Integer = fieldNames.Length Dim fieldValues(fieldCount - 1) As String ' Create an instance of the engine Using ocrEngine As IOcrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Plus, False) ' Start the engine using default parameters Console.WriteLine("Starting up the engine...") ocrEngine.Startup(Nothing, Nothing, Nothing, Nothing) ' Create an OCR document Dim ocrDocumentManager As IOcrDocumentManager = ocrEngine.DocumentManager Using ocrDocument As IOcrDocument = ocrDocumentManager.CreateDocument() ' Add the form to the document Console.WriteLine("Adding the form to the document...") Dim ocrPage As IOcrPage = ocrDocument.Pages.AddPage(formFileName, Nothing) ' Get our fields For i As Integer = 0 To fieldCount - 1 ' Clear all the zones in the page ocrPage.Zones.Clear() ' Add our field zone Dim ocrZone As New OcrZone() ocrZone.ZoneType = OcrZoneType.Text ocrZone.Bounds = fieldBounds(i) ocrZone.Name = fieldNames(i) ' Optional Console.WriteLine("Adding the zone for field {0} to the page...", ocrZone.Name) ocrPage.Zones.Add(ocrZone) ' Recognize the page. This will only recognize the zone we added Console.WriteLine("Recognizing the page...") fieldValues(i) = ocrPage.RecognizeText(Nothing) Next End Using ' Shutdown the engine ' Note: calling Dispose will also automatically shutdown the engine if it has been started Console.WriteLine("Shutting down...") ocrEngine.Shutdown() End Using ' We are done, show the fields Console.WriteLine("-------------------------------------") Console.WriteLine("Done, values extracted from the form:") Console.WriteLine("-------------------------------------") For i As Integer = 0 To fieldCount - 1 Console.WriteLine("{0} : {1}", fieldNames(i), fieldValues(i)) Next End Sub Private Function GetMyForm() As String Dim formFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "MyForm.tif") ' In this example we will create the form every time ' This will be a TIF file 11 by 8.5 inches in size containing a name, address and social security fields Using image As RasterImage = New RasterImage( _ RasterMemoryFlags.Conventional, _ 2544, _ 3294, _ 24, _ RasterByteOrder.Bgr, _ RasterViewPerspective.BottomLeft, _ Nothing, _ IntPtr.Zero, _ 0) image.XResolution = 300 image.YResolution = 300 ' Draw our fields into this image Dim hdc As IntPtr = RasterImagePainter.CreateLeadDC(image) Try Using g As Graphics = Graphics.FromHdc(hdc) g.FillRectangle(Brushes.White, 0, 0, image.ImageWidth - 1, image.ImageHeight - 1) Using f As New Font("Times New Roman", 80, FontStyle.Regular) Using p As New Pen(Color.Black, 4) Using sf As New StringFormat() sf.LineAlignment = StringAlignment.Center ' Draw the fields ' Name g.DrawString("Name:", f, Brushes.Black, 200, 200) Dim rc As New Rectangle(800, 160, 1500, 220) g.DrawRectangle(p, rc) Dim value As String = "John Doe" g.DrawString(value, f, Brushes.Black, rc, sf) ' Address g.DrawString("Address:", f, Brushes.Black, 200, 600) rc = New Rectangle(800, 560, 1500, 220) g.DrawRectangle(p, rc) value = "1234 Main Street, USA" g.DrawString(value, f, Brushes.Black, rc, sf) ' Social security number g.DrawString("SSN:", f, Brushes.Black, 200, 1000) rc = New Rectangle(800, 960, 1500, 220) g.DrawRectangle(p, rc) value = "123-45-6789" g.DrawString(value, f, Brushes.Black, rc, sf) End Using End Using End Using End Using Finally RasterImagePainter.DeleteLeadDC(hdc) End Try ' Save this image to disk Using codecs As New RasterCodecs() codecs.Save(image, formFileName, RasterImageFormat.CcittGroup4, 1) End Using End Using Return formFileName End Function Public NotInheritable Class LEAD_VARS Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images" End Class
public void RecognizeTextExample() { // Get the form file name Console.WriteLine("Setting up the form..."); string formFileName = GetMyForm(); // Assume we get the field informations from an external source such as a database or an XML file string[] fieldNames = { "Name", "Address", "SSN" }; LogicalRectangle[] fieldBounds = { new LogicalRectangle(800, 160, 1500, 220, LogicalUnit.Pixel), new LogicalRectangle(800, 560, 1500, 220, LogicalUnit.Pixel), new LogicalRectangle(800, 960, 1500, 220, LogicalUnit.Pixel) }; int fieldCount = fieldNames.Length; string[] fieldValues = new string[fieldCount]; // Create an instance of the engine using(IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Plus, false)) { // Start the engine using default parameters Console.WriteLine("Starting up the engine..."); ocrEngine.Startup(null, null, null, null); // Create a document IOcrDocumentManager ocrDocumentManager = ocrEngine.DocumentManager; using(IOcrDocument ocrDocument = ocrDocumentManager.CreateDocument()) { // Add the form to the document Console.WriteLine("Adding the form to the document..."); IOcrPage ocrPage = ocrDocument.Pages.AddPage(formFileName, null); // Get our fields for(int i = 0; i < fieldCount; i++) { // Clear all the zones in the page ocrPage.Zones.Clear(); // Add our field zone OcrZone ocrZone = new OcrZone(); ocrZone.ZoneType = OcrZoneType.Text; ocrZone.Bounds = fieldBounds[i]; ocrZone.Name = fieldNames[i]; // Optional Console.WriteLine("Adding the zone for field {0} to the page...", ocrZone.Name); ocrPage.Zones.Add(ocrZone); // Recognize the page. This will only recognize the zone we added Console.WriteLine("Recognizing the page..."); fieldValues[i] = ocrPage.RecognizeText(null); } } // Shutdown the engine // Note: calling Dispose will also automatically shutdown the engine if it has been started Console.WriteLine("Shutting down..."); ocrEngine.Shutdown(); } // We are done, show the fields Console.WriteLine("-------------------------------------"); Console.WriteLine("Done, values extracted from the form:"); Console.WriteLine("-------------------------------------"); for(int i =0; i < fieldCount; i++) Console.WriteLine("{0} : {1}", fieldNames[i], fieldValues[i]); } private string GetMyForm() { string formFileName = LEAD_VARS.ImagesDir + "MyForm.tif"; // In this example we will create the form every time // This will be a TIF file 11 by 8.5 inches in size containing a name, address and social security fields using(RasterImage image = new RasterImage( RasterMemoryFlags.Conventional, 2544, 3294, 24, RasterByteOrder.Bgr, RasterViewPerspective.BottomLeft, null, IntPtr.Zero, 0)) { image.XResolution = 300; image.YResolution = 300; // Draw our fields into this image IntPtr hdc = RasterImagePainter.CreateLeadDC(image); try { using(Graphics g = Graphics.FromHdc(hdc)) { g.FillRectangle(Brushes.White, 0, 0, image.ImageWidth - 1, image.ImageHeight - 1); using(Font f = new Font("Times New Roman", 80, FontStyle.Regular)) { using(Pen p = new Pen(Color.Black, 4)) { using(StringFormat sf = new StringFormat()) { sf.LineAlignment = StringAlignment.Center; // Draw the fields // Name g.DrawString("Name:", f, Brushes.Black, 200, 200); Rectangle rc = new Rectangle(800, 160, 1500, 220); g.DrawRectangle(p, rc); string value = "John Doe"; g.DrawString(value, f, Brushes.Black, rc, sf); // Address g.DrawString("Address:", f, Brushes.Black, 200, 600); rc = new Rectangle(800, 560, 1500, 220); g.DrawRectangle(p, rc); value = "1234 Main Street, USA"; g.DrawString(value, f, Brushes.Black, rc, sf); // Social security number g.DrawString("SSN:", f, Brushes.Black, 200, 1000); rc = new Rectangle(800, 960, 1500, 220); g.DrawRectangle(p, rc); value = "123-45-6789"; g.DrawString(value, f, Brushes.Black, rc, sf); } } } } } finally { RasterImagePainter.DeleteLeadDC(hdc); } // Save this image to disk using(RasterCodecs codecs = new RasterCodecs()) { codecs.Save(image, formFileName, RasterImageFormat.CcittGroup4, 1); } } return formFileName; } static class LEAD_VARS { public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images"; }
[TestMethod] public async Task RecognizeTextExample() { // Get the form file name Debug.WriteLine("Setting up the form..."); string formFileName = @"Assets\MyForm.tif"; // Assume we get the field informations from an external source such as a database or an XML file string[] fieldNames = { "Name", "Address", "SSN" }; LeadRect[] fieldBounds = { LeadRectHelper.Create(800, 160, 1500, 220), LeadRectHelper.Create(800, 560, 1500, 220), LeadRectHelper.Create(800, 960, 1500, 220) }; int fieldCount = fieldNames.Length; string[] fieldValues = new string[fieldCount]; // Create an instance of the engine IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false); // Start the engine using default parameters Debug.WriteLine("Starting up the engine..."); ocrEngine.Startup(null, null, String.Empty, Tools.OcrEnginePath); // Create a document IOcrDocumentManager ocrDocumentManager = ocrEngine.DocumentManager; IOcrDocument ocrDocument = ocrDocumentManager.CreateDocument(); // Load the form image using (RasterCodecs codecs = new RasterCodecs()) { StorageFile loadFile = await Tools.AppInstallFolder.GetFileAsync(formFileName); using (RasterImage image = await codecs.LoadAsync(LeadStreamFactory.Create(loadFile))) { // Add the form to the document Debug.WriteLine("Adding the form to the document..."); IOcrPage ocrPage = ocrDocument.Pages.AddPage(image, null); // Get our fields for (int i = 0; i < fieldCount; i++) { // Clear all the zones in the page ocrPage.Zones.Clear(); // Add our field zone OcrZone ocrZone = new OcrZone(); ocrZone.ZoneType = OcrZoneType.Text; ocrZone.Bounds = fieldBounds[i]; ocrZone.Name = fieldNames[i]; // Optional Debug.WriteLine("Adding the zone for field {0} to the page...", ocrZone.Name); ocrPage.Zones.Add(ocrZone); // Recognize the page. This will only recognize the zone we added Debug.WriteLine("Recognizing the page..."); fieldValues[i] = ocrPage.RecognizeText(null); } } } // Shutdown the engine Debug.WriteLine("Shutting down..."); ocrEngine.Shutdown(); // We are done, show the fields Debug.WriteLine("-------------------------------------"); Debug.WriteLine("Done, values extracted from the form:"); Debug.WriteLine("-------------------------------------"); for(int i =0; i < fieldCount; i++) Debug.WriteLine("{0} : {1}", fieldNames[i], fieldValues[i]); }
Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2
IOcrPage Interface
IOcrPage Members
IOcrPageCollection Interface
IOcrZoneCollection Interface
Recognize Method
IsRecognized Property
Unrecognize Method
OcrZone Structure
AutoZone
GetRecognizedCharacters Method
SetRecognizedCharacters Method
OcrCharacter Structure
IOcrPageCharacters Interface
IOcrZoneCharacters Interface
Programming with the LEADTOOLS .NET OCR
Recognizing OCR Pages
OCR Confidence Reporting