From 2c704b8fc7c46f27709381751342f3dcd352e628 Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Tue, 21 May 2024 10:36:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E6=99=B6=E7=89=88=E6=9C=AC=E8=B6=8A?= =?UTF-8?q?=E5=8D=97=E8=AF=AD=E4=B8=8B=E4=BD=BF=E7=94=A8=E4=B8=AD=E6=99=B6?= =?UTF-8?q?OCR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/scanner2/mainwindow.cpp | 161 +++++++++++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 20 deletions(-) diff --git a/app/scanner2/mainwindow.cpp b/app/scanner2/mainwindow.cpp index 522736ea..2c1b458e 100644 --- a/app/scanner2/mainwindow.cpp +++ b/app/scanner2/mainwindow.cpp @@ -4407,34 +4407,155 @@ void MainWindow::ocrMsgPumpFunc(HGMsgPump msgPump, const HGMsg *msg, HGPointer p { QString *filePath = (QString *)msg->data; - HGOCRMgr ocrMgr = NULL; - HGImgProc_CreateOCRMgr(HGIMGPROC_OCRALGO_DEFAULT, &ocrMgr); - if (NULL != ocrMgr) + bool useDefaultOcr = true; +#if defined(OEM_ZHONGJING) && defined(HG_CMP_MSC) + if (1258 == lang_get_cur_code_page()) { - HGImgFmtReader reader = NULL; - HGImgFmt_OpenImageReader(filePath->toLocal8Bit().toStdString().c_str(), 0, &reader); - if (NULL != reader) + useDefaultOcr = false; + + // 调用中晶OCR模块 + + std::string ocrPath; + HKEY hKey = NULL; +#ifdef _WIN64 + RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\WOW6432Node\\Microtek\\Microtek OCR Engine V1", 0, KEY_QUERY_VALUE, &hKey); +#else + RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microtek\\Microtek OCR Engine V1", 0, KEY_QUERY_VALUE, &hKey); +#endif + if (NULL != hKey) { - HGUInt count = 0; - HGImgFmt_GetImagePageCount(reader, &count); - for (HGUInt i = 0; i < count; ++i) + CHAR szData[MAX_PATH] = { 0 }; + DWORD cbData = MAX_PATH; + if (ERROR_SUCCESS == RegQueryValueExA(hKey, "InstallPath_Fast", NULL, NULL, (LPBYTE)szData, &cbData)) { - HGImage image = NULL; - HGImgFmt_LoadImageFromReader(reader, i, NULL, 0, 0, &image); - if (NULL != image) - { - HGImgProc_AddToImageOCRList(ocrMgr, image); - HGBase_DestroyImage(image); - } + ocrPath = szData; } - HGImgFmt_CloseImageReader(reader); + RegCloseKey(hKey); } - //HGBase_DeleteFile(filePath->toLocal8Bit().toStdString().c_str()); - HGImgProc_ImageListOCRToFile(ocrMgr, 0, filePath->toLocal8Bit().toStdString().c_str(), NULL, NULL); + if (!ocrPath.empty()) + { + HGChar tmpFileName[260]; + HGBase_GetTmpFileName(NULL, tmpFileName, 260); - HGImgProc_DestroyOCRMgr(ocrMgr); + DWORD len1 = GetEnvironmentVariableA("Path", NULL, 0); + char* env1 = (char *)malloc((size_t)len1 + 256); + if (NULL != env1) + { + memset(env1, 0, (size_t)len1 + 256); + GetEnvironmentVariableA("Path", env1, len1 + 256); + std::string ss(env1); + if (ss.find(ocrPath) == std::string::npos) + { + strcat(env1, ";"); + strcat(env1, ocrPath.c_str()); + SetEnvironmentVariableA("Path", env1); + } + + free(env1); + } + + char env2[256] = {0}; + strcat(env2, ocrPath.c_str()); + strcat(env2, "\\"); + strcat(env2, "tessdata_f"); + SetEnvironmentVariableA("TESSDATA_PREFIX", env2); + + const int MY_PIPE_BUFFER_SIZE = 1024; + //初始化管道 + HANDLE hPipeRead = NULL; + HANDLE hPipeWrite = NULL; + SECURITY_ATTRIBUTES saOutPipe; + ::ZeroMemory(&saOutPipe, sizeof(saOutPipe)); + saOutPipe.nLength = sizeof(SECURITY_ATTRIBUTES); + saOutPipe.lpSecurityDescriptor = NULL; + saOutPipe.bInheritHandle = TRUE; + CreatePipe(&hPipeRead, &hPipeWrite, &saOutPipe, MY_PIPE_BUFFER_SIZE); + + PROCESS_INFORMATION ProcessInfo; + ::ZeroMemory(&ProcessInfo, sizeof(ProcessInfo)); + STARTUPINFOA StartupInfo; + ZeroMemory(&StartupInfo, sizeof(StartupInfo)); + StartupInfo.cb = sizeof(StartupInfo); + StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + StartupInfo.hStdOutput = hPipeWrite; + StartupInfo.hStdError = hPipeWrite; + StartupInfo.wShowWindow = SW_HIDE; + + bool ret = false; + char cmd[1024] = {0}; + sprintf(cmd, "tesseract.exe \"%s\" \"%s\" -l %s --psm %d --oem %d %s", + filePath->toStdString().c_str(), tmpFileName, "vie", 3, 3, "pdf"); + BOOL b = CreateProcessA(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &StartupInfo, &ProcessInfo); + if (b) + { + WaitForSingleObject(ProcessInfo.hProcess, INFINITE); + DWORD exitCode; + GetExitCodeProcess(ProcessInfo.hProcess, &exitCode); + if (0 == exitCode) + ret = true; + + DWORD dwReadLen = 0; + DWORD dwStdLen = 0; + if (PeekNamedPipe(hPipeRead, NULL, 0, NULL, &dwReadLen, NULL) && dwReadLen > 0) + { + char szPipeOut[MY_PIPE_BUFFER_SIZE]; + ::ZeroMemory(szPipeOut, sizeof(szPipeOut)); + if (ReadFile(hPipeRead, szPipeOut, dwReadLen, &dwStdLen, NULL)) + { + + } + } + + CloseHandle(ProcessInfo.hProcess); + CloseHandle(ProcessInfo.hThread); + } + + CloseHandle(hPipeRead); + CloseHandle(hPipeWrite); + + if (ret) + { + strcat(tmpFileName, ".pdf"); + DeleteFileA(filePath->toLocal8Bit().toStdString().c_str()); + MoveFileA(tmpFileName, filePath->toLocal8Bit().toStdString().c_str()); + } + } + } +#endif + + if (useDefaultOcr) + { + HGOCRMgr ocrMgr = NULL; + HGImgProc_CreateOCRMgr(HGIMGPROC_OCRALGO_DEFAULT, &ocrMgr); + if (NULL != ocrMgr) + { + HGImgFmtReader reader = NULL; + HGImgFmt_OpenImageReader(filePath->toLocal8Bit().toStdString().c_str(), 0, &reader); + if (NULL != reader) + { + HGUInt count = 0; + HGImgFmt_GetImagePageCount(reader, &count); + for (HGUInt i = 0; i < count; ++i) + { + HGImage image = NULL; + HGImgFmt_LoadImageFromReader(reader, i, NULL, 0, 0, &image); + if (NULL != image) + { + HGImgProc_AddToImageOCRList(ocrMgr, image); + HGBase_DestroyImage(image); + } + } + + HGImgFmt_CloseImageReader(reader); + } + + //HGBase_DeleteFile(filePath->toLocal8Bit().toStdString().c_str()); + HGImgProc_ImageListOCRToFile(ocrMgr, 0, filePath->toLocal8Bit().toStdString().c_str(), NULL, NULL); + + HGImgProc_DestroyOCRMgr(ocrMgr); + } } delete filePath;