code_app/app/scanner/ocrPdf.cpp

92 lines
2.7 KiB
C++
Raw Normal View History

2023-02-17 01:20:12 +00:00
#include <iostream>
#include <Windows.h>
#include <atlstr.h>
#include <string>
#include "base/HGUtility.h"
std::string getOcrPath()
{
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)
{
CHAR szData[MAX_PATH] = { 0 };
DWORD cbData = MAX_PATH;
if (ERROR_SUCCESS == RegQueryValueExA(hKey, "InstallPath_Fast", NULL, NULL, (LPBYTE)szData, &cbData))
{
ocrPath = szData;
}
RegCloseKey(hKey);
}
return ocrPath;
}
bool createOcrPdf(const std::string &imgPath, const std::string &dstFile)
{
std::string ocrPath = getOcrPath();
if (ocrPath.empty())
return false;
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);
strcat(env1, ";");
strcat(env1, ocrPath.c_str());
SetEnvironmentVariableA("Path", env1);
free(env1);
}
DWORD len2 = GetEnvironmentVariableA("TESSDATA_PREFIX", NULL, 0);
char* env2 = (char*)malloc((size_t)len2 + 256);
if (NULL != env2)
{
memset(env2, 0, (size_t)len2 + 256);
GetEnvironmentVariableA("TESSDATA_PREFIX", env2, len2 + 256);
strcat(env2, ocrPath.c_str());
strcat(env2, "\\");
strcat(env2, "tessdata_f");
SetEnvironmentVariableA("TESSDATA_PREFIX", env2);
free(env2);
}
// std::string imgPath("D:\\1.jpg");
// std::string dstFile("D:\\1");
DeleteFileA(dstFile.c_str());
PROCESS_INFORMATION ProcessInfo;
STARTUPINFOA StartupInfo;
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
HGChar prefix[256];
HGBase_GetFilePrefix(dstFile.c_str(), prefix, 256);
bool ret = false;
char cmd[1024] = {0};
sprintf(cmd, "tesseract.exe \"%s\" \"%s\" -l %s --psm %d --oem %d %s", imgPath.c_str(), prefix, "eng", 3, 3, "pdf");
BOOL b = CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &StartupInfo, &ProcessInfo);
if (b)
{
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
DWORD exitCode;
GetExitCodeProcess(ProcessInfo.hProcess, &exitCode);
if (0 == exitCode)
ret = true;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
}
return ret;
}