Compare commits

..

4 Commits

Author SHA1 Message Date
luoliangyi 17a4dbff25 webscan增加自动大小、纸张大小、空白页检测等配置 2024-10-17 10:41:45 +08:00
luoliangyi 7fa2e7872c 完善webscan文件类型设置功能 2024-10-16 17:35:11 +08:00
luoliangyi 77b5b76c85 1)增加立思辰webapi-demo
2)立思辰webscan增加扫描功能
2024-10-16 16:49:36 +08:00
luoliangyi e705ba136a webscan项目增加立思辰新webapi接口 2024-10-16 09:11:27 +08:00
8 changed files with 1778 additions and 88 deletions

View File

@ -4,8 +4,9 @@
WebServer::WebServer(HGMsgPump msgPump)
{
m_msgPump = msgPump;
m_currUserId = 1;
m_port = 0;
#if defined(HG_CMP_MSC)
m_sockServer = INVALID_SOCKET;
#else
@ -75,6 +76,7 @@ bool WebServer::Open(HGUShort port)
return false;
}
m_port = port;
m_sockServer = sockServer;
HGBase_OpenThread(ThreadFunc, this, &m_listenThread);
assert(NULL != m_listenThread);
@ -92,6 +94,17 @@ bool WebServer::Close()
return false;
}
#if defined(HG_CMP_MSC)
closesocket(m_sockServer);
m_sockServer = INVALID_SOCKET;
#else
close(m_sockServer);
m_sockServer = -1;
#endif
m_port = 0;
HGBase_CloseThread(m_listenThread);
m_listenThread = NULL;
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
@ -100,18 +113,14 @@ bool WebServer::Close()
pUser = NULL;
}
#if defined(HG_CMP_MSC)
closesocket(m_sockServer);
m_sockServer = INVALID_SOCKET;
#else
close(m_sockServer);
m_sockServer = -1;
#endif
HGBase_CloseThread(m_listenThread);
m_listenThread = NULL;
return true;
}
bool WebServer::IsOld()
{
return (9458 == m_port);
}
void WebServer::Connect(const ConnectParam* param)
{
assert(NULL != param && this == param->svr);
@ -232,6 +241,7 @@ int WebServer::GetUserIndex(HGUInt id)
void HGAPI WebServer::ThreadFunc(HGThread thread, HGPointer param)
{
(void)thread;
WebServer* p = (WebServer*)param;
while (1)

View File

@ -15,6 +15,7 @@ public:
bool Open(HGUShort port);
bool Close();
bool IsOld();
void Connect(const ConnectParam* param);
void DisConnect(const DisConnectParam* param);
@ -34,8 +35,9 @@ private:
private:
HGMsgPump m_msgPump;
HGUInt m_currUserId;
HGUShort m_port;
#if defined(HG_CMP_MSC)
SOCKET m_sockServer;
#else

View File

@ -1,7 +1,9 @@
#include "WebUser.h"
#include "WebServer.h"
#include "base/HGBase64.h"
#include "base/HGUtility.h"
#include "base/HGImage.h"
#include "base/HGTime.h"
#include "imgfmt/HGJpeg.h"
#include "sha1.h"
#include "base64.h"
@ -211,9 +213,28 @@ WebUser::WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::str
m_devNameList.clear();
m_devName.clear();
m_devHandle = NULL;
m_dpi = 0;
m_scanEvent = NULL;
HGChar defSavePath[256];
HGBase_GetCacheFilePath(defSavePath, 256);
m_filepath = defSavePath;
m_fileprefix = "img";
m_deletefilesbeforescan = "0";
m_filetype = "3";
m_filesuffix = "jpg";
m_writerFileName.clear();
m_imgFmtWriter = NULL;
m_writerFileValid = false;
m_showbase64 = "0";
m_source = "Adf-duplex";
m_mode = "Color";
m_resolution = "200";
m_pageauto = "yes";
m_papersize = "A4";
m_blankpageskip = "no";
m_blankpageskipsensitivity = "3";
m_multifeeddetection = "Stop";
SANE_Int version_code = 0;
sane_init_ex(&version_code, sane_ex_callback, this);
}
@ -232,7 +253,6 @@ WebUser::~WebUser()
if (NULL != m_devHandle)
{
m_dpi = 0;
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
@ -284,7 +304,6 @@ void WebUser::CloseDev(const CloseDevParam* param)
if (NULL != m_devHandle)
{
m_dpi = 0;
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
@ -310,11 +329,17 @@ void WebUser::ScanFinish(const ScanFinishParam* param)
void WebUser::HandleCmd(const WSCmdParam* param)
{
assert(NULL != param && m_id == param->usrId);
std::string cmdData((const char*)param->data, param->size);
cJSON* json = cJSON_Parse(cmdData.c_str());
if (NULL != json)
if (m_server->IsOld())
{
// OLD
cJSON* json = cJSON_Parse(cmdData.c_str());
if (NULL == json)
{
return;
}
std::string func = GetJsonStringValue(json, "Func");
if ("GetDeviceList" == func)
{
@ -347,6 +372,37 @@ void WebUser::HandleCmd(const WSCmdParam* param)
cJSON_Delete(json);
}
else
{
// NEW
if (cmdData == "CDEV")
{
GetDeviceListNew();
}
else if (cmdData == "CDEVPLUG")
{
DeviceListPlugNew();
}
else if (cmdData.find("COPT|") == 0)
{
GetSettingInfoNew(cmdData.substr(strlen("COPT|")));
}
else if (cmdData.find("CBASE64|") == 0)
{
ConvertToBase64New(cmdData.substr(strlen("CBASE64|")));
}
else if (cmdData.find("CSCAN|") == 0)
{
std::string param = cmdData.substr(strlen("CSCAN|"));
size_t pos = param.find("|");
if (std::string::npos != pos)
{
std::string devName = param.substr(0, pos);
std::string devParam = param.substr(pos + 1);
ScanNew(devName, devParam);
}
}
}
}
void WebUser::HandleEvent(const WSEvtParam* param)
@ -423,7 +479,6 @@ void WebUser::SelectDevice(cJSON* json)
if (NULL != m_devHandle)
{
m_dpi = 0;
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
@ -435,7 +490,6 @@ void WebUser::SelectDevice(cJSON* json)
{
m_devName = m_devNameList[index];
m_devHandle = dev;
m_dpi = GetDpi();
code = 0;
result.clear();
}
@ -520,7 +574,6 @@ void WebUser::SetDPI(cJSON* json)
{
if (SetParam(OPTION_TITLE_FBL, &dpi))
{
m_dpi = dpi;
code = 0;
result.clear();
}
@ -681,6 +734,355 @@ void WebUser::StartScan(cJSON* json)
}
}
void WebUser::GetDeviceListNew()
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SDEV"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2005));
std::string dataStr;
cJSON* arrayJson = cJSON_CreateArray();
HGBase_EnterLock(m_lockName);
for (int i = 0; i < (int)m_devNameList.size(); ++i)
{
cJSON* js = cJSON_CreateObject();
cJSON_AddItemToObject(js, "Index", cJSON_CreateNumber(i));
cJSON_AddItemToObject(js, "Name", cJSON_CreateString(m_devNameList[i].c_str()));
cJSON_AddItemToArray(arrayJson, js);
}
HGBase_LeaveLock(m_lockName);
cJSON* dataJson = cJSON_CreateObject();
cJSON_AddItemToObject(dataJson, "Devs", arrayJson);
char* str = cJSON_Print(dataJson);
if (NULL != str)
{
dataStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json"));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
free(resp);
}
cJSON_Delete(retJson);
}
}
void WebUser::DeviceListPlugNew()
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SDEVPLUG"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2005));
std::string dataStr;
cJSON* arrayJson = cJSON_CreateArray();
HGBase_EnterLock(m_lockName);
for (int i = 0; i < (int)m_devNameList.size(); ++i)
{
cJSON* js = cJSON_CreateObject();
cJSON_AddItemToObject(js, "Index", cJSON_CreateNumber(i));
cJSON_AddItemToObject(js, "Name", cJSON_CreateString(m_devNameList[i].c_str()));
cJSON_AddItemToArray(arrayJson, js);
}
HGBase_LeaveLock(m_lockName);
cJSON* dataJson = cJSON_CreateObject();
cJSON_AddItemToObject(dataJson, "Devs", arrayJson);
char* str = cJSON_Print(dataJson);
if (NULL != str)
{
dataStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json"));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
free(resp);
}
cJSON_Delete(retJson);
}
}
void WebUser::GetSettingInfoNew(const std::string& devName)
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SOPT"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2006));
std::string optStr;
std::string optListStr;
cJSON* optJson = cJSON_CreateObject();
if (NULL != optJson)
{
cJSON* optListJson = cJSON_CreateObject();
if (NULL != optListJson)
{
cJSON* arrayJson = cJSON_CreateArray();
bool find = false;
HGBase_EnterLock(m_lockName);
for (int i = 0; i < (int)m_devNameList.size(); ++i)
{
if (m_devNameList[i] == devName)
{
find = true;
break;
}
}
HGBase_LeaveLock(m_lockName);
if (find)
{
AddOptItem(optJson, arrayJson, "filepath", m_filepath.c_str(), NULL);
AddOptItem(optJson, arrayJson, "fileprefix", m_fileprefix.c_str(), NULL);
const char* deleteFileBeforeScanList[] = { "0", "1", NULL };
AddOptItem(optJson, arrayJson, "deletefilesbeforescan", m_deletefilesbeforescan.c_str(), deleteFileBeforeScanList);
const char* fileTypeList[] = { "1", "2", "3", "4", "6", NULL };
AddOptItem(optJson, arrayJson, "filetype", m_filetype.c_str(), fileTypeList);
const char* showBase64List[] = { "0", "1", NULL };
AddOptItem(optJson, arrayJson, "showbase64", m_showbase64.c_str(), showBase64List);
const char* sourceList[] = { "Adf-duplex", NULL };
AddOptItem(optJson, arrayJson, "source", m_source.c_str(), sourceList);
const char* modeList[] = { "Lineart", "Gray", "Color", NULL };
AddOptItem(optJson, arrayJson, "mode", m_mode.c_str(), modeList);
const char* resolutionList[] = { "100", "200", "300", NULL };
AddOptItem(optJson, arrayJson, "resolution", m_resolution.c_str(), resolutionList);
const char* pageAutoList[] = { "yes", "no", NULL };
AddOptItem(optJson, arrayJson, "page-auto", m_pageauto.c_str(), pageAutoList);
const char* paperSizeList[] = { "A4", "A5", "A6", NULL };
AddOptItem(optJson, arrayJson, "paper-size", m_papersize.c_str(), paperSizeList);
const char* blankPageSkipList[] = { "yes", "no", NULL };
AddOptItem(optJson, arrayJson, "blank-page-skip", m_blankpageskip.c_str(), blankPageSkipList);
const char* blankPageSkipSensitivityList[] = { "1", "2", "3", "4", "5", NULL };
AddOptItem(optJson, arrayJson, "blank-page-skip-sensitivity", m_blankpageskipsensitivity.c_str(), blankPageSkipSensitivityList);
const char* multifeedDetectionList [] = { "yes", "no", NULL };
AddOptItem(optJson, arrayJson, "multifeed-detection", m_multifeeddetection.c_str(), multifeedDetectionList);
}
cJSON_AddItemToObject(optListJson, "Options", arrayJson);
char* str = cJSON_Print(optListJson);
if (NULL != str)
{
optListStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_Delete(optListJson);
}
char* str = cJSON_Print(optJson);
if (NULL != str)
{
optStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_Delete(optJson);
}
std::string dataStr = optStr + "|" + optListStr;
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("json"));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
free(resp);
}
cJSON_Delete(retJson);
}
}
void WebUser::ConvertToBase64New(const std::string& filePath)
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SBASE64"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2007));
std::string base64 = GetBase64(filePath);
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(base64.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("base64"));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE);
free(resp);
}
cJSON_Delete(retJson);
}
}
void WebUser::ScanNew(const std::string& devName, const std::string& devParam)
{
if (NULL != m_scanEvent)
{
assert(NULL != m_devHandle);
sane_cancel(m_devHandle);
HGBase_WaitEvent(m_scanEvent);
HGBase_DestroyEvent(m_scanEvent);
m_scanEvent = NULL;
}
if (NULL != m_devHandle)
{
if (m_devName != devName)
{
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
}
}
if (NULL == m_devHandle)
{
SANE_Handle dev = NULL;
SANE_Status status = sane_open(devName.c_str(), &dev);
if (SANE_STATUS_GOOD == status)
{
m_devName = devName;
m_devHandle = dev;
}
}
if (NULL != m_devHandle)
{
cJSON* json = cJSON_Parse(devParam.c_str());
if (NULL != json)
{
cJSON* p = json->child;
while (NULL != p)
{
if (0 == strcmp(p->string, "filepath"))
{
char filePath[260];
HGBase_StandardiseFileName(p->valuestring, filePath, 260);
m_filepath = filePath;
#ifdef _WIN32
if (m_filepath[m_filepath.size() - 1] != '\\')
m_filepath.push_back('\\');
#else
if (m_filepath[m_filepath.size() - 1] != '/')
m_filepath.push_back('/');
#endif
}
else if (0 == strcmp(p->string, "fileprefix"))
m_fileprefix = p->valuestring;
else if (0 == strcmp(p->string, "deletefilesbeforescan"))
m_deletefilesbeforescan = p->valuestring;
else if (0 == strcmp(p->string, "filetype"))
m_filetype = p->valuestring;
else if (0 == strcmp(p->string, "showbase64"))
m_showbase64 = p->valuestring;
else if (0 == strcmp(p->string, "source"))
m_source = p->valuestring;
else if (0 == strcmp(p->string, "mode"))
m_mode = p->valuestring;
else if (0 == strcmp(p->string, "resolution"))
m_resolution = p->valuestring;
else if (0 == strcmp(p->string, "page-auto"))
m_pageauto = p->valuestring;
else if (0 == strcmp(p->string, "paper-size"))
m_papersize = p->valuestring;
else if (0 == strcmp(p->string, "blank-page-skip"))
m_blankpageskip = p->valuestring;
else if (0 == strcmp(p->string, "blank-page-skip-sensitivity"))
m_blankpageskipsensitivity = p->valuestring;
else if (0 == strcmp(p->string, "multifeed-detection"))
m_multifeeddetection = p->valuestring;
p = p->next;
}
cJSON_Delete(json);
}
SetParam();
HGBase_CreateEvent(HGFALSE, HGFALSE, &m_scanEvent);
assert(NULL != m_scanEvent);
SANE_Status status = sane_start(m_devHandle);
if (SANE_STATUS_GOOD != status)
{
HGBase_DestroyEvent(m_scanEvent);
m_scanEvent = NULL;
if (NULL != m_imgFmtWriter)
{
HGImgFmt_CloseImageWriter(m_imgFmtWriter);
m_imgFmtWriter = NULL;
HGBase_DeleteFile(m_writerFileName.c_str());
m_writerFileName.clear();
m_writerFileValid = false;
}
}
}
}
void WebUser::AddOptItem(cJSON* optJson, cJSON* arrayJson, const char* name, const char* value, const char** list)
{
cJSON_AddItemToObject(optJson, name, cJSON_CreateString(value));
cJSON* objJson = cJSON_CreateObject();
cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(3));
cJSON_AddItemToObject(objJson, "current", cJSON_CreateString(value));
cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue());
cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue());
if (NULL != list)
{
cJSON* arrayJson2 = cJSON_CreateArray();
const char** p = list;
while (0 != *p)
{
cJSON_AddItemToArray(arrayJson2, cJSON_CreateString(*p));
++p;
}
cJSON_AddItemToObject(objJson, "list", arrayJson2);
}
cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name));
cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(3));
cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString(""));
cJSON_AddItemToArray(arrayJson, objJson);
}
void WebUser::PostDisConnectMsg()
{
DisConnectParam* param = new DisConnectParam;
@ -738,6 +1140,7 @@ void WebUser::PostEventMsg(const HGByte* data, HGUInt dataSize)
void HGAPI WebUser::ThreadFunc(HGThread thread, HGPointer param)
{
(void)thread;
WebUser* p = (WebUser*)param;
char chBuffer[2048];
@ -1042,6 +1445,12 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
HGBase_EnterLock(p->m_lockName);
p->m_devNameList.push_back(sane_dev->name);
HGBase_LeaveLock(p->m_lockName);
if (!p->m_server->IsOld())
{
std::string cmd = "CDEVPLUG";
p->PostCmdMsg((const HGByte*)cmd.c_str(), (HGUInt)cmd.size());
}
}
break;
case SANE_EVENT_DEVICE_LEFT:
@ -1061,16 +1470,24 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
delete closeDevParam;
}
bool b = false;
HGBase_EnterLock(p->m_lockName);
for (int i = 0; i < (int)p->m_devNameList.size(); ++i)
{
if (0 == strcmp(sane_dev->name, p->m_devNameList[i].c_str()))
{
p->m_devNameList.erase(p->m_devNameList.begin() + i);
b = true;
break;
}
}
HGBase_LeaveLock(p->m_lockName);
if (b && !p->m_server->IsOld())
{
std::string cmd = "CDEVPLUG";
p->PostCmdMsg((const HGByte*)cmd.c_str(), (HGUInt)cmd.size());
}
}
break;
case SANE_EVENT_WORKING:
@ -1094,6 +1511,10 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
delete scanFinishParam;
}
if (p->m_server->IsOld())
{
assert(NULL == p->m_imgFmtWriter);
int code = 0;
std::string result = "";
@ -1116,6 +1537,64 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
cJSON_Delete(retJson);
}
}
else
{
if (NULL != p->m_imgFmtWriter)
{
HGImgFmt_CloseImageWriter(p->m_imgFmtWriter);
p->m_imgFmtWriter = NULL;
if (p->m_writerFileValid)
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANMUL"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2003));
std::string data = p->m_filesuffix + "|" + p->m_writerFileName;
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("string"));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
free(resp);
}
cJSON_Delete(retJson);
}
}
else
{
HGBase_DeleteFile(p->m_writerFileName.c_str());
}
p->m_writerFileName.clear();
p->m_writerFileValid = false;
}
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANALL"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2004));
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(""));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString(""));
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
free(resp);
}
cJSON_Delete(retJson);
}
}
}
break;
case SANE_EVENT_STATUS:
{
@ -1135,12 +1614,24 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
if (sane_img->header.format == SANE_FRAME_GRAY)
{
if (1 == sane_img->header.depth)
{
imgType = HGBASE_IMGTYPE_BINARY;
if (2 == atoi(p->m_filetype.c_str()))
p->m_filesuffix = "pbm";
}
else if (8 == sane_img->header.depth)
{
imgType = HGBASE_IMGTYPE_GRAY;
if (2 == atoi(p->m_filetype.c_str()))
p->m_filesuffix = "pgm";
}
}
else if (sane_img->header.format == SANE_FRAME_RGB)
{
imgType = HGBASE_IMGTYPE_RGB;
if (2 == atoi(p->m_filetype.c_str()))
p->m_filesuffix = "ppm";
}
HGByte* data = sane_img->data;
HGImageInfo imgInfo = { (HGUInt)sane_img->header.pixels_per_line, (HGUInt)sane_img->header.lines,
@ -1150,8 +1641,10 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
HGBase_CreateImageFromData(data, &imgInfo, NULL, 0, HGBASE_IMGORIGIN_TOP, &img);
if (NULL != img)
{
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
HGBase_SetImageDpi(img, sane_img->flag.dpi, sane_img->flag.dpi);
if (p->m_server->IsOld())
{
int code = 0;
std::string result = p->GetBase64(img);
@ -1173,6 +1666,70 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
cJSON_Delete(retJson);
}
}
else if (NULL != p->m_imgFmtWriter)
{
if (HGBASE_ERR_OK == HGImgFmt_SaveImageToWriter(p->m_imgFmtWriter, img, NULL))
p->m_writerFileValid = true;
}
else
{
cJSON* retJson = cJSON_CreateObject();
if (NULL != retJson)
{
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SSCANONE"));
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2002));
HGBase_CreateDir(p->m_filepath.c_str());
HGChar fileName[256];
HGTimeInfo timeInfo;
HGBase_GetLocalTime(&timeInfo);
sprintf(fileName, "%s%04d%02d%02d%02d%02d%02d%03d.%s", p->m_fileprefix.c_str(), timeInfo.year, timeInfo.month,
timeInfo.day, timeInfo.hour, timeInfo.minute, timeInfo.second, timeInfo.milliseconds, p->m_filesuffix.c_str());
HGChar filePath[256];
sprintf(filePath, "%s%s", p->m_filepath.c_str(), fileName);
if (atoi(p->m_showbase64.c_str()))
{
std::string data;
cJSON* obj = cJSON_CreateObject();
if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, NULL, filePath))
cJSON_AddItemToObject(obj, "ImagePath", cJSON_CreateString(filePath));
std::string imgBase64 = GetBase64(filePath);
if (!imgBase64.empty())
cJSON_AddItemToObject(obj, "Base64Data", cJSON_CreateString(imgBase64.c_str()));
char* objStr = cJSON_Print(obj);
data = p->m_filesuffix + "|" + GetBase64((HGByte*)objStr, strlen(objStr));
free(objStr);
cJSON_Delete(obj);
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("base64"));
}
else
{
std::string data = p->m_filesuffix + "|";
if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, NULL, filePath))
data += filePath;
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(data.c_str()));
cJSON_AddItemToObject(retJson, "DataType", cJSON_CreateString("string"));
}
cJSON_AddItemToObject(retJson, "Msg", cJSON_CreateString("Success"));
char* resp = cJSON_Print(retJson);
if (NULL != resp)
{
p->PostEventMsg((const HGByte*)resp, (HGUInt)strlen(resp));
free(resp);
}
cJSON_Delete(retJson);
}
}
HGBase_DestroyImage(img);
}
@ -1221,6 +1778,228 @@ std::string WebUser::GetBase64(HGImage image)
return ret;
}
std::string WebUser::GetBase64(const std::string& filePath)
{
std::string base64;
FILE* file = fopen(filePath.c_str(), "rb");
if (NULL != file)
{
fseek(file, 0, SEEK_END);
long size = ftell(file);
fseek(file, 0, SEEK_SET);
if (size > 0)
{
HGByte* data = new HGByte[size];
long readLen = (long)fread(data, 1, size, file);
if (readLen == size)
{
HGSize base64Size = 0;
HGBase_Base64Encode(data, size, NULL, &base64Size);
uint8_t* base64Data = new uint8_t[base64Size + 1];
HGBase_Base64Encode(data, size, base64Data, &base64Size);
base64Data[base64Size] = 0;
base64 = (const char*)base64Data;
delete[] base64Data;
}
delete[] data;
}
fclose(file);
}
if (!base64.empty())
{
HGUInt imgType = 0;
HGImgFmt_GetImgFmtType(filePath.c_str(), &imgType);
std::string prefix;
if (HGIMGFMT_TYPE_JPEG == imgType)
prefix = "data:image/jpeg;base64,";
else if (HGIMGFMT_TYPE_BMP == imgType)
prefix = "data:image/bmp;base64,";
else if (HGIMGFMT_TYPE_PNG == imgType)
prefix = "data:image/png;base64,";
else if (HGIMGFMT_TYPE_TIFF == imgType)
prefix = "data:image/tiff;base64,";
else if (HGIMGFMT_TYPE_PDF == imgType)
prefix = "data:application/pdf;base64,";
else if (HGIMGFMT_TYPE_PNM == imgType)
prefix = "data:image/pnm;base64,";
base64.insert(0, prefix);
}
return base64;
}
std::string WebUser::GetBase64(const HGByte* data, HGUInt size)
{
std::string ret;
if (NULL != data && 0 != size)
{
HGSize base64Size = 0;
HGBase_Base64Encode(data, size, NULL, &base64Size);
HGByte* base64 = new HGByte[base64Size + 1];
HGBase_Base64Encode(data, size, base64, &base64Size);
base64[base64Size] = 0;
ret = (const char*)base64;
delete[] base64;
}
return ret;
}
void WebUser::ClearPath(const std::string& path)
{
#if defined(HG_CMP_MSC)
char szFind[MAX_PATH];
sprintf(szFind, "%s*.*", path.c_str());
WIN32_FIND_DATAA FindFileData;
HANDLE hFind = FindFirstFileA(szFind, &FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
return;
do
{
if (0 == (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
char fileName[MAX_PATH];
sprintf(fileName, "%s%s", path.c_str(), FindFileData.cFileName);
HGBase_DeleteFile(fileName);
}
} while (FindNextFileA(hFind, &FindFileData));
FindClose(hFind);
#else
DIR* dir = opendir(path.c_str());
if (NULL != dir)
{
struct dirent* dire = NULL;
while (dire = readdir(dir))
{
char fileName[256];
sprintf(fileName, "%s%s", path.c_str(), dire->d_name);
struct stat filebuf;
lstat(fileName, &filebuf);
if (!S_ISDIR(filebuf.st_mode))
{
HGBase_DeleteFile(fileName);
}
}
closedir(dir);
}
#endif
}
void WebUser::SetParam()
{
// Set Param
if (m_mode == "Lineart")
{
SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_HB);
}
else if (m_mode == "Gray")
{
SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_256JHD);
}
else
{
SetParam(OPTION_TITLE_YSMS, OPTION_VALUE_YSMS_24WCS);
}
HGInt dpi = 200;
if (m_resolution == "100")
dpi = 100;
else if (m_resolution == "300")
dpi = 300;
SetParam(OPTION_TITLE_FBL, &dpi);
if (m_pageauto == "yes")
{
SetParam(OPTION_TITLE_ZZCC, OPTION_VALUE_ZZCC_PPYSCC);
}
else
{
if (m_papersize == "A5")
SetParam(OPTION_TITLE_ZZCC, OPTION_VALUE_ZZCC_A5);
else if (m_papersize == "A6")
SetParam(OPTION_TITLE_ZZCC, OPTION_VALUE_ZZCC_A6);
else
SetParam(OPTION_TITLE_ZZCC, OPTION_VALUE_ZZCC_A4);
}
if (m_multifeeddetection == "Do-not-detect")
{
HGBool b = HGFALSE;
SetParam(OPTION_TITLE_CSBJC, &b);
}
else
{
HGBool b = HGTRUE;
SetParam(OPTION_TITLE_CSBJC, &b);
SetParam(OPTION_TITLE_SZTPCL, OPTION_VALUE_SZTPCL_DQTXBTZSM);
}
if (m_blankpageskip == "yes")
{
SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_TGKBYTY);
HGInt value = 50;
if (m_blankpageskipsensitivity == "1")
value = 1;
else if (m_blankpageskipsensitivity == "2")
value = 25;
else if (m_blankpageskipsensitivity == "4")
value = 75;
else if (m_blankpageskipsensitivity == "5")
value = 100;
SetParam(OPTION_TITLE_TGKBYLMD, &value);
}
else
{
SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_SM);
}
if (atoi(m_deletefilesbeforescan.c_str()))
{
ClearPath(m_filepath);
}
if (1 == atoi(m_filetype.c_str()))
m_filesuffix = "tif";
else if (2 == atoi(m_filetype.c_str()))
m_filesuffix = "ppm";
else if (4 == atoi(m_filetype.c_str()))
m_filesuffix = "png";
else if (6 == atoi(m_filetype.c_str()))
m_filesuffix = "pdf";
else
m_filesuffix = "jpg";
if ("tif" == m_filesuffix || "pdf" == m_filesuffix)
{
HGBase_CreateDir(m_filepath.c_str());
HGChar fileName[256];
HGTimeInfo timeInfo;
HGBase_GetLocalTime(&timeInfo);
sprintf(fileName, "%s%04d%02d%02d%02d%02d%02d%03d.%s", m_fileprefix.c_str(), timeInfo.year, timeInfo.month,
timeInfo.day, timeInfo.hour, timeInfo.minute, timeInfo.second, timeInfo.milliseconds, m_filesuffix.c_str());
m_writerFileName = m_filepath + fileName;
m_writerFileValid = false;
HGImgFmt_OpenImageWriter(m_writerFileName.c_str(), 0, &m_imgFmtWriter);
if (NULL == m_imgFmtWriter)
{
m_writerFileName.clear();
}
}
}
HGBool WebUser::SetParam(const char* optionName, const HGVoid* data)
{
assert(NULL != m_devHandle);
@ -1277,39 +2056,6 @@ HGBool WebUser::SetParam(const char* optionName, const HGVoid* data)
return ret;
}
HGInt WebUser::GetDpi()
{
assert(NULL != m_devHandle);
HGInt dpi = 0;
SANE_Int num_dev_options = 0;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL);
for (int i = 1; i < num_dev_options; ++i)
{
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i);
if (NULL == desp)
continue;
const char* name = desp->title;
while (' ' == *name)
++name;
if (0 == strcmp(OPTION_TITLE_FBL, name))
{
if (SANE_TYPE_INT == desp->type)
{
SANE_Int value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
dpi = value;
}
break;
}
}
return dpi;
}
bool WebUser::ShakeHand(const std::string& head)
{
std::string requestMethod;

View File

@ -7,6 +7,7 @@
#include "base/HGThread.h"
#include "base/HGImage.h"
#include "base/HGMsgPump.h"
#include "imgfmt/HGImgFmt.h"
#include "Msg.h"
#include "cJSON.h"
#include "sane/sane_ex.h"
@ -32,6 +33,7 @@ public:
void HandleEvent(const WSEvtParam* param);
private:
// OLD
void GetDeviceList(cJSON *json);
void SelectDevice(cJSON* json);
void SetScanColorType(cJSON* json);
@ -39,16 +41,26 @@ private:
void SetDuplex(cJSON* json);
void SetScanJPGQuality(cJSON* json);
void StartScan(cJSON* json);
//NEW
void GetDeviceListNew();
void DeviceListPlugNew();
void GetSettingInfoNew(const std::string &devName);
void ConvertToBase64New(const std::string& filePath);
void ScanNew(const std::string& devName, const std::string& devParam);
private:
static void AddOptItem(cJSON* optJson, cJSON* arrayJson, const char *name, const char *value, const char **list);
void PostDisConnectMsg();
void PostCmdMsg(const HGByte* data, HGUInt dataSize);
void PostEventMsg(const HGByte* data, HGUInt dataSize);
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
std::string GetBase64(HGImage image);
static std::string GetBase64(const std::string& filePath);
static std::string GetBase64(const HGByte* data, HGUInt size);
static void ClearPath(const std::string &path);
void SetParam();
HGBool SetParam(const char* optionName, const HGVoid* data);
HGInt GetDpi();
bool ShakeHand(const std::string& head);
void Pong();
@ -73,6 +85,23 @@ private:
std::vector<std::string> m_devNameList;
std::string m_devName;
SANE_Handle m_devHandle;
int m_dpi;
HGEvent m_scanEvent;
std::string m_filepath;
std::string m_fileprefix;
std::string m_deletefilesbeforescan;
std::string m_filetype;
std::string m_filesuffix;
std::string m_writerFileName;
HGImgFmtWriter m_imgFmtWriter;
bool m_writerFileValid;
std::string m_showbase64;
std::string m_source;
std::string m_mode;
std::string m_resolution;
std::string m_pageauto;
std::string m_papersize;
std::string m_blankpageskip;
std::string m_blankpageskipsensitivity;
std::string m_multifeeddetection;
};

View File

@ -2,17 +2,27 @@
#include "base/HGInc.h"
#include "base/HGThread.h"
#include "base/HGMsgPump.h"
#include "base/HGUtility.h"
#include "base/HGIni.h"
#include "WebServer.h"
#include "MsgPumpCallback.h"
#include "lang/app_language.h"
static void HGAPI ThreadFunc(HGThread thread, HGPointer param)
{
(void)thread;
HGMsgPump msgPump = (HGMsgPump)param;
HGChar cfgPath[256];
HGBase_GetConfigPath(cfgPath, 256);
HGChar cfgName[256];
sprintf(cfgName, "%s%s", cfgPath, "config.ini");
WebServer wsServer(msgPump);
HGInt port = 9458;
//HGInt port = 9458;
HGInt port = 23165;
HGBase_GetProfileInt(cfgName, "connect", "port", 23165, &port);
if (wsServer.Open(port))
{
HGBase_RunMsgPump(msgPump, HGMsgPumpCallback, NULL);

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,703 @@
! function(e) {
function t(r) {
if (n[r]) return n[r].exports;
var i = n[r] = {
i: r,
l: !1,
exports: {}
};
return e[r].call(i.exports, i, i.exports, t), i.l = !0, i.exports
}
var n = {};
t.m = e, t.c = n, t.d = function(e, n, r) {
t.o(e, n) || Object.defineProperty(e, n, {
configurable: !1,
enumerable: !0,
get: r
})
}, t.n = function(e) {
var n = e && e.__esModule ? function() {
return e.default
} : function() {
return e
};
return t.d(n, "a", n), n
}, t.o = function(e, t) {
return Object.prototype.hasOwnProperty.call(e, t)
}, t.p = "", t(t.s = 0)
}([function(e, t) {
! function(e, t) {
function n(e) {
var t = String(e)
.trim();
if (isNaN(t)) return !1;
var n = Math.floor(Number(t));
return n !== 1 / 0 && String(n) === t
}
function r(e) {
var t = String(e)
.trim();
return "yes" === t || "1" === t || "true" === t ? "yes" : "no"
}
function i(e, t) {
y[e] = t, S[e] = t
}
function o(e) {
var n = S[e];
return n !== t ? n : ""
}
function s(r, i, o) {
if (!("WebSocket" in e)) return void console.error("%c浏览器不支持WebSocket请更换浏览器", "color:red");
b = (1 == o || 0 == o) && o, m = r !== t && null !== r && "" !== String(r) && n(r) ? b ? "ws://localhost:" + String(r + 1) : "ws://localhost:" + String(r) : b ? "wss://localhost:23166" : "ws://localhost:23165", d = (1 == i || 0 == i) && i, null === h ? (h = new WebSocket(m), h.onopen = function() {
d && console.log("连接已打开")
}, h.onmessage = function(e) {
console.log(e.data);
var t = String(e.data),
n = JSON.parse(t),
r = n.Cmd,
i = n.Code,
o = n.Msg;
if (0 !== i && i < 2001 && (y = {}, x("Code:" + i + ";Msg:" + o)), "HOME" === r) j(n.Data);
else if ("SDEV" === r) {
var s = JSON.parse(e.data);
if ("2005" === String(s.Code)) {
var c = atob(s.Data),
a = decodeURI(c),
u = JSON.parse(a);
P(u.Devs)
} else P([])
} else if ("SDEVPLUG" === r) {
var s = JSON.parse(e.data);
if ("2005" === String(s.Code)) {
var c = atob(s.Data),
a = decodeURI(c),
u = JSON.parse(a);
v(u.Devs)
} else v([])
} else if ("SOPT" === r) {
S = {}, O = {}, y = {};
var s = JSON.parse(e.data),
f = s.Data.split("|");
if (2 === f.length) {
var c = atob(f[0]),
a = decodeURI(c),
p = JSON.parse(a);
S = p, O = p, c = atob(f[1]), a = decodeURI(c);
JSON.parse(a);
D(a)
}
} else if ("SSCANONE" === r) {
var l = JSON.parse(e.data),
ld = l.liveDetect,
f = l.Data.split("|");
if (2 === f.length) {
var d = f[0],
b = f[1];
if (0 === g) w(l.DataType,ld, d, b, "");
else {
var m = atob(b),
h = decodeURI(m),
E = JSON.parse(h);
w(l.DataType, ld, d, E.ImagePath, E.Base64Data)
}
}
} else if ("SSCANALL" === r) k(e.data), y = {};
else if ("SSCANMUL" === r) {
var J = "",
M = "",
l = JSON.parse(e.data),
f = l.Data.split("|");
2 === f.length && (J = f[0], M = f[1]), N(J, M), y = {}
} else if ("SBASE64" === r) {
var l = JSON.parse(e.data);
C(l.Data)
} else y = {}, console.log(n.Code, n.Msg)
}, h.onclose = function(e) {
h = null, console.error("%c连接已关闭请检查进程pslapisvr是否存在并重新刷新页面进行连接。\r\n 详细信息:", "color:red", e)
}, h.onerror = function(e) {
h = null, console.error("%c连接出现错误请检查进程pslapisvr是否存在。\r\n 详细信息:", "color:red", e)
}) : h = null
}
function c(e, t) {
"function" == typeof t && ("OnGetHomePath" === e ? j = t : "OnGetDevices" === e ? P = t : "OnDetectDevices" === e ? v = t : "OnScanOneFileDone" === e ? w = t : "OnScanAllFilesDone" === e ? k = t : "OnScanMultiPagesFileDone" === e ? N = t : "OnGetSettingInfo" === e ? D = t : "OnGetBase64" === e ? C = t : "OnErrorMessage" === e && (x = t))
}
function a() {
if (null === h) return void x("GetDevices未连接服务");
h.send("CDEV")
}
function u(e) {
return null === h ? void x("GetSettingInfo未连接服务") : e && "" !== e ? void h.send("COPT|" + String(e)) : void x("GetSettingInfo未选择扫描仪")
}
function f(e) {
if (null === h) return void x("Scan未连接服务");
if (!e || "" === e) return void x("Scan未选择扫描仪");
var t = JSON.stringify(y);
h.send("CSCAN|" + String(e) + "|" + t)
}
function p(e) {
if (null === h) return void x("ConvertToBase64未连接服务");
h.send("CBASE64|" + e)
}
function l() {
y = {}, S = O, g = 0
}
e.psl = {
sane: {}
}, Object.defineProperty(psl.sane, "filepath", {
get: function() {
return o("filepath")
},
set: function(e) {
i("filepath", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "filetype", {
get: function() {
return o("filetype")
},
set: function(e) {
var t = String(e)
.trim();
if ("1" !== t && "2" !== t && "3" !== t && "4" !== t && "5" !== t && "6" !== t && "7" !== t) throw new Error("filetype 值范围1-7且为整数当前值" + t);
i("filetype", t)
}
}), Object.defineProperty(psl.sane, "fileprefix", {
get: function() {
return o("fileprefix")
},
set: function(e) {
i("fileprefix", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "scancount", {
get: function() {
return o("scancount")
},
set: function(e) {
var t = String(e)
.trim(),
r = Math.floor(Number(t));
if (!n(t) && r < 1 && r > 2e9) throw new Error("scancount 值范围1-2000000000且为整数当前值" + t);
i("scancount", t)
}
}), Object.defineProperty(psl.sane, "scanmincountsize", {
get: function() {
return o("scanmincountsize")
},
set: function(e) {
var t = String(e)
.trim(),
r = Math.floor(Number(t));
if (!n(t) && r < 1 && r > 9) throw new Error("scanmincountsize 值范围1-9且为整数当前值" + t);
i("scanmincountsize", t)
}
}), Object.defineProperty(psl.sane, "deletefilesbeforescan", {
get: function() {
return o("deletefilesbeforescan")
},
set: function(e) {
var t = String(e)
.trim();
if ("0" !== t && "1" !== t) throw new Error("deletefilesbeforescan 值范围0-1且为整数当前值" + t);
i("deletefilesbeforescan", t)
}
});
var g = 0;
Object.defineProperty(psl.sane, "showbase64", {
get: function() {
return o("showbase64")
},
set: function(e) {
var t = String(e)
.trim();
if ("0" !== t && "1" !== t) throw new Error("showbase64 值范围0-1且为整数当前值" + t);
g = Math.floor(Number(t)), i("showbase64", t)
}
}), Object.defineProperty(psl.sane, "source", {
get: function() {
return o("source")
},
set: function(e) {
i("source", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "mode", {
get: function() {
return o("mode")
},
set: function(e) {
i("mode", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "resolution", {
get: function() {
return o("resolution")
},
set: function(e) {
i("resolution", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "pagewidth", {
get: function() {
return o("page-width")
},
set: function(e) {
i("page-width", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "pageheight", {
get: function() {
return o("page-height")
},
set: function(e) {
i("page-height", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "tlx", {
get: function() {
return o("tl-x")
},
set: function(e) {
i("tl-x", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "tly", {
get: function() {
return o("tl-y")
},
set: function(e) {
i("tl-y", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "brx", {
get: function() {
return o("br-x")
},
set: function(e) {
i("br-x", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bry", {
get: function() {
return o("br-y")
},
set: function(e) {
i("br-y", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "papersize", {
get: function() {
return o("paper-size")
},
set: function(e) {
i("paper-size", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "pageauto", {
get: function() {
return o("page-auto")
},
set: function(e) {
i("page-auto", r(e))
}
}), Object.defineProperty(psl.sane, "pageautopriority", {
get: function() {
return o("page-auto-priority")
},
set: function(e) {
i("page-auto-priority", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "cropping", {
get: function() {
return o("cropping")
},
set: function(e) {
i("cropping", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bgcolor", {
get: function() {
return o("bgcolor")
},
set: function(e) {
i("bgcolor", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bwmode", {
get: function() {
return o("bw-mode")
},
set: function(e) {
i("bw-mode", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bwidtcsensitivity", {
get: function() {
return o("bw-idtc-sensitivity")
},
set: function(e) {
i("bw-idtc-sensitivity", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bwidtcbackgroundthreshold", {
get: function() {
return o("bw-idtc-background-threshold")
},
set: function(e) {
i("bw-idtc-background-threshold", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "bwsdtcvariance", {
get: function() {
return o("bw-sdtc-variance")
},
set: function(e) {
i("bw-sdtc-variance", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "threshold", {
get: function() {
return o("threshold")
},
set: function(e) {
i("threshold", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "brightness", {
get: function() {
return o("brightness")
},
set: function(e) {
i("brightness", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "contrast", {
get: function() {
return o("contrast")
},
set: function(e) {
i("contrast", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "shadow", {
get: function() {
return o("shadow")
},
set: function(e) {
i("shadow", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "highlight", {
get: function() {
return o("highlight")
},
set: function(e) {
i("highlight", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "gamma", {
get: function() {
return o("gamma")
},
set: function(e) {
i("gamma", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "multifeeddetection", {
get: function() {
return o("multifeed-detection")
},
set: function(e) {
i("multifeed-detection", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "mfoverlapping", {
get: function() {
return o("mf-overlapping")
},
set: function(e) {
i("mf-overlapping", r(e))
}
}), Object.defineProperty(psl.sane, "mflength", {
get: function() {
return o("mf-length")
},
set: function(e) {
i("mf-length", r(e))
}
}), Object.defineProperty(psl.sane, "prepick", {
get: function() {
return o("prepick")
},
set: function(e) {
i("prepick", r(e))
}
}), Object.defineProperty(psl.sane, "dropoutcolor", {
get: function() {
return o("dropoutcolor")
},
set: function(e) {
i("dropoutcolor", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "cleanupsharpness", {
get: function() {
return o("cleanup-sharpness")
},
set: function(e) {
i("cleanup-sharpness", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "blankpageskip", {
get: function() {
return o("blank-page-skip")
},
set: function(e) {
i("blank-page-skip", r(e))
}
}), Object.defineProperty(psl.sane, "blankpageskipsensitivity", {
get: function() {
return o("blank-page-skip-sensitivity")
},
set: function(e) {
i("blank-page-skip-sensitivity", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "jpeg", {
get: function() {
return o("jpeg")
},
set: function(e) {
i("jpeg", r(e))
}
}), Object.defineProperty(psl.sane, "jpegtype", {
get: function() {
return o("jpeg-type")
},
set: function(e) {
i("jpeg-type", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "jpegquality", {
get: function() {
return o("jpeg-quality")
},
set: function(e) {
i("jpeg-quality", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "autofeed", {
get: function() {
return o("autofeed")
},
set: function(e) {
i("autofeed", r(e))
}
}), Object.defineProperty(psl.sane, "getscstatus", {
get: function() {
return o("get-sc-status")
},
set: function(e) {
console.error("%c参数只读不能进行设置", "color:red")
}
}), Object.defineProperty(psl.sane, "getscerror", {
get: function() {
return o("get-sc-error")
},
set: function(e) {
console.error("%c参数只读不能进行设置", "color:red")
}
}), Object.defineProperty(psl.sane, "toneadjustment", {
get: function() {
return o("tone-adjustment")
},
set: function(e) {
i("tone-adjustment", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "edgerepair", {
get: function() {
return o("edge-repair")
},
set: function(e) {
i("edge-repair", r(e))
}
}), Object.defineProperty(psl.sane, "holepunchremoval", {
get: function() {
return o("hole-punch-removal")
},
set: function(e) {
i("hole-punch-removal", r(e))
}
}), Object.defineProperty(psl.sane, "holepunchremovalfillcolor", {
get: function() {
return o("hole-punch-removal-fillcolor")
},
set: function(e) {
i("hole-punch-removal-fillcolor", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "holepunchremovalmode", {
get: function() {
return o("hole-punch-removal-mode")
},
set: function(e) {
i("hole-punch-removal-mode", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "rotation", {
get: function() {
return o("rotation")
},
set: function(e) {
i("rotation", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "splitimage", {
get: function() {
return o("split-image")
},
set: function(e) {
i("split-image", r(e))
}
}), Object.defineProperty(psl.sane, "frontbackmerging", {
get: function() {
return o("front-back-merging")
},
set: function(e) {
i("front-back-merging", r(e))
}
}), Object.defineProperty(psl.sane, "backsidelocation", {
get: function() {
return o("back-side-location")
},
set: function(e) {
i("back-side-location", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "backsiderotation", {
get: function() {
return o("back-side-rotation")
},
set: function(e) {
i("back-side-rotation", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "colorcleanup", {
get: function() {
return o("color-cleanup")
},
set: function(e) {
i("color-cleanup", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "colorcleanupcleanness", {
get: function() {
return o("color-cleanup-cleanness")
},
set: function(e) {
i("color-cleanup-cleanness", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "timescan", {
get: function() {
return o("time-scan")
},
set: function(e) {
i("time-scan", r(e))
}
}), Object.defineProperty(psl.sane, "intervaltime", {
get: function() {
return o("interval-time")
},
set: function(e) {
i("interval-time", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "imprinter", {
get: function() {
return o("imprinter")
},
set: function(e) {
i("imprinter", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "string", {
get: function() {
return o("string")
},
set: function(e) {
i("string", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "offset", {
get: function() {
return o("offset")
},
set: function(e) {
i("offset", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "initialcountervalue", {
get: function() {
return o("initial-counter-value")
},
set: function(e) {
i("initial-counter-value", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "counterstep", {
get: function() {
return o("counter-step")
},
set: function(e) {
i("counter-step", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "fonttype", {
get: function() {
return o("font-type")
},
set: function(e) {
i("font-type", String(e)
.trim())
}
}), Object.defineProperty(psl.sane, "fontdirection", {
get: function() {
return o("font-direction")
},
set: function(e) {
i("font-direction", String(e)
.trim())
}
});
var d, b, m = "",
y = {},
S = {},
O = {},
h = null,
j = function() {},
P = function() {},
v = function() {},
w = function() {},
k = function() {},
N = function() {},
D = function() {},
C = function() {},
x = function(e) {
console.error("%c" + e, "color:red")
};
e.psl.sane.init = s, e.psl.sane.registerevent = c, e.psl.sane.getdevices = a, e.psl.sane.getsettinginfo = u, e.psl.sane.scan = f, e.psl.sane.converttobase64 = p, e.psl.sane.clear = l
}(window)
}]);

View File

@ -0,0 +1,190 @@
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="utf-8"/>
<script type="text/javascript" src="psl.sane.webapi.min 2.1.0.js" charset="utf-8"></script>
</head>
<body>
<p>
<h1>Test</h1>
<select id="devicenames" style="width:200px; height:25px;">
</select>
<input id="getdevices" type="button" value="获取设备列表" onclick="getdevices()" /><br>
<input id="scan" type="button" value="扫描" onclick="scan()" /><br>
<input id="getsettinginfo" type="button" value="获取扫描参数" onclick="getsettinginfo()" /><br>
<input id="converttobase64" type="button" value="转换Base64" onclick="converttobase64()" /><br>
</p>
<p>
<img id="myCanvas" width='640' height='480' style="background-color: black;"/>
</p>
<p>
<input type="text" id="pathinfo" style="width:640px; height:40px;" />
</p>
<p>
<input type="text" id="errinfo" style="width:640px; height:40px;" />
</p>
<script>
function onGetDevicesFunc(devs)
{
//alert(JSON.stringify(devs));
var select = document.getElementById('devicenames');
select.innerHTML = "";
for (var i = 0; i < devs.length; ++i)
{
var option = document.createElement('option');
option.value = devs[i]['Name'];
option.textContent = devs[i]['Name'];
select.appendChild(option);
}
}
function onDetectDevicesFunc(devs)
{
//alert(JSON.stringify(devs));
var select = document.getElementById('devicenames');
select.innerHTML = "";
for (var i = 0; i < devs.length; ++i)
{
var option = document.createElement('option');
option.value = devs[i]['Name'];
option.textContent = devs[i]['Name'];
select.appendChild(option);
}
}
function onGetSettingInfoFunc(optList)
{
alert(optList);
}
function onGetBase64Func(base64)
{
if (base64)
{
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = base64;
}
}
function onScanOneFileDoneFunc(datatype, liveDetect, imgfmt, imgpath, imgbase64data)
{
if (imgpath)
{
var pathinfo = document.getElementById('pathinfo');
pathinfo.value = imgpath;
}
if (imgbase64data)
{
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = imgbase64data;
}
}
function onScanAllFilesDoneFunc(str)
{
alert(str);
}
function onScanMultiPagesFileDoneFunc(imgfmt, imgpath)
{
if (imgpath)
{
var pathinfo = document.getElementById('pathinfo');
pathinfo.value = imgpath;
}
}
function onErrorMessageFunc(errormsg)
{
var errinfo = document.getElementById('errinfo');
errinfo.value = errormsg;
}
function getdevices()
{
var errinfo = document.getElementById('errinfo');
errinfo.value = "";
psl.sane.getdevices();
}
function scan()
{
var pathinfo = document.getElementById('pathinfo');
pathinfo.value = "";
var errinfo = document.getElementById('errinfo');
errinfo.value = "";
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = 'placeholder.png';
psl.sane.showbase64 = 1;
psl.sane.source = "Adf-duplex";
psl.sane.mode = "Color";
psl.sane.resolution = "200";
psl.sane.deletefilesbeforescan = 1;
psl.sane.filepath = "D:\\123456";
psl.sane.fileprefix = "KKKKKK";
psl.sane.filetype = 3;
psl.sane.pageauto = 1;
psl.sane.papersize = "A4";
psl.sane.blankpageskip = 0;
psl.sane.blankpageskipsensitivity = 3;
psl.sane.multifeeddetection = "Stop";
psl.sane.scan(document.getElementById('devicenames').value);
}
function getsettinginfo()
{
var errinfo = document.getElementById('errinfo');
errinfo.value = "";
psl.sane.getsettinginfo(document.getElementById('devicenames').value);
}
function converttobase64()
{
var pathinfo = document.getElementById('pathinfo');
pathinfo.value = "";
var errinfo = document.getElementById('errinfo');
errinfo.value = "";
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = 'placeholder.png';
psl.sane.converttobase64('D:\\1.png');
}
window.onload = function()
{
var pathinfo = document.getElementById('pathinfo');
pathinfo.value = "";
var errinfo = document.getElementById('errinfo');
errinfo.value = "";
var myCanvas = document.getElementById("myCanvas");
myCanvas.src = 'placeholder.png';
psl.sane.registerevent("OnGetDevices", onGetDevicesFunc);
psl.sane.registerevent("OnDetectDevices", onDetectDevicesFunc);
psl.sane.registerevent("OnGetSettingInfo", onGetSettingInfoFunc);
psl.sane.registerevent("OnGetBase64", onGetBase64Func);
psl.sane.registerevent("OnScanOneFileDone", onScanOneFileDoneFunc);
psl.sane.registerevent("OnScanAllFilesDone", onScanAllFilesDoneFunc);
psl.sane.registerevent("OnScanMultiPagesFileDone", onScanMultiPagesFileDoneFunc);
psl.sane.registerevent("OnErrorMessage", onErrorMessageFunc);
psl.sane.init(23165, true);
}
window.onbeforeunload = function()
{
}
</script>
</body>
</html>