Working with Pages Using OCR Professional

To create and run a program that demonstrates how to add pages to an OCR document using Ltdoc2.h. This program will allow page insertion and to save the inserted page:

1.

Create a new directory in the \Examples\CDLL directory called OCR_Ltdoc2

2.

Copy everything in the SimpleLoad directory (copy only folders content) into the OCR_Ltdoc2 directory.

3.

Compile the project as it is and run SimpleLoad.exe to familiarize yourself with the basic program.

4.

In the Imports.cpp, add the following lines:

 

#if defined(WIN64) 
   …
   …
   #pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\x64\\Ltdoc2_x.lib")
#else
   …
   …
   #pragma comment(lib, "..\\..\\..\\Lib"L_VER_DESIGNATOR"\\CDLL\\Win32\\Ltdoc2_u.lib")
#endif // #if defined(WIN64) 

/* L_VER_DESIGNATOR is a macro that defines the version. For example for version 16 uses LTV16_CONFIG. To set it in Visual Studio 2005, go to the main menu.  Add in Project->Property->Configuration Properties->C/C++->Preprocessor: WIN32;_DEBUG;LTV16_CONFIG */

5.

Add the following line in StdAfx.h in the OCR_Ltdoc2 directory:

 

/* LEADTOOLS main OCR document header file */
#include "..\..\..\include\ltdoc2.h"
#include "..\..\..\include\ltdlg.h" 

6.

Define the following global variables in Ezfunc.h in the OCR_Ltdoc2 directory:

L_HDOC2 hDoc; /* OCR Document handle */
PAGEINFO2 PageInfo; 
DOC2_LANGIDS LangId[1]; 
L_BOOL bPageAdded; 
L_INT nSId; 

#define IDM_INSERT_PAGE        200
#define IDM_SAVE_ADDED_PAGE    300  

7.

Add the following statements in Ezfunc.cpp in the WinMain function as follows:

 

a.

Add the following before calling InitInstance() statement

   /* Note that this is a sample key, which will not work in your toolkit. You should replace the sample key */ 
   L_UnlockSupport (L_SUPPORT_OCR_PROFESSIONAL, TEXT("TestKey"));
   if (L_Doc2StartUp(&hDoc, NULL) != SUCCESS)
      return 0;
   L_Doc2CreateSettingsCollection(hDoc, -1, &nSId);
   L_Doc2SetActiveSettingsCollection(hDoc, nSId);

 

 

b.

Add the following after the GetMessage() loop before return statement

   L_Doc2DeleteSettingsCollection(hDoc, nSId);
   L_Doc2ShutDown(&hDoc); 

8.

Edit EZFUNC.RC file in the OCR_Ltdoc2 directory and add the following lines:

 

#include "EZFUNC.H"

MAIN_MENU   MENU
BEGIN
   MENUITEM "Insert Page"        IDM_INSERT_PAGE
   MENUITEM "Save Added Page"    IDM_SAVE_ADDED_PAGE
END

9.

In Ezfunc.cpp in InitApplication, change the line:

wcWindowClass.lpszMenuName = NULL;

to:

wcWindowClass.lpszMenuName = TEXT("MAIN_MENU");

 

10.

In Ezfunc.cpp in MainWndProc, change the line:

 

Demos_CombinePath(szImagesDirectory, L_TEXT("Image1.cmp"), szFilename, _countof(szFilename)); 

To: 

 

Demos_CombinePath(szImagesDirectory, L_TEXT("ocr1.tif"), szFilename, _countof(szFilename));

 

11.

In Ezfunc.cpp in InitInstance, change the menu parameter (tagged as /* Use the window class menu */) in CreateWindow from NULL to

LoadMenu(hInstance, MAKEINTRESOURCE("MAIN_MENU")), /*Main Menu*/

12.

In Ezfunc.cpp under WM_CREATE, add the following code after "L_LoadBitmap(…) if(…){…}" :

/*After code below*/
 nRet = L_LoadBitmap (szFilename, &LeadBitmap, sizeof(BITMAPHANDLE), 0, ORDER_BGR, NULL, NULL); 
 if (nRet != SUCCESS) 
 {
      wsprintf (achBuff, TEXT("Error %d loading %s"), nRet, (LPTSTR) szFilename); 
      MessageBox (NULL, achBuff, TEXT("Error"), MB_OK); 
      /* We have an error, so post WM_DESTROY */
      PostMessage (hWnd, WM_DESTROY, 0, 0); 
      return (FALSE); 
 }
/*After code above*/

/*Add code below*/
bPageAdded = FALSE;
    

13.

In Ezfunc.cpp after WM_PAINT and before WM_DESTROY, add a new switch statement called WM_COMMAND:

/*After code below*/
   case WM_PAINT: 
      /* Get the handle to the device context */
      hdc = BeginPaint (hWnd, &ps); 
      if (LeadBitmap.Flags.Allocated)  /* Do we have an image? */
      {
         if (hpalPaint) /* If we have a paint palette, select it */
         {
            hPalette = SelectPalette (hdc, hpalPaint, TRUE); 
            /* Uncomment this if you do not process WM_QUERYNEWPALETTE */
            /* RealizePalette (hdc); */
         }
         /* Paint the image */
         L_PaintDC (hdc, 
                    &LeadBitmap, 
                    &rLeadSource,   /* Source rectangle */
                    NULL,           /* Default source clip area */
                    &rLeadDest,     /* Destination rectangle */
                    &ps.rcPaint,    /* Dest clip set by WM_PAINT */
                   SRCCOPY);       /* Normal Paint */
         if (hpalPaint)         /* Return old palette */
            SelectPalette (hdc, hPalette, TRUE); 
      }
      EndPaint (hWnd, &ps);     /* Return DC */
      return (0); 
/*After code Above*/

/*Add code below*/
case WM_COMMAND: 
      switch(LOWORD(wParam)) 
      {
         case IDM_INSERT_PAGE: 
         {
              nRet = L_Doc2AddPage(hDoc, &LeadBitmap, 1); 
              if (nRet != SUCCESS) 
              {
                 wsprintf (achBuff, TEXT("Error %d adding page at index 0"), nRet); 
                 MessageBox (NULL, achBuff, TEXT("Error"), MB_OK); 
                 /* We have an error, so post WM_DESTROY */
                 PostMessage (hWnd, WM_DESTROY, 0, 0); 
                 return (FALSE); 
              }

              bPageAdded = TRUE; 
              L_Doc2SetActivePage(hDoc, 0); 

              memset(&PageInfo, 0, sizeof(PAGEINFO2)); 
              nRet = L_Doc2GetPageInfo (hDoc, 0, &PageInfo, sizeof(PAGEINFO2)); 
              if (nRet == SUCCESS) 
              {
                  L_INT nPageCount = 0; 
                  L_Doc2GetPageCount(hDoc, &nPageCount); 
                  L_Doc2SetActivePage(hDoc, nPageCount - 1); 
                  /* Force paint palette creation */
                  SendMessage (hWnd, WM_QUERYNEWPALETTE, 0, 0L); 
                  RedrawWindow(hWnd,0,0,256); 
                  wsprintf (achBuff, TEXT("Page Width = %d\nPage Height = %d\nPage Bits Per Pixel = %d\nPages Inserted = %d"),
                       PageInfo.nWidth, 
                       PageInfo.nHeight, 
                       PageInfo.nBitsPerPixel, 
                       nPageCount); 
                  MessageBox (NULL, achBuff, TEXT("Pages Info"), MB_OK); 
              }

              LangId[0] = DOC2_LANG_ID_ENGLISH; 
              nRet = L_Doc2SelectLanguages(hDoc, LangId, 1); 
              if (nRet != SUCCESS) 
              {
                  wsprintf (achBuff, TEXT("Error %d Setting English as the default language."), nRet); 
                  MessageBox (NULL, achBuff, TEXT("Error"), MB_OK); 

                  RemoveDocumentPages();
                  /* We have an error, so post WM_DESTROY */
                  PostMessage (hWnd, WM_DESTROY, 0, 0); 
                  return (FALSE); 
              }
         }
         break; 
      case IDM_SAVE_ADDED_PAGE:  
         {
            L_INT nPageCount=0; 
            L_INT nRet = L_Doc2GetPageCount(hDoc, &nPageCount); 
            if (nRet != SUCCESS) 
            {
               MessageBox(NULL, TEXT("Cannot get pages count"), TEXT("Error!"), MB_OK); 
               return 0; 
            }

            if (nPageCount <=0) 
            {
               MessageBox(NULL, TEXT("No added pages, please add pages first"), TEXT("Error!"), MB_OK); 
               return 0; 
            }

            BITMAPHANDLE ExportBmp; 
            L_InitBitmap(&ExportBmp, sizeof(BITMAPHANDLE), 0, 0, 1); 
            nRet = L_Doc2ExportPage(hDoc, &ExportBmp, sizeof(BITMAPHANDLE), 0); 
            if (nRet != SUCCESS) 
            {
               MessageBox(NULL, TEXT("Cannot export page to save"), TEXT("Error!"), MB_OK); 
               return 0; 
            }

            nRet = L_SaveBitmap(TEXT("c:\\test.tif"),
               &ExportBmp, 
               FILE_TIF, 
               ExportBmp.BitsPerPixel, 
               0, 
               NULL); 
L_FreeBitmap(&ExportBmp); 
         }
         break; 
      }
      return 0; 
/*Add code above*/

14.

Add the following function in EZFUNC.CPP in OCR_Ltdoc2 directory, add it at the end after "void CalcDisplay()" function:

void RemoveDocumentPages()

    L_INT nPageCount = 0; 
    L_INT i, nRet; 
    L_TCHAR szBuffer[1024]; 

    nRet = L_Doc2GetPageCount(hDoc, &nPageCount); 
    if (nRet == SUCCESS) 
    {
        for (i=0; i<nPageCount; i++)
        {
            L_Doc2CleanupPages(hDoc, TRUE); 
            nRet = L_Doc2RemovePage(hDoc, i); 
            if (nRet == SUCCESS) 
            {
                wsprintf(szBuffer, TEXT("The page # %d was removed successfully"), i); 
                MessageBox(NULL, szBuffer, TEXT("Notice!"), MB_OK); 
            }
        }
     }
   
}

15.

Also, add the following statement before the MainWndProc function

void RemoveDocumentPages();

 

16.

On the Build menu, select Build SimpleLoad.exe.

17.

On the Build menu, select Execute SimpleLoad.exe. (NOTE: Before building project, clean solution and project files. In Build, select Clean Solution and Clean SimpleLoad).

18.

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