To create and run a program that demonstrates how to add pages to an OCR document using Ltocr.h. This program will allow page insertion and to save the inserted page:
In the Imports.cpp, add the following lines:
#if defined(WIN64)#pragma comment(lib, "..\\..\\..\\Lib\\CDLLVC10\\x64\\Ltocr_x.lib")#else#pragma comment(lib, "..\\..\\..\\Lib\\CDLLVC10\\Win32\\Ltocr_u.lib")#endif // #if defined(WIN64)
Add the following line in StdAfx.h in the OCR_Ltocr directory:
/* LEADTOOLS main OCR document header file */#include "..\..\..\include\ltocr.h"#include "..\..\..\include\ltdlg.h"
Define the following global variables in Ezfunc.h in the OCR_Ltocr directory:
#define IDM_INSERT_PAGE 200#define IDM_SAVE_ADDED_PAGE 300L_OcrEngine hEngine; /* OCR Engine handle */L_OcrPage hPage; /* OCR Page handle */L_OcrDocumentManager hDocumentManager; /* OCR Document Manager handle */L_OcrDocument hDocument; /* OCR Document handle */
Add the following statements in Ezfunc.cpp in the WinMain function as follows:
L_SetLicenseFile(TEXT("MyLicenseFile"), TEXT("DeveloperKey"));L_INT nRet = L_OcrEngineManager_CreateEngine(L_OcrEngineType_LEAD, &hEngine);if(nRet != SUCCESS)return 0;nRet = L_OcrEngine_Startup(hEngine, NULL, NULL);if(nRet != SUCCESS)return 0;nRet = L_OcrEngine_GetDocumentManager(hEngine, &hDocumentManager);if(nRet != SUCCESS)return 0;nRet = L_OcrDocumentManager_CreateDocument(hDocumentManager, &hDocument, L_OcrCreateDocumentOptions_AutoDeleteFile, NULL);if(nRet != SUCCESS)return 0;
Add the following after the GetMessage() loop before return statement:
L_OcrDocument_Destroy(hDocument);L_OcrEngine_Destroy(hEngine);
Edit EZFUNC.RC file in the OCR_Ltocr directory and add the following lines:
#include "EZFUNC.H"MAIN_MENU MENUBEGINMENUITEM "Insert Page" IDM_INSERT_PAGEMENUITEM "Save Added Page" IDM_SAVE_ADDED_PAGEEND
In Ezfunc.cpp in InitApplication, change the line:
wcWindowClass.lpszMenuName = NULL; to:
wcWindowClass.lpszMenuName = TEXT("MAIN_MENU"); 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)); 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*/ 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:{// Create the OCR page from the loaded bitmapnRet = L_OcrPage_FromBitmap(hEngine, &hPage, &LeadBitmap, L_OcrBitmapSharingMode_AutoFree, NULL, NULL);if (nRet != SUCCESS){MessageBox (NULL, TEXT("Error creating OCR page"), TEXT("Error"), MB_OK);/* We have an error, so post WM_DESTROY */PostMessage (hWnd, WM_DESTROY, 0, 0);return (FALSE);}// Add the created OCR page into the file-based OCR documentnRet = L_OcrDocument_AddPage(hDocument, hPage);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);}/* 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\n"),LeadBitmap.Width,LeadBitmap.Height,LeadBitmap.BitsPerPixel);MessageBox (NULL, achBuff, TEXT("Page Info"), MB_OK);}break;case IDM_SAVE_ADDED_PAGE:{BITMAPHANDLE ExportBmp;L_InitBitmap(&ExportBmp, sizeof(BITMAPHANDLE), 0, 0, 1);nRet = L_OcrPage_GetBitmap(hPage, L_OcrPageBitmapType_Original, &ExportBmp, sizeof(BITMAPHANDLE));if (nRet != SUCCESS){MessageBox(NULL, TEXT("Cannot retrieve page bitmap to save"), TEXT("Error!"), MB_OK);return 0;}L_TCHAR szFileName[MAX_PATH] = {0};lstrcpy(szFileName, TEXT("c:\\test.tif"));nRet = L_SaveBitmap(szFileName, ExportBmp, FILE_TIF, ExportBmp.BitsPerPixel, 0, NULL);if(nRet != SUCCESS){wsprintf (achBuff, TEXT("Error %d saving OCR page bitmap to %s"), nRet, szFileName);MessageBox(NULL, achBuff, TEXT("Error!"), MB_OK);return 0;}else{wsprintf (achBuff, TEXT("OCR page bitmap was saved to %s"), szFileName);MessageBox(NULL, achBuff, TEXT("Error!"), MB_OK);return 0;}}break;}return 0;/*Add code above*/
Delete or comment out the following lines from WM_DESTROY message since L_OcrPage_Destroy call will free the bitmap since the OCR page owns the bitmap handle and you don't own it any more and this is because we passed L_OcrBitmapSharingMode_AutoFree for the sharingMode parameter of the L_OcrPage_FromBitmap function.
/* Free the image, if there is one */if (LeadBitmap.Flags.Allocated)L_FreeBitmap (&LeadBitmap);
On the Build menu, select Build SimpleLoad.exe.