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.dll
    • Leadtools.Forms.DocumentWriters.dll
    • Leadtools.Forms.Ocr.dll
    • Leadtools.Forms.Ocr.Advantage.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; 
          using Leadtools.Forms.Ocr; 
          using Leadtools.Forms.DocumentWriters; 
         

    VB
          Imports Leadtools 
          Imports Leadtools.Codecs 
          Imports Leadtools.Drawing 
          Imports Leadtools.Controls 
          Imports Leadtools.Forms 
          Imports Leadtools.Forms.Ocr 
          Imports Leadtools.Forms.DocumentWriters 
         

  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) 
          { 
             // 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.Advantage, false); 
             // Startup the engine 
             _ocrEngine.Startup(null, null, null, @"C:\LEADTOOLS 19\Bin\Common\OcrAdvantageRuntime"); 
             // 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 LogicalRectangle(10, 10, _ocrPage.Width - 20, 100, LogicalUnit.Pixel); 
             _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) 
             ' 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.Advantage, False) 
             ' Startup the engine 
             _ocrEngine.Startup(Nothing, Nothing, Nothing, "C:\LEADTOOLS 19\Bin\Common\OcrAdvantageRuntime") 
             ' 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 our user defined one 
             Dim zone As New OcrZone() 
             zone.Name = "Custom zone" 
             zone.ZoneType = OcrZoneType.Text 
             zone.Bounds = New LogicalRectangle(10, 10, _ocrPage.Width - 20, 100, LogicalUnit.Pixel) 
             _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 
                LogicalRectangle zoneBounds = zone.Bounds; 
                // The zone bounds is a logical rectangle, it may be in units other than pixels. Convert to pixels 
                LeadRect bounds = zoneBounds.ToRectangle(_ocrPage.DpiX, _ocrPage.DpiY); 
                // Convert the bound 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 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 LogicalRectangle = zone.Bounds 
                ' The zone bounds is a logical rectangle, it may be in units other than pixels. Convert to pixels 
                Dim bounds As LeadRect = zoneBounds.ToRectangle(_ocrPage.DpiX, _ocrPage.DpiY) 
                ' Convert the bound 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 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 coordinate 
             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 LogicalPoint(point.X, point.Y, LogicalUnit.Pixel)); 
             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 coordinate 
             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 LogicalPoint(point.X, point.Y, LogicalUnit.Pixel)) 
             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 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 we have 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 19.0.2017.10.19
Products | Support | Contact Us | Copyright Notices
© 1991-2017 LEAD Technologies, Inc. All Rights Reserved.
LEADTOOLS Imaging, Medical, and Document