中晶版本越南语下使用中晶OCR

This commit is contained in:
luoliangyi 2024-05-21 10:36:23 +08:00
parent 5e094457f4
commit 2c704b8fc7
1 changed files with 141 additions and 20 deletions

View File

@ -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;