#include "HGOCRHanvon.hpp" #include "HGOCR.h" #include "HGOCRRetImpl.hpp" #include "HGOCRRetImpl.hpp" #include "../base/HGUtility.h" #include "../imgfmt/HGBmp.h" template dst_type union_cast(src_type src) { union { src_type s; dst_type d; }u; u.s = src; return u.d; } HGUInt HGOCRHanvon::m_refCount = 0; HGOCRHanvon::HGOCRHanvon() { m_dll = NULL; m_ocrHandle = NULL; } HGOCRHanvon::~HGOCRHanvon() { } HGResult HGOCRHanvon::Init() { if (NULL != m_ocrHandle) { return HGBASE_ERR_FAIL; } assert(NULL == m_dll); HGChar oldDir[256]; HGBase_GetCurrentDir(oldDir, 256); HGChar moduleName[256]; HGBase_GetModuleName(union_cast(&HGOCRHanvon::Init), moduleName, 256); HGChar newDir[256]; HGBase_GetFilePath(moduleName, newDir, 256); HGBase_SetCurrentDir(newDir); #if defined(HG_CMP_MSC) HGResult ret = HGBase_CreateDll("hanwangOCRdetect.dll", &m_dll); #else HGResult ret = HGBase_CreateDll("libhwocrdetect.so", &m_dll); #endif HGBase_SetCurrentDir(oldDir); if (HGBASE_ERR_OK != ret) { return ret; } if (0 != HWOCR_SDKInitialize(&m_ocrHandle)) { HGBase_DestroyDll(m_dll); m_dll = NULL; return HGIMGPROC_ERR_FAIL; } if (0 == m_refCount) { //HWOCR_InitPdf(); } ++m_refCount; return HGBASE_ERR_OK; } HGResult HGOCRHanvon::Deinit() { if (NULL == m_ocrHandle) { return HGBASE_ERR_FAIL; } assert(0 != m_refCount); --m_refCount; if (0 == m_refCount) { //HWOCR_ExitPdf(); } HWOCR_SDKExit(m_ocrHandle); m_ocrHandle = NULL; HGBase_DestroyDll(m_dll); m_dll = NULL; return HGBASE_ERR_OK; } HGResult HGOCRHanvon::ImageOCR(HGImage image, class HGOCRRetImpl **ocrRet) { if (NULL == image || NULL == ocrRet) { return HGBASE_ERR_INVALIDARG; } HGChar tmpFileName[256]; HGBase_GetTmpFileName(tmpFileName, 256); strcat(tmpFileName, ".bmp"); HGImgFmt_SaveBmpImage(image, NULL, tmpFileName); char* rst = NULL; int len = 0; int ret = HWOCR_RecognizeFile2Str((unsigned char*)tmpFileName, m_ocrHandle, &rst, &len); if (0 != ret) { HGBase_DeleteFile(tmpFileName); return HGIMGPROC_ERR_FAIL; } assert(NULL != rst && len > 0); HGBase_DeleteFile(tmpFileName); std::vector blockInfo; blockInfo.push_back(rst); HWOCR_FreeStrRst(&rst); *ocrRet = new HGOCRRetImpl(blockInfo); return HGBASE_ERR_OK; } HGResult HGOCRHanvon::ImageOCRToFile(HGImage image, HGUInt outType, const HGChar *outFileName) { if (NULL == image || outType > HGIMGPROC_OCROUTTYPE_OFD || NULL == outFileName) { return HGBASE_ERR_INVALIDARG; } if (0 == outType) outType = GetOutTypeByFileName(outFileName); int fileType = -1; if (HGIMGPROC_OCROUTTYPE_RTF == outType) fileType = FILE_RTF; else if (HGIMGPROC_OCROUTTYPE_XLS == outType) fileType = FILE_XLS; else if (HGIMGPROC_OCROUTTYPE_TXT == outType) fileType = FILE_TXT; else if (HGIMGPROC_OCROUTTYPE_PDF == outType) fileType = FILE_PDF; else if (HGIMGPROC_OCROUTTYPE_OFD == outType) fileType = FILE_OFD; if (-1 == fileType) { return HGBASE_ERR_INVALIDARG; } HGChar tmpFileName[256]; HGBase_GetTmpFileName(tmpFileName, 256); strcat(tmpFileName, ".bmp"); HGImgFmt_SaveBmpImage(image, NULL, tmpFileName); HGChar tmpDir[256]; HGBase_GetTmpPath(tmpDir, 256); int ret = HWOCR_RecognizeFile((unsigned char*)tmpFileName, (unsigned char*)outFileName, fileType, m_ocrHandle, NULL, tmpDir); if (0 != ret) { HGBase_DeleteFile(tmpFileName); return HGIMGPROC_ERR_FAIL; } HGBase_DeleteFile(tmpFileName); return HGBASE_ERR_OK; } HGResult HGOCRHanvon::ImageTextDirectOCR(HGImage image, HGUInt* direct) { if (NULL == image || NULL == direct) { return HGBASE_ERR_INVALIDARG; } HGChar tmpFileName[256]; HGBase_GetTmpFileName(tmpFileName, 256); strcat(tmpFileName, ".bmp"); HGImgFmt_SaveBmpImage(image, NULL, tmpFileName); int dire = -1; int ret = HWOCR_GetFileDirect((unsigned char*)tmpFileName, m_ocrHandle, &dire); if (0 != ret) { HGBase_DeleteFile(tmpFileName); return HGIMGPROC_ERR_FAIL; } if (ROT0 == dire) *direct = HGIMGPROC_OCRTEXTDIRECT_ORI; else if (ROT90 == dire) *direct = HGIMGPROC_OCRTEXTDIRECT_RIGHT; else if (ROT180 == dire) *direct = HGIMGPROC_OCRTEXTDIRECT_180; else if (ROT270 == dire) *direct = HGIMGPROC_OCRTEXTDIRECT_LEFT; HGBase_DeleteFile(tmpFileName); return HGBASE_ERR_OK; } int HGOCRHanvon::HWOCR_SDKInitialize(void** ppstOcrHandle) { typedef int (*Func)(void**); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_SDKInitialize", (HGPointer *)&func); if (NULL == func) { return -1; } return func(ppstOcrHandle); } void HGOCRHanvon::HWOCR_SDKExit(void* pstOcrHandle) { typedef void (*Func)(void*); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_SDKExit", (HGPointer*)&func); if (NULL == func) { return; } func(pstOcrHandle); } void HGOCRHanvon::HWOCR_InitPdf() { typedef void (*Func)(); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_InitPdf", (HGPointer*)&func); if (NULL == func) { return; } func(); } void HGOCRHanvon::HWOCR_ExitPdf() { typedef void (*Func)(); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_ExitPdf", (HGPointer*)&func); if (NULL == func) { return; } func(); } int HGOCRHanvon::HWOCR_RecognizeFile2Str(unsigned char* ImgFile, void* pstHandle, char** ppRst, int* pnLen) { typedef int (*Func)(unsigned char*, void*, char**, int*); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFile2Str", (HGPointer*)&func); if (NULL == func) { return -1; } return func(ImgFile, pstHandle, ppRst, pnLen); } void HGOCRHanvon::HWOCR_FreeStrRst(char** ppRst) { typedef void (*Func)(char**); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_FreeStrRst", (HGPointer*)&func); if (NULL == func) { return; } func(ppRst); } int HGOCRHanvon::HWOCR_RecognizeFile(unsigned char* ImgFile, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir) { typedef int (*Func)(unsigned char*, unsigned char*, int, void*, char*, char*); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFile", (HGPointer*)&func); if (NULL == func) { return -1; } return func(ImgFile, OutFile, nFileType, pstHandle, pLibDir, pTmpDir); } int HGOCRHanvon::HWOCR_GetFileDirect(unsigned char* ImgFile, void* pstHandle, int* pDirect) { typedef int (*Func)(unsigned char*, void *, int *); Func func = NULL; HGBase_GetDllProcAddress(m_dll, "HWOCR_GetFileDirect", (HGPointer*)&func); if (NULL == func) { return -1; } return func(ImgFile, pstHandle, pDirect); }