1)增加立思辰webapi-demo

2)立思辰webscan增加扫描功能
This commit is contained in:
luoliangyi 2024-10-16 16:49:36 +08:00
parent e705ba136a
commit 77b5b76c85
6 changed files with 1433 additions and 226 deletions

View File

@ -1,7 +1,9 @@
#include "WebUser.h" #include "WebUser.h"
#include "WebServer.h" #include "WebServer.h"
#include "base/HGBase64.h" #include "base/HGBase64.h"
#include "base/HGUtility.h"
#include "base/HGImage.h" #include "base/HGImage.h"
#include "base/HGTime.h"
#include "imgfmt/HGJpeg.h" #include "imgfmt/HGJpeg.h"
#include "sha1.h" #include "sha1.h"
#include "base64.h" #include "base64.h"
@ -213,6 +215,21 @@ WebUser::WebUser(WebServer* server, HGUInt id, HGMsgPump msgPump, const std::str
m_devHandle = NULL; m_devHandle = NULL;
m_scanEvent = NULL; 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";
SANE_Int version_code = 0; SANE_Int version_code = 0;
sane_init_ex(&version_code, sane_ex_callback, this); sane_init_ex(&version_code, sane_ex_callback, this);
} }
@ -363,11 +380,22 @@ void WebUser::HandleCmd(const WSCmdParam* param)
} }
else if (cmdData.find("COPT|") == 0) else if (cmdData.find("COPT|") == 0)
{ {
GetSettingInfoNew(cmdData.substr(5)); GetSettingInfoNew(cmdData.substr(strlen("COPT|")));
} }
else if (cmdData.find("CBASE64|") == 0) else if (cmdData.find("CBASE64|") == 0)
{ {
ConvertToBase64New(cmdData.substr(8)); 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);
}
} }
} }
} }
@ -794,6 +822,115 @@ void WebUser::DeviceListPlugNew()
} }
void WebUser::GetSettingInfoNew(const std::string& devName) 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", "5", "6", "7", 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-front", "Adf-back", "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);
AddOptItem(optJson, arrayJson, "resolution", m_resolution.c_str(), NULL);
}
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) if (NULL != m_scanEvent)
{ {
@ -828,245 +965,95 @@ void WebUser::GetSettingInfoNew(const std::string& devName)
if (NULL != m_devHandle) if (NULL != m_devHandle)
{ {
cJSON* retJson = cJSON_CreateObject(); cJSON* json = cJSON_Parse(devParam.c_str());
if (NULL != retJson) if (NULL != json)
{ {
cJSON_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SOPT")); cJSON* p = json->child;
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2006)); while (NULL != p)
std::string optStr;
std::string optListStr;
cJSON* optJson = cJSON_CreateObject();
if (NULL != optJson)
{ {
cJSON* optListJson = cJSON_CreateObject(); if (0 == strcmp(p->string, "filepath"))
if (NULL != optListJson)
{ {
cJSON* arrayJson = cJSON_CreateArray(); char filePath[260];
HGBase_StandardiseFileName(p->valuestring, filePath, 260);
SANE_Int num_dev_options = 0; m_filepath = filePath;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); #ifdef _WIN32
for (int i = 1; i < num_dev_options; ++i) if (m_filepath[m_filepath.size() - 1] != '\\')
{ m_filepath.push_back('\\');
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); #else
if (NULL == desp) if (m_filepath[m_filepath.size() - 1] != '/')
continue; m_filepath.push_back('/');
#endif
const char* name = desp->title;
while (' ' == *name)
++name;
if (SANE_TYPE_STRING == desp->type)
{
char value[256] = { 0 };
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, value, NULL);
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 (SANE_CONSTRAINT_STRING_LIST == desp->constraint_type)
{
cJSON* arrayJson2 = cJSON_CreateArray();
const SANE_String_Const* p = desp->constraint.string_list;
while (NULL != *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);
}
else if (SANE_TYPE_INT == desp->type)
{
SANE_Int value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
cJSON_AddItemToObject(optJson, name, cJSON_CreateNumber(value));
cJSON* objJson = cJSON_CreateObject();
cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(1));
cJSON_AddItemToObject(objJson, "current", cJSON_CreateNumber(value));
cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue());
cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue());
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
cJSON* arrayJson2 = cJSON_CreateArray();
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
cJSON_AddItemToArray(arrayJson2, cJSON_CreateNumber(p[i + 1]));
}
cJSON_AddItemToObject(objJson, "list", arrayJson2);
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
// desp->constraint.range->min;
// desp->constraint.range->max;
}
cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name));
cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(1));
cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString(""));
cJSON_AddItemToArray(arrayJson, objJson);
}
else if (SANE_TYPE_FIXED == desp->type)
{
SANE_Word value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
cJSON_AddItemToObject(optJson, name, cJSON_CreateNumber(SANE_UNFIX(value)));
cJSON* objJson = cJSON_CreateObject();
cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(2));
cJSON_AddItemToObject(objJson, "current", cJSON_CreateNumber(SANE_UNFIX(value)));
cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue());
cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue());
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
cJSON* arrayJson2 = cJSON_CreateArray();
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
cJSON_AddItemToArray(arrayJson2, cJSON_CreateNumber(SANE_UNFIX(p[i + 1])));
}
cJSON_AddItemToObject(objJson, "list", arrayJson2);
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
// SANE_UNFIX(desp->constraint.range->min);
// SANE_UNFIX(desp->constraint.range->max);
}
cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name));
cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(2));
cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString(""));
cJSON_AddItemToArray(arrayJson, objJson);
}
else if (SANE_TYPE_BOOL == desp->type)
{
SANE_Bool value = 0;
sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
cJSON_AddItemToObject(optJson, name, value ? cJSON_CreateTrue() : cJSON_CreateFalse());
cJSON* objJson = cJSON_CreateObject();
cJSON_AddItemToObject(objJson, "constType", cJSON_CreateNumber(0));
cJSON_AddItemToObject(objJson, "current", value ? cJSON_CreateTrue() : cJSON_CreateFalse());
cJSON_AddItemToObject(objJson, "isActive", cJSON_CreateTrue());
cJSON_AddItemToObject(objJson, "isSettable", cJSON_CreateTrue());
cJSON_AddItemToObject(objJson, "name", cJSON_CreateString(name));
cJSON_AddItemToObject(objJson, "type", cJSON_CreateNumber(0));
cJSON_AddItemToObject(objJson, "unit", cJSON_CreateString(""));
cJSON_AddItemToArray(arrayJson, objJson);
}
}
cJSON_AddItemToObject(optListJson, "Options", arrayJson);
char* str = cJSON_Print(optListJson);
if (NULL != str)
{
optListStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_Delete(optListJson);
} }
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;
char* str = cJSON_Print(optJson); p = p->next;
if (NULL != str)
{
optStr = GetBase64((HGByte*)str, strlen(str));
free(str);
}
cJSON_Delete(optJson);
} }
std::string dataStr = optStr + "|" + optListStr; cJSON_Delete(json);
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); SetParam();
if (NULL != resp)
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)
{ {
SendResponse((const HGByte*)resp, (HGUInt)strlen(resp), HGTRUE); HGImgFmt_CloseImageWriter(m_imgFmtWriter);
free(resp); m_imgFmtWriter = NULL;
HGBase_DeleteFile(m_writerFileName.c_str());
m_writerFileName.clear();
m_writerFileValid = false;
} }
cJSON_Delete(retJson);
} }
} }
} }
void WebUser::ConvertToBase64New(const std::string& filePath) void WebUser::AddOptItem(cJSON* optJson, cJSON* arrayJson, const char* name, const char* value, const char** list)
{ {
cJSON* retJson = cJSON_CreateObject(); cJSON_AddItemToObject(optJson, name, cJSON_CreateString(value));
if (NULL != retJson)
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_AddItemToObject(retJson, "Cmd", cJSON_CreateString("SBASE64")); cJSON* arrayJson2 = cJSON_CreateArray();
cJSON_AddItemToObject(retJson, "Code", cJSON_CreateNumber(2007)); const char** p = list;
while (0 != *p)
std::string dataStr;
FILE* file = fopen(filePath.c_str(), "rb");
if (NULL != file)
{ {
fseek(file, 0, SEEK_END); cJSON_AddItemToArray(arrayJson2, cJSON_CreateString(*p));
long size = ftell(file); ++p;
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;
dataStr = (const char*)base64Data;
delete[] base64Data;
}
delete[] data;
}
fclose(file);
} }
cJSON_AddItemToObject(objJson, "list", arrayJson2);
cJSON_AddItemToObject(retJson, "Data", cJSON_CreateString(dataStr.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);
} }
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() void WebUser::PostDisConnectMsg()
@ -1499,6 +1486,8 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
if (p->m_server->IsOld()) if (p->m_server->IsOld())
{ {
assert(NULL == p->m_imgFmtWriter);
int code = 0; int code = 0;
std::string result = ""; std::string result = "";
@ -1518,6 +1507,63 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
free(resp); free(resp);
} }
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); cJSON_Delete(retJson);
} }
} }
@ -1582,6 +1628,69 @@ int WebUser::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
cJSON_Delete(retJson); 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); HGBase_DestroyImage(img);
} }
@ -1630,6 +1739,61 @@ std::string WebUser::GetBase64(HGImage image)
return ret; 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:image/pdf;base64,";
else if (HGIMGFMT_TYPE_OFD == imgType)
prefix = "data:image/ofd;base64,";
base64.insert(0, prefix);
}
return base64;
}
std::string WebUser::GetBase64(const HGByte* data, HGUInt size) std::string WebUser::GetBase64(const HGByte* data, HGUInt size)
{ {
std::string ret; std::string ret;
@ -1647,6 +1811,129 @@ std::string WebUser::GetBase64(const HGByte* data, HGUInt size)
return ret; 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_source == "Adf-front")
{
SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_DM);
HGBool b = HGFALSE;
SetParam(OPTION_TITLE_JHZFM, &b);
}
else if (m_source == "Adf-back")
{
SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_DM);
HGBool b = HGTRUE;
SetParam(OPTION_TITLE_JHZFM, &b);
}
else
{
SetParam(OPTION_TITLE_SMYM, OPTION_VALUE_SMYM_SM);
HGBool b = HGFALSE;
SetParam(OPTION_TITLE_JHZFM, &b);
}
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 = atoi(m_resolution.c_str());
SetParam(OPTION_TITLE_FBL, &dpi);
if (atoi(m_deletefilesbeforescan.c_str()))
{
ClearPath(m_filepath);
}
if (1 == atoi(m_filetype.c_str()))
m_filesuffix = "bmp";
else if (2 == atoi(m_filetype.c_str()))
m_filesuffix = "png";
else if (4 == atoi(m_filetype.c_str()))
m_filesuffix = "tif";
else if (5 == atoi(m_filetype.c_str()))
m_filesuffix = "gif";
else if (6 == atoi(m_filetype.c_str()))
m_filesuffix = "pdf";
else if (7 == atoi(m_filetype.c_str()))
m_filesuffix = "ofd";
else
m_filesuffix = "jpg";
if ("tif" == m_filesuffix || "pdf" == m_filesuffix || "ofd" == 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) HGBool WebUser::SetParam(const char* optionName, const HGVoid* data)
{ {
assert(NULL != m_devHandle); assert(NULL != m_devHandle);

View File

@ -7,6 +7,7 @@
#include "base/HGThread.h" #include "base/HGThread.h"
#include "base/HGImage.h" #include "base/HGImage.h"
#include "base/HGMsgPump.h" #include "base/HGMsgPump.h"
#include "imgfmt/HGImgFmt.h"
#include "Msg.h" #include "Msg.h"
#include "cJSON.h" #include "cJSON.h"
#include "sane/sane_ex.h" #include "sane/sane_ex.h"
@ -45,15 +46,20 @@ private:
void DeviceListPlugNew(); void DeviceListPlugNew();
void GetSettingInfoNew(const std::string &devName); void GetSettingInfoNew(const std::string &devName);
void ConvertToBase64New(const std::string& filePath); void ConvertToBase64New(const std::string& filePath);
void ScanNew(const std::string& devName, const std::string& devParam);
private: private:
static void AddOptItem(cJSON* optJson, cJSON* arrayJson, const char *name, const char *value, const char **list);
void PostDisConnectMsg(); void PostDisConnectMsg();
void PostCmdMsg(const HGByte* data, HGUInt dataSize); void PostCmdMsg(const HGByte* data, HGUInt dataSize);
void PostEventMsg(const HGByte* data, HGUInt dataSize); void PostEventMsg(const HGByte* data, HGUInt dataSize);
static void HGAPI ThreadFunc(HGThread thread, HGPointer param); 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); static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
std::string GetBase64(HGImage image); std::string GetBase64(HGImage image);
std::string GetBase64(const HGByte* data, HGUInt size); 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); HGBool SetParam(const char* optionName, const HGVoid* data);
bool ShakeHand(const std::string& head); bool ShakeHand(const std::string& head);
@ -80,4 +86,17 @@ private:
std::string m_devName; std::string m_devName;
SANE_Handle m_devHandle; SANE_Handle m_devHandle;
HGEvent m_scanEvent; 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;
}; };

View File

@ -42,9 +42,6 @@ int main()
assert(0 == ret); assert(0 == ret);
#endif #endif
lang_initialize(nullptr);
lang_set_code_page(20127);
HGMsgPump msgPump = NULL; HGMsgPump msgPump = NULL;
HGBase_CreateMsgPump(&msgPump); HGBase_CreateMsgPump(&msgPump);

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,201 @@
<!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>
<label for="showbase64">显示Base64</label>
<input type="checkbox" id="showbase64"><br>
<label for="source">单/双面:</label>
<select id="source">
<option value="Adf-front">Adf-front</option>
<option value="Adf-back">Adf-back</option>
<option value="Adf-duplex" selected>Adf-duplex</option>
</select><br>
<label for="mode">颜色模式:</label>
<select id="mode">
<option value="Lineart">Lineart</option>
<option value="Gray">Gray</option>
<option value="Color" selected>Color</option>
</select><br>
<label for="resolution">分辨率:</label>
<input type="number" id="resolution" min="1" max="600" value="200" step="1"><br>
<input id="scan" type="button" value="扫描" onclick="scan()" /><br>
<input id="getsettinginfo" type="button" value="获取扫描参数" onclick="getsettinginfo()" />
<input id="converttobase64" type="button" value="转换Base64" onclick="converttobase64()" />
</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 = document.getElementById('showbase64').checked ? 1 : 0;
psl.sane.source = document.getElementById('source').value;
psl.sane.mode = document.getElementById('mode').value;
psl.sane.resolution = parseInt(document.getElementById('resolution').value, 10);
psl.sane.deletefilesbeforescan = 1;
psl.sane.filepath = "D:\\123456";
psl.sane.fileprefix = "KKKKKK";
psl.sane.filetype = 6;
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>