OCR Tutorial - Adding and Painting Zones

Take the following steps to create and run a program that shows how to add/delete and paint the zones in an OCR document. Remember, the purpose of the tutorials is to provide you with a quick and easy way to generate an OCR program.

  1. Start Visual Studio

  2. Choose File->New->Project from the menu.

  3. In the New Project dialog box, choose either "Visual C# Projects" or "VB Projects" in the Projects Type List, and choose "Windows Application" or "Windows Forms Application" depending on your Visual Studio version from the Templates List.

  4. Type the project name as "OcrTutorial1" in the Project Name field, and then choose OK. If desired, type a new location for your project or select a directory using the Browse button, and then choose OK.

  5. In the "Solution Explorer" window, right-click on the "References" folder, and select "Add Reference..." from the context menu. In the "Add Reference" dialog box, select the ".NET" tab and browse to LEADTOOLS For .NET "<LEADTOOLS_INSTALLDIR>\Bin\DotNet4\Win32" folder and select the following DLLs:

    • Leadtools.dll
    • Leadtools.Drawing.dll
    • Leadtools.Codecs.dll
    • Leadtools.Controls.WinForms.dll
    • Leadtools.Forms.Common.dll
    • Leadtools.Document.Writer.dll
    • Leadtools.Ocr.dll
    • Leadtools.Ocr.LEADEngine.dll
    • Leadtools.Codecs.Bmp.dll
    • Leadtools.Codecs.Cmp.dll
    • Leadtools.Codecs.Tif.dll
    • Leadtools.Codecs.Fax.dll

    Note: The Leadtools.Codecs.*.dll references added are for the BMP, JPG, CMP, TIF and FAX image file formats. Add any additional file format codec DLL if required in your application.

  6. Switch to Form1 code view (Right-click Form1 in the solution explorer then select View Code) and add the following lines at the beginning of the file after any using or Imports section if there are any:

    C#
          using Leadtools; 
          using Leadtools.Codecs; 
          using Leadtools.Drawing; 
          using Leadtools.Controls; 
          using Leadtools.Forms.Common; 
          using Leadtools.Ocr; 
          using Leadtools.Document.Writer; 
         

    VB
          Imports Leadtools 
          Imports Leadtools.Codecs 
          Imports Leadtools.Drawing 
          Imports Leadtools.Controls 
          Imports Leadtools.Forms.Common 
          Imports Leadtools.Ocr 
          Imports Leadtools.Document.Writer 
         

  7. Add the following private variables to the Form1 class:

    C#
          private ImageViewer _imageViewer; 
          private IOcrEngine _ocrEngine; 
          private IOcrPage _ocrPage; 
         

    VB
          Private _imageViewer As ImageViewer 
          Private _ocrEngine As IOcrEngine 
          Private _ocrPage As IOcrPage 
         

  8. Override Form1OnLoad and add the following code:

    C#
          protected override void OnLoad(EventArgs e) 
          { 
             string MY_LICENSE_FILE = @"C:\LEADTOOLS 20\Common\License\leadtools.lic"; 
             string MY_DEVELOPER_KEY = System.IO.File.ReadAllText(@"C:\LEADTOOLS 20\Common\License\leadtools.lic.key"); 
     
             RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DEVELOPER_KEY); 
             // Add the image viewer to the form 
             _imageViewer = new ImageViewer(); 
             _imageViewer.Dock = DockStyle.Fill; 
             Controls.Add(_imageViewer); 
             _imageViewer.BringToFront(); 
             // Show images using their true size 
             _imageViewer.UseDpi = true; 
             // Add ability to pan/zoom with the mouse, but disable double-click-size-mode support because we will use our own 
             ImageViewerPanZoomInteractiveMode panZoomMode = new ImageViewerPanZoomInteractiveMode(); 
             panZoomMode.DoubleTapSizeMode = ControlSizeMode.None; 
             _imageViewer.InteractiveModes.Add(panZoomMode); 
                     
             // Initialize the OCR engine 
             _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, false); 
             // Start up the engine 
             _ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime"); 
             // Create the OCR page from an image 
             string fileName = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr1.tif"; 
             RasterImage rasterImage = _ocrEngine.RasterCodecsInstance.Load(fileName, 1); 
             _ocrPage = _ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose); 
             // Auto-zone this page 
             _ocrPage.AutoZone(null); 
             // Add an extra zone, this is our user-defined one 
             OcrZone zone = new OcrZone(); 
             zone.Name = "Custom zone"; 
             zone.ZoneType = OcrZoneType.Text; 
             zone.Bounds = new LeadRect(10, 10, _ocrPage.Width - 20, 100); 
             _ocrPage.Zones.Add(zone); 
             // Show this image in the viewer 
             _imageViewer.Image = _ocrPage.GetRasterImage(); 
             Text = "Right-click on any zone to remove it from the page, double-click anywhere to save the result as a PDF file"; 
                     
             // Hook to the events we will use 
             _imageViewer.PostRender += _imageViewer_PostRender; 
             _imageViewer.MouseDown += _imageViewer_MouseDown; 
             _imageViewer.MouseDoubleClick += _imageViewer_MouseDoubleClick; 
                     
             base.OnLoad(e); 
          } 
         

    VB
          Protected Overrides Sub OnLoad(e As EventArgs) 
             ' Requires a license file that unlocks 1D barcode read functionality. 
             Dim MY_LICENSE_FILE As String = "C:\LEADTOOLS 20\Common\License\leadtools.lic" 
             Dim MY_DEVELOPER_KEY As String = System.IO.File.ReadAllText("C:\LEADTOOLS 20\Common\License\leadtools.lic.key") 
             RasterSupport.SetLicense(MY_LICENSE_FILE, MY_DEVELOPER_KEY) 
     
             ' Add the image viewer to the form 
             _imageViewer = New ImageViewer() 
             _imageViewer.Dock = DockStyle.Fill 
             Controls.Add(_imageViewer) 
             _imageViewer.BringToFront() 
             ' Show images using their true size 
             _imageViewer.UseDpi = True 
             ' Add ability to pan/zoom with the mouse, but disable double-click-size-mode support because we will use our own 
             Dim panZoomMode As New ImageViewerPanZoomInteractiveMode() 
             panZoomMode.DoubleTapSizeMode = ControlSizeMode.None 
             _imageViewer.InteractiveModes.Add(panZoomMode) 
                     
             ' Initialize the OCR engine 
             _ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.LEAD, False) 
             ' Start up the engine 
             _ocrEngine.Startup(Nothing, Nothing, Nothing, "C:\LEADTOOLS 20\Bin\Common\OcrLEADRuntime") 
             ' Create the OCR page from an image 
             Dim fileName As String = "C:\Users\Public\Documents\LEADTOOLS Images\Ocr1.tif" 
             Dim rasterImage As RasterImage = _ocrEngine.RasterCodecsInstance.Load(fileName, 1) 
             _ocrPage = _ocrEngine.CreatePage(rasterImage, OcrImageSharingMode.AutoDispose) 
             ' Auto-zone this page 
             _ocrPage.AutoZone(Nothing) 
             ' Add an extra zone, this is the user-defined one 
             Dim zone As New OcrZone() 
             zone.Name = "Custom zone" 
             zone.ZoneType = OcrZoneType.Text 
             zone.Bounds = New LeadRect(10, 10, _ocrPage.Width - 20, 100) 
             _ocrPage.Zones.Add(zone) 
             ' Show this image in the viewer 
             _imageViewer.Image = _ocrPage.GetRasterImage() 
             Text = "Right-click on any zone to remove it from the page, double-click anywhere to save the result as a PDF file" 
                     
             ' Hook to the events we will use 
             AddHandler _imageViewer.PostRender, AddressOf _imageViewer_PostRender 
             AddHandler _imageViewer.MouseDown, AddressOf _imageViewer_MouseDown 
             AddHandler _imageViewer.MouseDoubleClick, AddressOf _imageViewer_MouseDoubleClick 
                     
             MyBase.OnLoad(e) 
          End Sub 
         

  9. Override Form1OnFormClosed and add the following code:

    C#
          protected override void OnFormClosed(FormClosedEventArgs e) 
          { 
             // Destroy the page 
             _ocrPage.Dispose(); 
                      
             // And the engine 
             _ocrEngine.Dispose(); 
                      
             base.OnFormClosed(e); 
          } 
         

    VB
          Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs) 
             ' Destroy the page 
             _ocrPage.Dispose() 
                      
             ' And the engine 
             _ocrEngine.Dispose() 
                      
             MyBase.OnFormClosed(e) 
          End Sub 
         

  10. Add the following code to handle the image viewer post render event. Draw our zones:

    C#
          private void _imageViewer_PostRender(object sender, ImageViewerRenderEventArgs e) 
          { 
             // Draw the zones 
             foreach (OcrZone zone in _ocrPage.Zones) 
             { 
                // Get the zone boundary 
                LeadRect bounds = zone.Bounds; 
                // Convert the bounds to what we see in the viewer 
                // Note that this demo does not have rotation; otherwise, you need to use the four corner points 
                bounds = _imageViewer.ConvertRect(null, ImageViewerCoordinateType.Image, ImageViewerCoordinateType.Control, bounds); 
                      
                // If this is our custom zone, draw its border with a red pen, else use a blue pen 
                if(zone.Name == "Custom zone") 
                   e.PaintEventArgs.Graphics.DrawRectangle(Pens.Red, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); 
                else 
                   e.PaintEventArgs.Graphics.DrawRectangle(Pens.Blue, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); 
             } 
          } 
         

    VB
          Private Sub _imageViewer_PostRender(sender As Object, e As ImageViewerRenderEventArgs) 
             ' Draw the zones 
             For Each zone As OcrZone In _ocrPage.Zones 
                ' Get the zone boundary 
                Dim zoneBounds As LeadRect = zone.Bounds 
                ' Convert the bounds to what we see in the viewer 
                ' Note that this demo does not have rotation; otherwise, you need to use the four corner points 
                bounds = _imageViewer.ConvertRect(Nothing, ImageViewerCoordinateType.Image, ImageViewerCoordinateType.Control, bounds) 
                      
                ' If this is our custom zone, draw its border with a red pen, else use a blue pen 
                If zone.Name = "Custom zone" Then 
                   e.PaintEventArgs.Graphics.DrawRectangle(Pens.Red, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1) 
                Else 
                   e.PaintEventArgs.Graphics.DrawRectangle(Pens.Blue, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1) 
                End If 
             Next 
          End Sub 
         

  11. Add the following code to handle the viewer mouse down event. Delete zones:

    C#
          private void _imageViewer_MouseDown(object sender, MouseEventArgs e) 
          { 
             // Check if this is a right-button click 
             if (e.Button != MouseButtons.Right) 
                return; 
     
             // Convert the point from control to image coordinates 
             LeadPoint point = new LeadPoint(e.X, e.Y); 
             point = _imageViewer.ConvertPoint(null, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, point); 
                      
             // Use the HitTestZone method to find the zone under the mouse button 
             int zoneIndex = _ocrPage.HitTestZone(new LeadPoint(point.X, point.Y)); 
             if(zoneIndex != -1) 
             { 
                // Remove this zone 
                _ocrPage.Zones.RemoveAt(zoneIndex); 
                // Re-paint the viewer to show the zones left 
                _imageViewer.Invalidate(); 
                _imageViewer.Update(); 
                // If no zones are left, show a message 
                if(_ocrPage.Zones.Count == 0) 
                   MessageBox.Show(this, "No zones left in the page, saving this document to PDF is disabled now"); 
             } 
          } 
         

    VB
          Private Sub _imageViewer_MouseDown(sender As Object, e As MouseEventArgs) 
             ' Check if this is a right-button click 
             If e.Button <> MouseButtons.Right Then Return 
                      
             ' Convert the point from control to image coordinates 
             Dim point As New LeadPoint(e.X, e.Y) 
             point = _imageViewer.ConvertPoint(Nothing, ImageViewerCoordinateType.Control, ImageViewerCoordinateType.Image, point) 
     
             ' Use the HitTestZone method to find the zone under the mouse button 
             Dim zoneIndex As Integer = _ocrPage.HitTestZone(New LeadPoint(point.X, point.Y)) 
             If zoneIndex <> -1 Then 
                ' Remove this zone 
                _ocrPage.Zones.RemoveAt(zoneIndex) 
                ' Re-paint the viewer to show the zones left 
                _imageViewer.Invalidate() 
                _imageViewer.Update() 
                ' If no zones are left, show a message 
                If _ocrPage.Zones.Count = 0 Then 
                   MessageBox.Show(Me, "No zones left in the page, saving this document to PDF is disabled now") 
                End If 
             End If 
          End Sub 
         

  12. Finally add the following code to handle a mouse double-click. Save the document:

    C#
          private void _imageViewer_MouseDoubleClick(object sender, MouseEventArgs e) 
          { 
             // Check if we have any zones in the page 
             if (_ocrPage.Zones.Count == 0) 
             { 
                MessageBox.Show(this, "No zones left in the page, saving this document to PDF is disabled"); 
                return; 
             } 
     
             // Yes, recognize 
             string pdfFileName = @"C:\Users\Public\Documents\LEADTOOLS Images\Ocr1.pdf"; 
     
             // Try to delete the file if it exists. Might be open by the external application from previous operation 
             if (System.IO.File.Exists(pdfFileName)) 
             { 
                try 
                { 
                   System.IO.File.Delete(pdfFileName); 
                } 
                catch 
                { 
                   MessageBox.Show(this, "The file is probably opened in an external viewer. Close it and try again"); 
                   return; 
                } 
             } 
     
             _ocrPage.Recognize(null); 
     
             // Create a document 
             using (IOcrDocument ocrDocument = _ocrEngine.DocumentManager.CreateDocument(null, OcrCreateDocumentOptions.AutoDeleteFile)) 
             { 
                // Add the page 
                ocrDocument.Pages.Add(_ocrPage); 
                // Save as PDF 
                ocrDocument.Save(pdfFileName, DocumentFormat.Pdf, null); 
             } 
     
             // Show the document 
             System.Diagnostics.Process.Start(pdfFileName); 
          } 
         

    VB
          Private Sub _imageViewer_MouseDoubleClick(sender As Object, e As MouseEventArgs) 
             ' Check if there are any zones in the page 
             If _ocrPage.Zones.Count = 0 Then 
                MessageBox.Show(Me, "No zones left in the page, saving this document to PDF is disabled") 
                Return 
             End If 
     
             ' Yes, recognize 
             Dim pdfFileName As String = "C:\Users\Public\Documents\LEADTOOLS Images\Ocr1.pdf" 
     
             ' Try to delete the file if it exists. Might be open by the external application from previous operation 
             If System.IO.File.Exists(pdfFileName) Then 
                Try 
                   System.IO.File.Delete(pdfFileName) 
                Catch 
                   MessageBox.Show(Me, "The file is probably opened in an external viewer. Close it and try again") 
                   Return 
                End Try 
             End If 
     
             _ocrPage.Recognize(Nothing) 
     
             ' Create a document 
             Using ocrDocument As IOcrDocument = _ocrEngine.DocumentManager.CreateDocument(Nothing, OcrCreateDocumentOptions.AutoDeleteFile) 
                ' Add the page 
                ocrDocument.Pages.Add(_ocrPage) 
                ' Save as PDF 
                ocrDocument.Save(pdfFileName, DocumentFormat.Pdf, Nothing) 
             End Using 
     
             ' Show the document 
             System.Diagnostics.Process.Start(pdfFileName) 
          End Sub 
         

  13. Save this project to use for testing other code samples.

Help Version 20.0.2018.3.2
Products | Support | Contact Us | Copyright Notices
© 1991-2018 LEAD Technologies, Inc. All Rights Reserved.
LEADTOOLS Imaging, Medical, and Document