新增中晶so 和 web

This commit is contained in:
modehua 2023-04-15 11:15:39 +08:00
parent 46ad729954
commit 2c11d37e61
86 changed files with 38799 additions and 1 deletions

View File

@ -50,7 +50,9 @@ if [ "$oem" != "hg" ] \
&& [ "$oem" != "zj" ]\
&& [ "$oem" != "ctsso" ]\
&& [ "$oem" != "cts" ]\
&& [ "$oem" != "zg" ];
&& [ "$oem" != "zg" ]\
&& [ "$oem" != "zgso" ]\
&& [ "$oem" != "zgweb" ];
then
echo "参数错误:$oem !!!"
echo "参数:华高:hg || hgweb ||hgso 立思层:lsc || lscweb ||lscso 汉王:hw || hwweb || hwso 沧田:cts"
@ -257,6 +259,11 @@ else
elif [ "$oem" == "ctsweb" ];
then
dpkgpath="cumtennwebscan"
elif [ "$oem" == "zjweb" ];
then
dpkgpath="Microtekwebscan"
elif [ "$oem" == "hgso" ];
then
dpkgpath="huagaoscansdk"
@ -269,6 +276,10 @@ else
elif [ "$oem" == "ctsso" ];
then
dpkgpath="cumtennscansdk"
elif [ "$oem" == "zjso" ];
then
dpkgpath="Microtekscansdk"
elif [ "$oem" == "lscsm" ];
then
dpkgpath="lanxumscan"

13
kylin/zjso/DEBIAN/control Normal file
View File

@ -0,0 +1,13 @@
package: Microtekscansdk
Version: 4.3001.2022.05251
Architecture: amd64
Section: utils
Priority: optional
Maintainer: pengming
Installed-Size: 35948
Replaces: Microtekscan
Conflicts:
Description:Microtekscan scanner app and sane-driver.
no extended description.
Depends: libc6 (>=2.0.0)

View File

@ -0,0 +1,5 @@
#!/bin/bash
udevadm control --reload-rules
udevadm trigger
ldconfig

View File

@ -0,0 +1 @@
/opt/Microtekscansdk/lib

View File

@ -0,0 +1,39 @@
# Load firmware for this printer.
#ACTION!="add", GOTO="mud_rules_end"
#HuaGao --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0100", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0200", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0300", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0400", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0139", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0239", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0339", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0439", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
#Lanxum --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8620", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8730", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8420", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8520", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8200", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8629", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8739", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8429", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8529", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
#Hanvon --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7039", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="1000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="8000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="9000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="1002", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7002", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7039", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
LABEL="mud_rules_end"

View File

@ -0,0 +1,6 @@
1. demo 文件夹中所使用的的编译规则以及python demo暂均基于amd架构国产系统使用若想在arm架构下使用python请更换相关动态库或调整cmakelist文件
注:
demo中均在银河麒麟以及UOS系统下测试过同时银河麒麟下使用python3.5UOS下使用python版本为python 3.7,请悉知

View File

@ -0,0 +1,14 @@
project(testdemo)
add_compile_options(-std=c++11)
FILE(GLOB SRC "*.cpp" "*.h" "*.c")
include_directories(${PROJECT_SOURCE_DIR}/../../include)
add_executable(${PROJECT_NAME} ${SRC})
#for ARM
link_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/../lib/)
target_link_libraries(${PROJECT_NAME} HGBase hgdriver HGImgFmt HGImgProc HGScannerLib mupdf pdf sane-hgsane)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../../bin)

View File

@ -0,0 +1,176 @@
#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <thread>
#include "HGScannerLib.h"
#include <string>
#define DELEAY_MS(x) std::this_thread::sleep_for(std::chrono::milliseconds((x)))
using namespace std;
//有图事件回调
static void DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPointer param)
{
static int indeximg = 0;
string savepath = std::to_string(++indeximg) + ".jpg";
cout << "save image : " << savepath << endl;
auto ret = HGLib_SaveImage(image, savepath.c_str(), 0);
cout << "save image : " << savepath << (ret ? " success" : " failed") << endl;
}
//设备热拔插事件回调
static void DeviceHotPlugEvent(HGUInt event, const HGChar *deviceName, HGPointer param)
{
cout << "Devices : " << deviceName << " DeviceHotPlugEvent : " << (event == HGLIB_DEVHOTPLUG_EVENT_ARRIVE ? "HGLIB_DEVHOTPLUG_EVENT_ARRIVE " : "HGLIB_DEVHOTPLUG_EVENT_LEFT") << endl;
}
//扫描状态事件回调
static void DeviceScanEvent(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param)
{
switch (event)
{
case HGLIB_DEVSCAN_EVENT_BEGIN:
cout << "DeviceScanEvent Start Scan" << endl;
break;
case HGLIB_DEVSCAN_EVENT_END:
cout << "DeviceScanEvent Scan stopped" << endl;
break;
case HGLIB_DEVSCAN_EVENT_INFO:
cout << "DeviceScanEvent info : " << info << endl;
break;
default:
cout << "Unkownun DeviceScanEvent " << event << endl;
break;
}
}
int main(unsigned char argc, unsigned char *argv[])
{
std::cout << "*********Enter Scanner SDK Demo *********" << std::endl;
HGLib_InitDevice(DeviceHotPlugEvent, 0); //初始化调用模块
DELEAY_MS(5000);
HGChar **devNameList = HGLib_GetDeviceNameList(); //获取已连接的设备列表,已字符数组的形式返回
if (devNameList)
{
HGLibDevice dev = HGLib_OpenDevice(devNameList[0]); //此示例代码中调用设备列表中第一个设备
if (dev)
{
HGUInt grpCount = 0;
HGLibDeviceParamGroup *groups = HGLib_GetDeviceParamGroupList(dev, &grpCount);
if (groups)
{
//获取sdk支持的功能项及配置项内容
for (size_t i = 0; i < grpCount; i++)
{
cout << "group: " << groups[i].group << endl;
for (size_t j = 0; j < groups[i].paramCount; j++)
{
cout << " option: " << groups[i].param[j].option
<< " type: " << groups[i].param[j].type << endl;
switch (groups[i].param[j].rangeType)
{
case HGLIB_OPTION_VALUERANGETYPE_INTLIST:
for (size_t k = 0; k < groups[i].param[j].intValueList.count; k++)
{
cout<<"support value["<<k<<"]="<<groups[i].param[j].intValueList.value[k]<<endl;
}
break;
case HGLIB_OPTION_VALUERANGETYPE_ENUMLIST:
for (size_t k = 0; k < groups[i].param[j].enumValueList.count; k++)
{
cout<<"support value["<<k<<"]="<<groups[i].param[j].enumValueList.value[k]<<endl;
}
break;
case HGLIB_OPTION_VALUERANGETYPE_DOUBLELIST:
for (size_t k = 0; k < groups[i].param[j].doubleValueList.count; k++)
{
cout<<"support value["<<k<<"]="<<groups[i].param[j].doubleValueList.value[k]<<endl;
}
break;
case HGLIB_OPTION_VALUERANGETYPE_INTRANGE:
cout<<"support value range min = "<<groups[i].param[j].intValueRange.minValue <<" max = "<<groups[i].param[j].intValueRange.maxValue<<endl;
break;
case HGLIB_OPTION_VALUERANGETYPE_DOUBLERANGE:
cout<<"support value range min = "<<groups[i].param[j].intValueRange.minValue <<" max = "<<groups[i].param[j].intValueRange.maxValue<<endl;
break;
default:
break;
}
switch (groups[i].param[j].type)
{
case HGLIB_OPTION_VALUETYPE_INT:
cout << " intValue: " << groups[i].param[j].intValue << endl;
break;
case HGLIB_OPTION_VALUETYPE_ENUM:
cout << " enumValue: " << groups[i].param[j].enumValue << endl;
break;
case HGLIB_OPTION_VALUETYPE_DOUBLE:
cout << " doubleValue: " << groups[i].param[j].doubleValue << endl;
break;
case HGLIB_OPTION_VALUETYPE_BOOL:
cout << " boolValue: " << groups[i].param[j].boolValue << endl;
break;
default:
cout << "unkownun type" << endl;
break;
}
}
}
}
HGInt intValue;
HGUInt enumValue;
HGDouble doubleValue;
HGBool boolValue;
//设置颜色模式
enumValue = HGLIB_OPTION_ENUMVALUE_YSMS_HB;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_YSMS,&enumValue);
//设置分辨率
intValue = 300;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_FBL,&intValue);
//设置单双面或跳过空白页
enumValue = HGLIB_OPTION_ENUMVALUE_SMYM_DM;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_SMYM,&enumValue);
//设置纸张尺寸 A3 A4 或匹配原始尺寸
enumValue = HGLIB_OPTION_ENUMVALUE_ZZCC_PPYSCC;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_ZZCC,&enumValue);
//设置旋转 90° 180° 270°
enumValue = HGLIB_OPTION_ENUMVALUE_WGFX_90;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_WGFX,&enumValue);
// 扫描指定张数
enumValue = HGLIB_OPTION_ENUMVALUE_SMZS_SMZDZS;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_SMZS,&enumValue);
intValue = 1;
HGLib_SetDeviceParam(dev,HGLIB_OPTION_NAME_SMSL,&intValue);
if (HGLib_StartDeviceScan(dev, DeviceScanEvent, 0, DeviceScanImageFunc, 0)) //开始启动扫描并注册扫描事件以及图像回调
{
DELEAY_MS(10000); //实际走纸延时等待处理
HGLib_StopDeviceScan(dev);
}
HGBool ret = HGLib_ReleaseDeviceParamGroupList(groups,grpCount);
if(!ret)
cout << "HGLib_ReleaseDeviceParamGroupList failed"<<endl;
HGLib_CloseDevice(dev); //关闭当前打开的设备
}
else
cout << "Open device : " << devNameList[0] << "failed " << endl;
HGLib_ReleaseDeviceNameList(devNameList); //释放设备列表
}
else
cout << "devices not found" << endl;
HGLib_DeinitDevice(); //退出扫描模块
cout << "*********Exit Scanner SDK Demo *********" << endl;
return 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

View File

@ -0,0 +1,4 @@
#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"
export LD_LIBRARY_PATH=$DIR
python3.7 test.py

View File

@ -0,0 +1,224 @@
import ctypes
import os
from os import system
import time
import platform
from ctypes import *
import random
class HGLibSaveImageParam(Structure):
_fields_ = [ ("size", c_uint),
("jpegQuality", c_uint),
("tiffCompression", c_uint),
("tiffJpegQuality", c_uint),
("ocr", c_int)]
class HGLibDeviceIntValueList(Structure):
_fields_ = [ ("value", POINTER(c_int)),
("count", c_uint)]
class HGLibDeviceEnumValueList(Structure):
_fields_ = [ ("value", POINTER(c_uint)),
("count", c_uint)]
class HGLibDeviceDoubleValueList(Structure):
_fields_ = [ ("value", POINTER(c_double)),
("count", c_uint)]
class HGLibDeviceIntValueRange(Structure):
_fields_ = [ ("minValue", c_int),
("maxValue", c_int)]
class HGLibDeviceDoubleValueRange(Structure):
_fields_ = [ ("minValue", c_double),
("maxValue", c_double)]
class HGLibDeviceParamType(Union):
_fields_ = [ ("intValue", c_int),
("enumValue", c_uint),
("doubleValue", c_double),
("boolValue", c_int)]
class HGLibDeviceParamRangeType(Union):
_fields_ = [ ("intValueList", HGLibDeviceIntValueList),
("enumValueList", HGLibDeviceEnumValueList),
("doubleValueList", HGLibDeviceDoubleValueList),
("intValueRange", HGLibDeviceIntValueRange),
("doubleValueRange", HGLibDeviceDoubleValueRange)]
class HGLibDeviceParam(Structure):
_fields_ = [ ("option", c_uint),
("type", c_uint),
("typeValue", HGLibDeviceParamType),
("rangeType", c_uint),
("rangeTypeValue", HGLibDeviceParamRangeType)]
class HGLibDeviceParamGroup(Structure):
_fields_ = [ ("group", c_uint),
("param", POINTER(HGLibDeviceParam)),
("paramCount", c_uint)]
print(os.path.abspath('.'))
#加载动态库 所有依赖库必须在同一运行目录下边
if platform.system() == 'Windows':
Objdll = ctypes.WinDLL(os.path.abspath('.') + "/HGScannerLib.dll")
elif platform.system() == "Linux":
Objdll = cdll.LoadLibrary(os.path.abspath('.') + "/libHGScannerLib.so")
#加载图像接口示例
HGLib_LoadImage = Objdll.HGLib_LoadImage
HGLib_LoadImage.argtypes = [ctypes.c_char_p]
HGLib_LoadImage.restype = ctypes.c_void_p
Image = HGLib_LoadImage(c_char_p(b"1.jpg"))
#保存图像接口示例
HGLib_SaveImage = Objdll.HGLib_SaveImage
HGLib_SaveImage.argtypes = [ctypes.c_void_p, ctypes.c_char_p, POINTER(HGLibSaveImageParam)]
HGLib_SaveImage.restype = ctypes.c_int
ImageParam = HGLibSaveImageParam()
ImageParam.size = 20
ImageParam.jpegQuality = 100
ImageParam.tiffCompression = 0
ImageParam.tiffJpegQuality = 0
ImageParam.ocr = 0
Ret = HGLib_SaveImage(Image, c_char_p(b"2.jpg"), pointer(ImageParam))
#释放图像资源
HGLib_ReleaseImage = Objdll.HGLib_ReleaseImage
HGLib_ReleaseImage.argtypes = [ctypes.c_void_p]
HGLib_ReleaseImage.restype = ctypes.c_int
Ret = HGLib_ReleaseImage(Image)
#设备热拔插回调事件
def HGLibDeviceHotPlugEventFunc(event: c_uint, deviceName: c_char_p, param: c_void_p):
print(deviceName)
return
#初始化操作
FuncType = CFUNCTYPE(None, c_uint, c_char_p, c_void_p)
cb = FuncType(HGLibDeviceHotPlugEventFunc)
HGLib_InitDevice = Objdll.HGLib_InitDevice
HGLib_InitDevice.argtypes = [FuncType, c_void_p]
HGLib_InitDevice.restype = ctypes.c_int
Ret = HGLib_InitDevice(cb, 0)
time.sleep(1)
#获取设备列表
HGLib_GetDeviceNameList = Objdll.HGLib_GetDeviceNameList
HGLib_GetDeviceNameList.argtypes = []
HGLib_GetDeviceNameList.restype = POINTER(ctypes.c_char_p)
DeviceNameList = HGLib_GetDeviceNameList()
#打开指定设备
HGLib_OpenDevice = Objdll.HGLib_OpenDevice
HGLib_OpenDevice.argtypes = [ctypes.c_char_p]
HGLib_OpenDevice.restype = ctypes.c_void_p
Device = HGLib_OpenDevice(DeviceNameList[0])
#获取设备所有参数
HGLib_GetDeviceParamGroupList = Objdll.HGLib_GetDeviceParamGroupList
HGLib_GetDeviceParamGroupList.argtypes = [ctypes.c_void_p, POINTER(c_uint)]
HGLib_GetDeviceParamGroupList.restype = POINTER(HGLibDeviceParamGroup)
DevParamCount = ctypes.c_uint()
DevParamGroup = HGLib_GetDeviceParamGroupList(Device, pointer(DevParamCount))
GroupList = ['None', 'BaseSetting', 'Brightness', 'ImageProc', 'PaperFeeding']
ValueTypeList = ['None', 'Int', 'Enum', 'Double', 'Bool']
ValueRangeTypeList = ['None', 'IntList', 'EnumList', 'DoubleList', 'IntRange', 'DoubleRange']
i = 0
while i < int(DevParamCount.value):
print("group" + str(i) + ":" + GroupList[DevParamGroup[i].group])
print(" paramCount:" + str(DevParamGroup[i].paramCount))
j = 0
while (j < int(DevParamGroup[i].paramCount)):
print(" paramOption:" + str(DevParamGroup[i].param[j].option))
print(" paramValueType:" + ValueTypeList[DevParamGroup[i].param[j].type])
print(" paramValueRangeType:" + ValueRangeTypeList[DevParamGroup[i].param[j].rangeType])
j += 1
i += 1
#销毁
HGLib_ReleaseDeviceParamGroupList = Objdll.HGLib_ReleaseDeviceParamGroupList
HGLib_ReleaseDeviceParamGroupList.argtypes = [POINTER(HGLibDeviceParamGroup), c_uint]
HGLib_ReleaseDeviceParamGroupList.restype = ctypes.c_int
Ret = HGLib_ReleaseDeviceParamGroupList(DevParamGroup, DevParamCount)
#设置扫描参数
HGLib_SetDeviceParam = Objdll.HGLib_SetDeviceParam
HGLib_SetDeviceParam.argtypes = [ctypes.c_void_p, ctypes.c_uint, ctypes.c_void_p]
HGLib_SetDeviceParam.restype = ctypes.c_int
DevParam = ctypes.c_int(1) #HGLIB_OPTION_ENUMVALUE_DLSCLX_W -> 不进行多流输出类型
Ret = HGLib_SetDeviceParam(Device, 1, byref(DevParam)) #见HGLib_SetDeviceParam 头文件接口说明 1 -> HGLIB_OPTION_NAME_DLSC 多流输出
#扫描事件回调
def HGLibDeviceScanEventFunc(device: c_void_p, event: c_uint, err: c_int, info: c_char_p, param: c_void_p):
s_info=info
global bStop
print("event code",event," event info:",s_info)
if event == 2:#HGLIB_DEVSCAN_EVENT_END 扫描停止
bStop=True
print("bStop true")
elif event == 1:
bStop=False
print("bStop false")
return
imgindex=0
#扫描图像事件回调
def HGLibDeviceScanImageFunc(device: c_void_p, image: c_void_p, param: c_void_p):
global imgindex
ImageParam = HGLibSaveImageParam()
ImageParam.size = 20
ImageParam.jpegQuality = 100
ImageParam.tiffCompression = 0
ImageParam.tiffJpegQuality = 0
ImageParam.ocr = 0
print("image call back!!")
imgindex+=1
t_index=imgindex
imgname=str(t_index) + '_scanned.jpg'
print(imgname)
b_imagename=imgname.encode('utf-8')
pchar=c_char_p(b_imagename)
Ret = HGLib_SaveImage(image, pchar, pointer(ImageParam))
return
#注册扫描相关事件并启动扫描
FuncType1 = CFUNCTYPE(None, c_void_p, c_uint, c_int, c_char_p, c_void_p)
cb1 = FuncType1(HGLibDeviceScanEventFunc)
FuncType2 = CFUNCTYPE(None, c_void_p, c_void_p, c_void_p)
cb2 = FuncType2(HGLibDeviceScanImageFunc)
HGLib_StartDeviceScan = Objdll.HGLib_StartDeviceScan
HGLib_StartDeviceScan.argtypes = [c_void_p, FuncType1, c_void_p, FuncType2, c_void_p]
HGLib_StartDeviceScan.restyped = ctypes.c_int
print("start scan")
Ret = HGLib_StartDeviceScan(Device, cb1, 0, cb2, 0)
#模拟扫描持续应等待扫描事件回调返回扫描停止才结束本次扫描流程
while(not bStop):
time.sleep(1)
print("scanning...")
print("scan done!!!")
#关闭当前打开的设备
HGLib_CloseDevice=Objdll.HGLib_CloseDevice
HGLib_CloseDevice.argtypes = [c_void_p]
HGLib_CloseDevice.restype = ctypes.c_int
HGLib_CloseDevice(Device)
print("Close Devices")
#释放设备列表资源
HGLib_ReleaseDeviceNameList=Objdll.HGLib_ReleaseDeviceNameList
HGLib_ReleaseDeviceNameList.argtypes=[POINTER(ctypes.c_char_p)]
HGLib_ReleaseDeviceNameList.restype = ctypes.c_int
HGLib_ReleaseDeviceNameList(DeviceNameList)
print("ReleaseDeviceNameList done")
print("exit test")

View File

@ -0,0 +1,141 @@
#ifndef __HGDEF_H__
#define __HGDEF_H__
/****************************************************************************
* Platform Dependent Definitions and Typedefs *
****************************************************************************/
/* Microsoft C/C++ Compiler */
#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) || defined (_WINDOWS)
#define HG_CMP_MSC
#if defined(_WIN64) || defined(WIN64)
#define HG_64BIT
#elif defined(_WIN32) || defined(WIN32)
#define HG_32BIT
#endif
/* Apple Compiler (which is GNU now) */
#elif defined(__APPLE__)
#define HG_CMP_XCODE
#define HG_64BIT
/* GNU C/C++ Compiler */
#elif defined(__GNUC__)
#define HG_CMP_GNU
#if defined(__alpha__) || defined(__ia64__) || defined(__ppc64__) || defined(__s390x__) || defined(__x86_64__)
#define HG_64BIT
#else
#define HG_32BIT
#endif
/* Unrecognized */
#else
#error Unrecognized compiler
#endif
#if defined(HG_CMP_MSC)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#endif
/* type defines */
typedef void HGVoid;
typedef char HGChar;
typedef unsigned char HGByte;
typedef short HGShort;
typedef unsigned short HGUShort;
typedef int HGInt;
typedef unsigned int HGUInt;
typedef long long HGLonglong;
typedef unsigned long long HGULonglong;
typedef void* HGPointer;
typedef HGInt HGBool;
typedef float HGFloat;
typedef double HGDouble;
#ifdef HG_64BIT
typedef HGLonglong HGSize;
typedef HGULonglong HGUSize;
#else
typedef HGInt HGSize;
typedef HGUInt HGUSize;
#endif
typedef HGUInt HGColor;
#define HG_MAKECOLOR(r, g, b, a) (HGColor)(((HGUInt)a << 24) | ((HGUInt)b << 16) | ((HGUInt)g << 8) | (HGUInt)r)
#define HG_GETCOLOR_R(color) (HGUInt)((HGColor)color & 0xFF)
#define HG_GETCOLOR_G(color) (HGUInt)(((HGColor)color >> 8) & 0xFF)
#define HG_GETCOLOR_B(color) (HGUInt)(((HGColor)color >> 16) & 0xFF)
#define HG_GETCOLOR_A(color) (HGUInt)(((HGColor)color >> 24) & 0xFF)
/* error code */
typedef HGUInt HGResult;
#define HGTRUE 1
#define HGFALSE 0
#ifndef HGMAX
#define HGMAX(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef HGMIN
#define HGMIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
#if defined(HG_CMP_MSC)
#ifdef __cplusplus
#define HGEXPORT extern "C"
#else
#define HGEXPORT
#endif /* __cplusplus */
#define HGAPI __stdcall
#define HGAPIV __cdecl
#else
#ifdef __cplusplus
#define HGEXPORT extern "C" __attribute ((visibility("default")))
#else
#define HGEXPORT __attribute ((visibility("default")))
#endif /* __cplusplus */
#define HGAPI
#define HGAPIV
#endif
#define HG_DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
typedef struct
{
HGInt left;
HGInt top;
HGInt right;
HGInt bottom;
}HGRect;
typedef struct
{
HGFloat left;
HGFloat top;
HGFloat right;
HGFloat bottom;
}HGRectF;
typedef struct
{
HGInt x;
HGInt y;
}HGPoint;
typedef struct
{
HGFloat x;
HGFloat y;
}HGPointF;
#endif /* __HGDEF_H__ */

View File

@ -0,0 +1,473 @@
#ifndef __HGSCANNERLIB_H__
#define __HGSCANNERLIB_H__
#include "HGDef.h"
HG_DECLARE_HANDLE(HGLibImage);
HG_DECLARE_HANDLE(HGLibDevice);
/* TIFF压缩方式 */
#define HGLIB_TIFFCOMPRESSION_NONE 1L
#define HGLIB_TIFFCOMPRESSION_CCITTFAX4 2L
#define HGLIB_TIFFCOMPRESSION_LZW 3L
#define HGLIB_TIFFCOMPRESSION_JPEG 4L
/* 设备热拔插事件 */
#define HGLIB_DEVHOTPLUG_EVENT_ARRIVE 1L
#define HGLIB_DEVHOTPLUG_EVENT_REMOVE 2L
/* 设备扫描事件 */
#define HGLIB_DEVSCAN_EVENT_BEGIN 1L
#define HGLIB_DEVSCAN_EVENT_END 2L
#define HGLIB_DEVSCAN_EVENT_INFO 3L
/* 组名 */
// 基本设置
#define HGLIB_GROUP_NAME_BASESETTING 1L
// 亮度
#define HGLIB_GROUP_NAME_BRIGHTNESS 2L
// 图像处理
#define HGLIB_GROUP_NAME_IMAGEPROCESS 3L
// 送纸方式设置
#define HGLIB_GROUP_NAME_PAPERFEEDING 4L
/* 配置名 */
#define HGLIB_OPTION_NAME_UNKNOWN 0L
// "多流输出"
#define HGLIB_OPTION_NAME_DLSC 1L
// "多流输出类型"
#define HGLIB_OPTION_NAME_DLSCLX 2L
// "颜色模式"
#define HGLIB_OPTION_NAME_YSMS 3L
// "黑白图像阈值"
#define HGLIB_OPTION_NAME_HBTXYZ 4L
// "灰度或黑白图像 - 除色"
#define HGLIB_OPTION_NAME_HDHHBTX_CS 5L
// "24位彩色图像 - 多流输出除红"
#define HGLIB_OPTION_NAME_24WCSTX_DLSCCH 6L
// "24位彩色图像 - 答题卡除红"
#define HGLIB_OPTION_NAME_24WCSTX_DTKCH 7L
// "背景移除"
#define HGLIB_OPTION_NAME_BJYC 8L
// "背景色彩浮动范围"
#define HGLIB_OPTION_NAME_BJSCFDFW 9L
// "锐化与模糊"
#define HGLIB_OPTION_NAME_RHYMH 10L
// "去除摩尔纹"
#define HGLIB_OPTION_NAME_QCMW 11L
// "除网纹"
#define HGLIB_OPTION_NAME_CWW 12L
// "错误扩散"
#define HGLIB_OPTION_NAME_CWKS 13L
// "黑白图像噪点优化"
#define HGLIB_OPTION_NAME_HBTXZDYH 14L
// "噪点优化尺寸"
#define HGLIB_OPTION_NAME_ZDYHCC 15L
// "纸张尺寸"
#define HGLIB_OPTION_NAME_ZZCC 16L
// "自定义扫描区域"
#define HGLIB_OPTION_NAME_ZDYSMQY 17L
// "扫描区域左侧mm"
#define HGLIB_OPTION_NAME_SMQYZCmm 18L
// "扫描区域右侧mm"
#define HGLIB_OPTION_NAME_SMQYYCmm 19L
// "扫描区域上侧mm"
#define HGLIB_OPTION_NAME_SMQYSCmm 20L
// "扫描区域下侧mm"
#define HGLIB_OPTION_NAME_SMQYXCmm 21L
// "尺寸检测"
#define HGLIB_OPTION_NAME_CCJC 22L
// "扫描页面"
#define HGLIB_OPTION_NAME_SMYM 23L
// "跳过空白页灵敏度"
#define HGLIB_OPTION_NAME_TGKBYLMD 24L
// "分纸强度"
#define HGLIB_OPTION_NAME_FZQD 25L
// "休眠时间"
#define HGLIB_OPTION_NAME_XMSJ 26L
// "分辨率"
#define HGLIB_OPTION_NAME_FBL 27L
// "画质"
#define HGLIB_OPTION_NAME_HZ 28L
// "交换正反面"
#define HGLIB_OPTION_NAME_JHZFM 29L
// "图像拆分"
#define HGLIB_OPTION_NAME_TXCF 30L
// "自动纠偏"
#define HGLIB_OPTION_NAME_ZDJP 31L
// "启用色调曲线"
#define HGLIB_OPTION_NAME_QYSDQX 32L
// "亮度值"
#define HGLIB_OPTION_NAME_LDZ 33L
// "对比度"
#define HGLIB_OPTION_NAME_DBD 34L
// "伽马值"
#define HGLIB_OPTION_NAME_GMZ 35L
// "照片模式"
#define HGLIB_OPTION_NAME_ZPMS 36L
// "消除黑框"
#define HGLIB_OPTION_NAME_XCHK 37L
// "深色样张"
#define HGLIB_OPTION_NAME_SSYZ 38L
// "阈值"
#define HGLIB_OPTION_NAME_YZ 39L
// "背景抗噪等级"
#define HGLIB_OPTION_NAME_BJKZDJ 40L
// "边缘缩进"
#define HGLIB_OPTION_NAME_BYSJ 41L
// "背景填充方式"
#define HGLIB_OPTION_NAME_BJTCFS 42L
// "防止渗透"
#define HGLIB_OPTION_NAME_FZST 43L
// "防止渗透等级"
#define HGLIB_OPTION_NAME_FZSTDJ 44L
// "穿孔移除—左侧"
#define HGLIB_OPTION_NAME_CKYCZC 45L
// #"左侧穿孔搜索范围占幅面比例"
#define HGLIB_OPTION_NAME_ZCCKSSFWZFMBL 46L
// "穿孔移除—右侧"
#define HGLIB_OPTION_NAME_CKYCYC 47L
// #"右侧穿孔搜索范围占幅面比例"
#define HGLIB_OPTION_NAME_YCCKSSFWZFMBL 48L
// "穿孔移除—上侧"
#define HGLIB_OPTION_NAME_CKYCSC 49L
// #"上侧穿孔搜索范围占幅面比例"
#define HGLIB_OPTION_NAME_SCCKSSFWZFMBL 50L
// "穿孔移除—下侧"
#define HGLIB_OPTION_NAME_CKYCXC 51L
// #"下侧穿孔搜索范围占幅面比例"
#define HGLIB_OPTION_NAME_XCCKSSFWZFMBL 52L
// "色彩填充"
#define HGLIB_OPTION_NAME_SCTC 53L
// "超声波检测"
#define HGLIB_OPTION_NAME_CSBJC 54L
// "双张图片处理"
#define HGLIB_OPTION_NAME_SZTPCL 55L
// "装订检测"
#define HGLIB_OPTION_NAME_ZDJC 56L
// "扫描张数"
#define HGLIB_OPTION_NAME_SMZS 57L
// "扫描数量"
#define HGLIB_OPTION_NAME_SMSL 58L
// "文稿方向"
#define HGLIB_OPTION_NAME_WGFX 59L
// "背面旋转180°"
#define HGLIB_OPTION_NAME_BMXZ180 60L
// "折角检测"
#define HGLIB_OPTION_NAME_ZJJC 61L
// "折角大小"
#define HGLIB_OPTION_NAME_ZJDX 62L
// "歪斜检测"
#define HGLIB_OPTION_NAME_WXJC 63L
// "歪斜容忍度"
#define HGLIB_OPTION_NAME_WXRRD 64L
// 自动搓纸强度
#define HGLIB_OPTION_NAME_ZDCZQD 65L
// 搓纸阈值
#define HGLIB_OPTION_NAME_CZYZ 66L
// 待纸扫描
#define HGLIB_OPTION_NAME_DZSM 67L
// 黑白图像反色输出正常颜色为0 - 黑色1 - 白色)
#define HGLIB_OPTION_NAME_HBTXFSSC 68L
/* 配置枚举值 */
// "无"
#define HGLIB_OPTION_ENUMVALUE_DLSCLX_W 1L
// "彩色+灰度+黑白"
#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HD_HB 2L
// "彩色+灰度"
#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HD 3L
// "彩色+黑白"
#define HGLIB_OPTION_ENUMVALUE_DLSCLX_CS_HB 4L
// "灰度+黑白"
#define HGLIB_OPTION_ENUMVALUE_DLSCLX_HD_HB 5L
// "24位彩色"
#define HGLIB_OPTION_ENUMVALUE_YSMS_24WCS 6L
// "256级灰度"
#define HGLIB_OPTION_ENUMVALUE_YSMS_256JHD 7L
// "黑白"
#define HGLIB_OPTION_ENUMVALUE_YSMS_HB 8L
// "颜色自动识别"
#define HGLIB_OPTION_ENUMVALUE_YSMS_YSZDSB 9L
// "不除色"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_BCS 10L
// "除红色"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CHS 11L
// "除绿色"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CLS 12L
// "除蓝色"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_CHULANSE 13L
// "红色增强"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_HSZQ 14L
// "绿色增强"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_LSZQ 15L
// "蓝色增强"
#define HGLIB_OPTION_ENUMVALUE_HDHHBTX_CS_LANSEZENGQIANG 16L
// "无"
#define HGLIB_OPTION_ENUMVALUE_RHYMH_W 17L
// "锐化"
#define HGLIB_OPTION_ENUMVALUE_RHYMH_RH 18L
// "进一步锐化"
#define HGLIB_OPTION_ENUMVALUE_RHYMH_JYBRH 19L
// "模糊"
#define HGLIB_OPTION_ENUMVALUE_RHYMH_MH 20L
// "进一步模糊"
#define HGLIB_OPTION_ENUMVALUE_RHYMH_JYBMH 21L
// "A3"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A3 22L
// "8开"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_8K 23L
// "A4"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A4 24L
// "A4横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A4HX 25L
// "16开"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_16K 26L
// "16开横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_16KHX 27L
// "A5"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A5 28L
// "A5横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A5HX 29L
// "A6"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A6 30L
// "A6横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_A6HX 31L
// "B4"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_B4 32L
// "B5"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_B5 33L
// "B5横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_B5HX 34L
// "B6"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_B6 35L
// "B6横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_B6HX 36L
// "Letter"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_Letter 37L
// "Letter横向"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_LetterHX 38L
// "Double Letter"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_DoubleLetter 39L
// "LEGAL"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_LEGAL 40L
// "匹配原始尺寸"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_PPYSCC 41L
// "最大扫描尺寸自动裁切"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_ZDSMCCZDCQ 42L
// "最大扫描尺寸"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_ZDSMCC 43L
// "三联试卷"
#define HGLIB_OPTION_ENUMVALUE_ZZCC_SLSJ 44L
// "单面"
#define HGLIB_OPTION_ENUMVALUE_SMYM_DM 45L
// "双面"
#define HGLIB_OPTION_ENUMVALUE_SMYM_SM 46L
// "跳过空白页(通用)"
#define HGLIB_OPTION_ENUMVALUE_SMYM_TGKBYTY 47L
// "跳过空白页(发票纸)"
#define HGLIB_OPTION_ENUMVALUE_SMYM_TGKBYFPZ 48L
// "对折"
#define HGLIB_OPTION_ENUMVALUE_SMYM_DZ 49L
// "无"
#define HGLIB_OPTION_ENUMVALUE_HZ_W 50L
// "速度优先"
#define HGLIB_OPTION_ENUMVALUE_HZ_SDYX 51L
// "画质优先"
#define HGLIB_OPTION_ENUMVALUE_HZ_HZYX 52L
// "凸多边形"
#define HGLIB_OPTION_ENUMVALUE_BJTCFS_TDBX 53L
// "凹多边形"
#define HGLIB_OPTION_ENUMVALUE_BJTCFS_ADBX 54L
// "弱"
#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_R 55L
// "较弱"
#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_JR 56L
// "一般"
#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_YB 57L
// "较强"
#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_JQ 58L
// "强"
#define HGLIB_OPTION_ENUMVALUE_FZSTDJ_Q 59L
// "丢弃图像并停止扫描"
#define HGLIB_OPTION_ENUMVALUE_SZTPCL_DQTXBTZSM 60L
// "丢弃图像并继续扫描"
#define HGLIB_OPTION_ENUMVALUE_SZTPCL_DQTXBJXSM 61L
// "上传图像并停止扫描"
#define HGLIB_OPTION_ENUMVALUE_SZTPCL_SCTXBTZSM 62L
// "上传图像并继续扫描"
#define HGLIB_OPTION_ENUMVALUE_SZTPCL_SCTXBJXSM 63L
// "连续扫描"
#define HGLIB_OPTION_ENUMVALUE_SMZS_LXSM 64L
// "扫描指定张数"
#define HGLIB_OPTION_ENUMVALUE_SMZS_SMZDZS 65L
// "0°"
#define HGLIB_OPTION_ENUMVALUE_WGFX_0 66L
// "90°"
#define HGLIB_OPTION_ENUMVALUE_WGFX_90 67L
// "180°"
#define HGLIB_OPTION_ENUMVALUE_WGFX_180 68L
// "-90°"
#define HGLIB_OPTION_ENUMVALUE_WGFX__90 69L
// "自动文本方向识别°"
#define HGLIB_OPTION_ENUMVALUE_WGFX_ZDWBFXSB 70L
/* 配置值类型 */
#define HGLIB_OPTION_VALUETYPE_INT 1L
#define HGLIB_OPTION_VALUETYPE_ENUM 2L
#define HGLIB_OPTION_VALUETYPE_DOUBLE 3L
#define HGLIB_OPTION_VALUETYPE_BOOL 4L
/* 配置值范围类型 */
#define HGLIB_OPTION_VALUERANGETYPE_NULL 0L
#define HGLIB_OPTION_VALUERANGETYPE_INTLIST 1L
#define HGLIB_OPTION_VALUERANGETYPE_ENUMLIST 2L
#define HGLIB_OPTION_VALUERANGETYPE_DOUBLELIST 3L
#define HGLIB_OPTION_VALUERANGETYPE_INTRANGE 4L
#define HGLIB_OPTION_VALUERANGETYPE_DOUBLERANGE 5L
typedef struct
{
HGUInt size; /* 结构体大小必须初始化为sizeof(HGLibSaveImageParam) */
HGUInt jpegQuality; /* jpeg下有效, 0-100 */
HGUInt tiffCompression; /* tiff下有效, HGLIB_TIFFCOMPRESSION_* */
HGUInt tiffJpegQuality; /* tiff且HGLIB_TIFFCOMPRESSION_JPEG下有效, 0-100 */
HGBool ocr; /* 是否OCRpdf和ofd格式有效 */
}HGLibSaveImageParam;
typedef struct
{
HGInt* value;
HGUInt count;
}HGLibDeviceIntValueList;
typedef struct
{
HGUInt* value;
HGUInt count;
}HGLibDeviceEnumValueList;
typedef struct
{
HGDouble* value;
HGUInt count;
}HGLibDeviceDoubleValueList;
typedef struct
{
HGInt minValue;
HGInt maxValue;
}HGLibDeviceIntValueRange;
typedef struct
{
HGDouble minValue;
HGDouble maxValue;
}HGLibDeviceDoubleValueRange;
typedef struct
{
HGUInt option; /* 配置名, 参见HGLIB_OPTION_NAME_* */
HGUInt type; /* 值类型, 参见HGLIB_OPTION_VALUETYPE_* */
union
{
HGInt intValue;
HGUInt enumValue;
HGDouble doubleValue;
HGBool boolValue;
};
HGUInt rangeType; /* 值范围类型, 参见HGLIB_OPTION_VALUERANGETYPE_* */
union
{
HGLibDeviceIntValueList intValueList;
HGLibDeviceEnumValueList enumValueList;
HGLibDeviceDoubleValueList doubleValueList;
HGLibDeviceIntValueRange intValueRange;
HGLibDeviceDoubleValueRange doubleValueRange;
};
}HGLibDeviceParam;
typedef struct
{
HGUInt group; /* 组名, 参见HGLIB_GROUP_NAME_* */
HGLibDeviceParam* param;
HGUInt paramCount;
}HGLibDeviceParamGroup;
/* 设备热拔插回调
* event: HGLIB_DEVHOTPLUG_EVENT_*
* deviceName:
* param:
*/
typedef void (*HGLibDeviceHotPlugEventFunc)(HGUInt event, const HGChar *deviceName, HGPointer param);
/* 设备扫描事件回调
* device:
* event: HGLIB_DEVSCAN_EVENT_*
* err: , HGLIB_DEVSCAN_EVENT_INFO下有效
* info: , HGLIB_DEVSCAN_EVENT_INFO下有效
* param:
*/
typedef void (*HGLibDeviceScanEventFunc)(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param);
/* 设备扫描图像回调
* device:
* image: , HGLib_ReleaseImage释放,
* param:
*/
typedef void (*HGLibDeviceScanImageFunc)(HGLibDevice device, HGLibImage image, HGPointer param);
/* 加载图像 */
HGEXPORT HGLibImage HGAPI HGLib_LoadImage(const HGChar *filePath);
/* 保存图像 */
HGEXPORT HGBool HGAPI HGLib_SaveImage(HGLibImage image, const HGChar* savePath, const HGLibSaveImageParam* saveParam);
/* 释放图像 */
HGEXPORT HGBool HGAPI HGLib_ReleaseImage(HGLibImage image);
/* 初始化扫描仪 */
HGEXPORT HGBool HGAPI HGLib_InitDevice(HGLibDeviceHotPlugEventFunc func, HGPointer param);
/* 反初始化扫描仪 */
HGEXPORT HGBool HGAPI HGLib_DeinitDevice();
/* 获取扫描仪名称列表 */
HGEXPORT HGChar** HGAPI HGLib_GetDeviceNameList();
/* 销毁扫描仪名称列表 */
HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceNameList(HGChar** deviceName);
/* 打开设备 */
HGEXPORT HGLibDevice HGAPI HGLib_OpenDevice(const HGChar *deviceName);
/* 关闭设备 */
HGEXPORT HGBool HGAPI HGLib_CloseDevice(HGLibDevice device);
/* 设置设备参数 */
HGEXPORT HGBool HGAPI HGLib_SetDeviceParam(HGLibDevice device, HGUInt option, const HGVoid *data);
/* 获取设备参数 */
HGEXPORT HGLibDeviceParamGroup* HGAPI HGLib_GetDeviceParamGroupList(HGLibDevice device, HGUInt *count);
HGEXPORT HGLibDeviceParam* HGAPI HGLib_GetDeviceParam(HGLibDevice device, HGUInt option);
/* 销毁设备参数 */
HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceParamGroupList(HGLibDeviceParamGroup* paramGroup, HGUInt count);
HGEXPORT HGBool HGAPI HGLib_ReleaseDeviceParam(HGLibDeviceParam* param);
/* 重置设备参数 */
HGEXPORT HGBool HGAPI HGLib_ResetDeviceParam(HGLibDevice device);
/* 设备是否有纸 */
HGEXPORT HGBool HGAPI HGLib_DeviceIsPaperOn(HGLibDevice device);
/* 开始扫描 */
HGEXPORT HGBool HGAPI HGLib_StartDeviceScan(HGLibDevice device, HGLibDeviceScanEventFunc eventFunc, HGPointer eventParam,
HGLibDeviceScanImageFunc imageFunc, HGPointer imageParam);
/* 停止扫描 */
HGEXPORT HGBool HGAPI HGLib_StopDeviceScan(HGLibDevice device);
#endif /* __HGSCANNERLIB_H__ */

View File

@ -0,0 +1,7 @@
Package: Microtekwebserver
Version: 1.0.5
Architecture: amd64
Maintainer: scanner
Section: libs
Priority: optional
Description: scanner

View File

@ -0,0 +1,26 @@
#!/bin/bash
chmod 777 -R /opt/Microtekwebscan/bin/*
udevadm control --reload
udevadm trigger
echo "installed in the dir /opt/huagaowebscan"
#echo "demo web page in the static dir"
chmod 644 /etc/udev/rules.d/60-huag*
udevadm control --reload-rules
udevadm trigger
echo "enable Microtekwebscanserver.service "
systemctl enable Microtekwebscanserver.service
echo "reload daemoning "
systemctl daemon-reload
echo "enable start.service "
systemctl start Microtekwebscanserver.service
sleep 10
echo "install Microtekwebscanserver finished"

27
kylin/zjweb/DEBIAN/postrm Normal file
View File

@ -0,0 +1,27 @@
#!/bin/bash
/opt/Microtekwebscan/bin/server.sh stop
systemctl stop Microtekwebscanserver.service
sleep 3
test -h /etc/systemd/system/multi-user.target.wants/Microtekwebscanserver.service
if [ $? -eq 0 ]; then
rm -rf /etc/systemd/system/multi-user.target.wants/Microtekwebscanserver.service
echo "services uninstall is success"
fi
test -h /etc/systemd/system/Microtekwebscanserver
if [ $? -eq 0 ]; then
rm -rf /etc/systemd/system/Microtekwebscanserver
fi
test -e /lib/systemd/system/Microtekwebscanserver.service
if [ $? -eq 0 ]; then
rm -rf /lib/systemd/system/Microtekwebscanserver.service
fi
systemctl daemon-reload
test -d /opt/Microtekwebscan/
if [ $? -eq 0 ]; then
rm -rf /opt/Microtekwebscan
fi

View File

@ -0,0 +1,39 @@
# Load firmware for this printer.
#ACTION!="add", GOTO="mud_rules_end"
#HuaGao --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0100", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0200", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0300", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0400", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0139", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0239", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0339", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="3072", ATTR{idProduct}=="0439", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
#Lanxum --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8620", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8730", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8420", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8520", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8200", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8629", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8739", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8429", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="31c9", ATTR{idProduct}=="8529", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
#Hanvon --->G100~G400
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7039", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="1000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="8000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="9000", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="1002", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7002", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="2903", ATTR{idProduct}=="7039", MODE="0666", OWNER="root", GROUP="lp", ENV{libsane_matched}="yes"
LABEL="mud_rules_end"

View File

@ -0,0 +1,18 @@
[Unit]
Description=Microtek webscan service
[Service]
Environment=LD_LIBRARY_PATH=/opt/Microtekwebscan/bin
Type=forking
User=root
ExecStart=/opt/Microtekwebscan/bin/server.sh start
ExecStop=/opt/Microtekwebscan/bin/server.sh stop
ExecReload=/opt/Microtekwebscan/bin/server.sh restart
Restart=always
RestartSSec=10
[Install]
WantedBy=multi-user.target
Alias=Microtekwebscanserver

View File

@ -0,0 +1,2 @@
#!/bin/bash
service Microtekwebscanserver restart

View File

@ -0,0 +1,89 @@
#!/bin/bash
DIR="$( cd "$( dirname "$0" )" && pwd )"
echo "current dir $DIR"
BASE_DIR="$DIR"
export LD_LIBRARY_PATH="$DIR"
APP_NAME=ZJWebService
APP_PATH="$BASE_DIR/ZJWebService"
echo "APP_PATH = $APP_PATH"
LIB_PARH="$BASE_DIR/libzjdriver.so"
echo "LIB_PARH = $LIB_PARH"
#userage
usage() {
echo "Usage: sh script.sh [start|stop|restart|status]"
exit 1
}
is_exist(){
if [ ! -f $BASE_DIR/ZJWebService ]; then
return 1
else
pid=`ps -ef | grep "ZJWebService" | grep -v grep | awk '{print $2}'`
echo "PID: $pid"
appNum=`ps -ef|awk '{print $2}'|grep -c -e "^${pid}\$"`
echo appNum $appNum
if [ ${appNum} -gt 0 ]; then
return 0
else
rm -rf $BASE_DIR/ZJWebService.pid >/dev/null 2>&1 &
return 1
fi
fi
}
#start server
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
echo "APP_PATH: $APP_PATH"
echo "LIB_PATH: $LIB_PARH"
"$DIR"/ZJWebService &
fi
}
#stop webserver
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
rm -rf $BASE_DIR/application.pid >/dev/null 2>&1 &
else
echo "${APP_NAME} is not running"
fi
}
#running status
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#restart server
restart(){
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac

Binary file not shown.

View File

@ -0,0 +1,220 @@
html {
height: 100%
}
body {
margin: 0;
font-size: 14px;
font-family: "PingFang SC";
min-width: 1200px;
min-height: 900px;
height: 100%;
}
.el-container {
height: 100%;
border: 1px solid #eee;
}
ul {
list-style: none;
}
.imageListSelect {
/* border: 1px solid #909399; */
/*box-shadow: 0 2px 6px #ADADAD;*/
border: 2px solid #fa7857 !important;
}
.aside {
border-right: 1px solid #eee;
border-bottom: 1px solid #eee;
height: 100%
}
.aside .header {
height: 40px;
background-color: #eaeaea;
line-height: 40px;
padding-left: 20px;
/* margin-top:10px; */
color: #09aaff;
}
.scroll::-webkit-scrollbar {
width: 8px;
height: 8px;
}
/* 设置滚动条的滑轨 */
.scroll::-webkit-scrollbar-track {
background-color: #eaeaea;
}
/* 滑块 */
.scroll::-webkit-scrollbar-thumb {
/* background-color: rgba(0, 0, 0, 0.6); */
background-color: #cdcdcd;
border-radius: 4px;
}
/* 滑轨两头的监听按钮 */
.scroll::-webkit-scrollbar-button {
/* background-color: #444; */
background-color: #cdcdcd;
display: none;
}
.el-container .el-header {
border-bottom: 1px solid #eee;
}
.el-container .el-header .iconContainer {
width: 100%;
text-align: center;
height: 35px
}
.el-container .el-header .menus {
width: 100%;
text-align: center;
font-size: 14px
}
.el-container .el-header .menuContainer {
float: left;
margin-left: 15px;
}
.el-container .el-header .menuContainer ul {
padding-left: 10px;
}
.el-container .el-header ul li {
float: left;
padding-left: 20px;
cursor: pointer;
}
.el-container .el-header .menuRight {
float: right;
}
.el-container .el-header .menuRight ul li {
padding-right: 20px;
float: right;
cursor: pointer;
}
.el-container .el-header .menuRight .iconContainer {
height: 28px;
}
.el-main {
height: 100%;
padding: 0px;
position: relative;
overflow: hidden;
}
.el-main .opt {
width: 58px;
height: 100%;
border-right: 1px solid #eee;
float: left;
background-color: #eaeaea;
}
.el-main .opt .active {
border-radius: 4px;
border: 1px solid #fff;
background-color: #cecece;
margin-left: 4px;
margin-right: 4px;
}
.image-container {
overflow: auto;
height: 100%;
box-sizing: border-box;
margin: auto;
}
.el-main .opt ul li {
cursor: pointer;
text-align: center;
line-height: 16px;
padding-top: 4px
}
.mask {
background-color: rgba(0, 0, 0, 0.6);
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
.mask .messageBox {
width: 500px;
border-radius: 3px;
position: fixed;
left: 50%;
top: 45%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
background-color: #fff;
padding: 15px;
}
.mask .messageBox .title {
border-radius: 3px;
margin-bottom: 30px;
padding-bottom: 15px;
border-bottom: 1px solid #eee;
font-size: 16px;
}
.mask .messageBox .title .closeReport {
float: right;
cursor: pointer;
}
.canvas-container {
margin: 0 auto;
}
.el-dropdown-link {
cursor: pointer;
color: #409EFF;
}
.el-icon-arrow-down {
font-size: 12px;
}
.batch-item {
background-color: white;
}
.batch-item:hover {
background-color: #eaeaea;
}
.operaBg:hover {
background-color: #C0C4CC;
}
.font-style {
display: inline-block;
float: left;
width: 30%
}
.cursor-pointer {
cursor: pointer
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 900 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,171 @@
/*
* FileSaver.js
* A saveAs() FileSaver implementation.
*
* By Eli Grey, http://eligrey.com
*
* License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT)
* source : http://purl.eligrey.com/github/FileSaver.js
*/
// The one and only way of getting global scope in all environments
// https://stackoverflow.com/q/3277182/1008999
var _global = typeof window === 'object' && window.window === window
? window : typeof self === 'object' && self.self === self
? self : typeof global === 'object' && global.global === global
? global
: this
function bom (blob, opts) {
if (typeof opts === 'undefined') opts = { autoBom: false }
else if (typeof opts !== 'object') {
console.warn('Deprecated: Expected third argument to be a object')
opts = { autoBom: !opts }
}
// prepend BOM for UTF-8 XML and text/* types (including HTML)
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type })
}
return blob
}
function download (url, name, opts) {
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.responseType = 'blob'
xhr.onload = function () {
saveAs(xhr.response, name, opts)
}
xhr.onerror = function () {
console.error('could not download file')
}
xhr.send()
}
function corsEnabled (url) {
var xhr = new XMLHttpRequest()
// use sync to avoid popup blocker
xhr.open('HEAD', url, false)
try {
xhr.send()
} catch (e) {}
return xhr.status >= 200 && xhr.status <= 299
}
// `a.click()` doesn't work for all browsers (#465)
function click (node) {
try {
node.dispatchEvent(new MouseEvent('click'))
} catch (e) {
var evt = document.createEvent('MouseEvents')
evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80,
20, false, false, false, false, 0, null)
node.dispatchEvent(evt)
}
}
// Detect WebView inside a native macOS app by ruling out all browsers
// We just need to check for 'Safari' because all other browsers (besides Firefox) include that too
// https://www.whatismybrowser.com/guides/the-latest-user-agent/macos
var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent)
var saveAs = _global.saveAs || (
// probably in some web worker
(typeof window !== 'object' || window !== _global)
? function saveAs () { /* noop */ }
// Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView
: ('download' in HTMLAnchorElement.prototype && !isMacOSWebView)
? function saveAs (blob, name, opts) {
var URL = _global.URL || _global.webkitURL
var a = document.createElement('a')
name = name || blob.name || 'download'
a.download = name
a.rel = 'noopener' // tabnabbing
// TODO: detect chrome extensions & packaged apps
// a.target = '_blank'
if (typeof blob === 'string') {
// Support regular links
a.href = blob
if (a.origin !== location.origin) {
corsEnabled(a.href)
? download(blob, name, opts)
: click(a, a.target = '_blank')
} else {
click(a)
}
} else {
// Support blobs
a.href = URL.createObjectURL(blob)
setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s
setTimeout(function () { click(a) }, 0)
}
}
// Use msSaveOrOpenBlob as a second approach
: 'msSaveOrOpenBlob' in navigator
? function saveAs (blob, name, opts) {
name = name || blob.name || 'download'
if (typeof blob === 'string') {
if (corsEnabled(blob)) {
download(blob, name, opts)
} else {
var a = document.createElement('a')
a.href = blob
a.target = '_blank'
setTimeout(function () { click(a) })
}
} else {
navigator.msSaveOrOpenBlob(bom(blob, opts), name)
}
}
// Fallback to using FileReader and a popup
: function saveAs (blob, name, opts, popup) {
// Open a popup immediately do go around popup blocker
// Mostly only available on user interaction and the fileReader is async so...
popup = popup || open('', '_blank')
if (popup) {
popup.document.title =
popup.document.body.innerText = 'downloading...'
}
if (typeof blob === 'string') return download(blob, name, opts)
var force = blob.type === 'application/octet-stream'
var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari
var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent)
if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') {
// Safari doesn't allow downloading of blob URLs
var reader = new FileReader()
reader.onloadend = function () {
var url = reader.result
url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;')
if (popup) popup.location.href = url
else location = url
popup = null // reverse-tabnabbing #460
}
reader.readAsDataURL(blob)
} else {
var URL = _global.URL || _global.webkitURL
var url = URL.createObjectURL(blob)
if (popup) popup.location = url
else location.href = url
popup = null // reverse-tabnabbing #460
setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s
}
}
)
_global.saveAs = saveAs.saveAs = saveAs
if (typeof module !== 'undefined') {
module.exports = saveAs;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,656 @@
(function (window) {
const TAG = 'WebScanController:'
let Result = function (code, msg, data) {
this.code = code;
this.msg = msg;
this.data = data;
};
function WebScanController(options) {
if (options.wsUrl == '' || options.wsUrl == null || options.wsUrl == undefined) {
WebScanController.prototype.wsUrl = "ws://localhost:38999";
} else {
WebScanController.prototype.wsUrl = options.wsUrl;
}
WebScanController.prototype.wslicence = options.wslicence;
return WebScanController.prototype;
}
WebScanController.prototype = {
constructor: WebScanController,
/*****************************************扫描仪相关********************************************************************************/
initDevice: function (callBack) {
const that = this
this.sendCommand({
func: "init_device",
iden: that.wslicence
}, callBack)
},
deinitDevices: function (callBack) {
const that = this
this.sendCommand({
func: "deinit_device",
iden: that.wslicence
}, callBack)
},
getDeviceNameList: function (callBack) {
const that = this
this.sendCommand({
func: "get_device_name_list",
iden: that.wslicence
}, callBack)
},
openDevice: function (device_name, callBack) {
const that = this
this.sendCommand({
func: "open_device",
iden: that.wslicence,
device_name: device_name
}, callBack)
},
closeDevice: function (callBack) {
const that = this
this.sendCommand({
func: "close_device",
iden: that.wslicence
}, callBack)
},
setScanParams: function (appendParams, callBack) {
const that = this
let fixedParams = {
func: "set_device_param",
iden: that.wslicence
}
fixedParams.device_param = appendParams
console.log('final set scan params:' + JSON.stringify(fixedParams))
this.sendCommand(fixedParams, callBack)
},
getScanParams: function (callBack) {
const that = this
this.sendCommand({
func: "get_device_param",
iden: that.wslicence
}, callBack)
},
resetScanParams: function (callBack) {
const that = this
this.sendCommand({
func: "reset_device_param",
iden: that.wslicence
}, callBack)
},
getCurrDeviceName: function (callBack) {
const that = this
this.sendCommand({
func: "get_curr_device_name",
iden: that.wslicence
}, callBack)
},
//开始扫描
startScan: function (callBack) {
const that = this
this.sendCommand({
func: "start_scan",
iden: that.wslicence,
get_base64: true
}, callBack)
},
stopScan: function (callBack) {
const that = this
this.sendCommand({
func: "stop_scan",
iden: that.wslicence
}, callBack)
},
/*****************************************基本接口********************************************************************************/
getLocalPic(path, callBack) {
let that = this
const cmd = {
func: "load_local_image",
iden: that.wslicence,
image_path: path
}
console.log(TAG, 'getLocalPic', JSON.parse(cmd))
this.sendCommand(cmd, callBack)
},
saveLocalPic(base64, callBack) {
const that = this
const cmd = {
func: "save_local_image",
iden: that.wslicence,
image_base64: base64
}
console.log(TAG, 'saveLocalPic', JSON.parse(cmd))
this.sendCommand(cmd, callBack)
},
//获取全局配置
getGlobalConfig: function (callBack) {
const that = this
this.sendCommand({
func: "get_global_config",
iden: that.wslicence
}, callBack)
},
//设置全局配置
setGlobalConfig: function (appendParams, callBack) {
const that = this
let fixedParams = {
func: "set_global_config",
iden: that.wslicence
}
const finalParams = Object.assign({}, appendParams, fixedParams)
console.log('final set global params:' + JSON.stringify(finalParams))
this.sendCommand(finalParams, callBack)
},
//加载本地图像
loadLocalImage: function (imagePath, callBack) {
const that = this
this.sendCommand({
func: "load_local_image",
iden: that.wslicence,
image_path: imagePath
}, callBack)
},
//保存本地图像
saveLocalImage: function (imageBase64, callBack) {
const that = this
this.sendCommand({
func: "save_local_image",
iden: that.wslicence,
image_base64: imageBase64
}, callBack)
},
//删除本地文件(为了安全,仅能删除后端生成的文件)
deleteLocalFile: function (filePath, callBack) {
const that = this
this.sendCommand({
func: "delete_local_file",
iden: that.wslicence,
file_path: filePath
}, callBack)
},
//清理全局文件保存目录(为了安全,只会删除后端生成的文件)
clearGlobalFileSavePath: function (callBack) {
const that = this
this.sendCommand({
func: "clear_global_file_save_path",
iden: that.wslicence
}, callBack)
},
//合成本地图像
mergeLocalImage: function (imagePathList, mode, align, getBase64, callBack) {
const that = this
this.sendCommand({
func: "merge_local_image",
iden: that.wslicence,
image_path_list: imagePathList,
mode: mode,
align: align,
interval: 0,
get_base64: getBase64
}, callBack)
},
//本地合成多张图像
localMakeMultiImage: function (imagePathList, format, tiffCompression, tiffJpegQuality, callBack) {
const that = this
this.sendCommand({
func: "local_make_multi_image",
iden: that.wslicence,
image_path_list: imagePathList,
format: format,
tiff_compression: tiffCompression,
tiff_jpeg_quality: tiffJpegQuality
}, callBack)
},
//拆分本地图像
splitLocalImage: function (imagePath, mode, location, callBack) {
const that = this
this.sendCommand({
func: "split_local_image",
iden: that.wslicence,
image_path: imagePath,
mode: mode,
location: location
}, callBack)
},
//本地生成压缩文件
localMakeZipFile: function (imagePathList, callBack) {
const that = this
this.sendCommand({
func: "local_make_zip_file",
iden: that.wslicence,
image_path_list: imagePathList
}, callBack)
},
//本地图像纠偏
localImageDeskew: function (imagePath, callBack) {
const that = this
this.sendCommand({
func: "local_image_deskew",
iden: that.wslicence,
image_path: imagePath
}, callBack)
},
//上传本地文件
uploadLocalFile: function (filePath, uploadMode, remoteFilePath, callBack) {
const that = this
this.sendCommand({
func: "upload_local_file",
iden: that.wslicence,
file_path: filePath,
upload_mode: uploadMode,
remote_file_path: remoteFilePath
}, callBack)
},
//本地图片添加水印
localImageAddWatermark: function (imagePath, text, textColor, textOpacity, textPos, marginRight,
marginBottom, locationX, locationY, fontName, fontSize, fontBold, fontUnderline,
fontItalic, fontStrikeout, getBase64,
callBack) {
const that = this
this.sendCommand({
func: "local_image_add_watermark",
iden: that.wslicence,
image_path: imagePath,
text: text,
text_color: textColor,
text_opacity: textOpacity,
text_pos: textPos,
margin_left: parseInt(marginLeft),
margin_top: parseInt(marginTop),
margin_right: parseInt(marginRight),
margin_bottom: parseInt(marginBottom),
location_x: parseInt(locationX),
location_y: parseInt(locationY),
font_name: fontName,
font_size: parseInt(fontSize),
font_bold: fontBold,
font_underline: fontUnderline,
font_italic: fontItalic,
font_strikeout: fontStrikeout,
get_base64: getBase64
}, callBack)
},
/*****************************************文件管理相关********************************************************************************/
//获取批次号列表
getBatchIdList: function (callBack) {
const that = this
this.sendCommand({
func: "get_batch_id_list",
iden: that.wslicence
}, callBack)
},
//打开批次后端启动后默认打开最近批次没有最近批次则会新建default批次并打开
openBatch: function (batchId, callBack) {
const that = this
this.sendCommand({
func: "open_batch",
iden: that.wslicence,
batch_id: batchId + ""
}, callBack)
},
//删除批次
deleteBatch: function (batchId, callBack) {
const that = this
this.sendCommand({
func: "delete_batch",
iden: that.wslicence,
batch_id: batchId + ""// 批次id不能是当前批次
}, callBack)
},
//新建批次(新建批次到列表尾部并打开该批次)
createNewBatch: function (batchId, callBack) {
const that = this
this.sendCommand({
func: "new_batch",
iden: that.wslicence,
batch_id: batchId + ""
}, callBack)
},
//获取当前批次号
getCurrBatchId: function (callBack) {
const that = this
this.sendCommand({
func: "get_curr_batch_id",
iden: that.wslicence
}, callBack)
},
//修改批次号
modifyBatchId: function (batchId, newBatchId, callBack) {
const that = this
this.sendCommand({
func: "modify_batch_id",
iden: that.wslicence,
batch_id: batchId,
new_batch_id: newBatchId
}, callBack)
},
//加载图像缩略图列表
getImageThumbnailList: function (callBack) {
const that = this
this.sendCommand({
func: "get_image_thumbnail_list",
iden: that.wslicence
}, callBack)
},
//获取图像数量
getImageCount: function (callBack) {
const that = this
this.sendCommand({
func: "get_image_count",
iden: that.wslicence
}, callBack)
},
//绑定文件夹
bindFolder: function (folder, callBack) {
const that = this
this.sendCommand({
func: "bind_folder",
iden: that.wslicence,
folder: folder,
name_mode: "order",
name_width: 4,
name_base: 0
}, callBack)
},
//停止绑定文件夹
stopBindFolder: function (callBack) {
const that = this
this.sendCommand({
func: "stop_bind_folder",
iden: that.wslicence,
}, callBack)
},
//加载图像
loadImage: function (imageIndex, callBack) {
let that = this
this.sendCommand({
func: "load_image",
iden: imageIndex + "",
image_index: imageIndex
}, callBack)
},
//保存图像
saveImage: function (imageIndex, callBack) {
const that = this
this.sendCommand({
func: "save_image",
iden: that.wslicence,
image_index: imageIndex
}, callBack)
},
//插入本地图像需返回成功后前端缩略图才能作相应的UI修改
insertLocalImage: function (imagePath, insertIndex, callBack) {
const that = this
this.sendCommand({
func: "insert_local_image",
iden: that.wslicence,
image_path: imagePath,
insert_pos: insertIndex,//插入位置,-1表示最后
image_tag: ''//标签名,可以为空
}, callBack)
},
//插入图像
insertImage: function (imageBase64, insertIndex, callBack) {
const that = this
this.sendCommand({
func: "insert_image",
iden: that.wslicence,
image_base64: imageBase64,
insert_pos: insertIndex,//插入位置,-1表示最后
image_tag: ''//标签名,可以为空
}, callBack)
},
//修改图像标签
modifyImageTag: function (imageIndexList, imageTagList, callBack) {
const that = this
this.sendCommand({
func: "modify_image_tag",
iden: that.wslicence,
image_index_list: imageIndexList,
image_tag_list: imageTagList
}, callBack)
},
//删除图像
deleteImage: function (imageIndexList, callBack) {
const that = this
this.sendCommand({
func: "delete_image",
iden: that.wslicence,
image_index_list: imageIndexList
}, callBack)
},
//清理图像列表
clearImageList: function (callBack) {
const that = this
this.sendCommand({
func: "clear_image_list",
iden: that.wslicence
}, callBack)
},
//修改图像
modifyImage: function (imageIndex, imageBase64, callBack) {
const that = this
this.sendCommand({
func: "modify_image",
iden: that.wslicence,
image_index: imageIndex,
image_base64: imageBase64
}, callBack)
},
//使用本地图像修改图像
modifyImageByLocal: function (imageIndex, imagePath, callBack) {
const that = this
this.sendCommand({
func: "modify_image_by_local",
iden: that.wslicence,
image_index: imageIndex,
image_path: imagePath
}, callBack)
},
//移动图像
moveImage: function (imageIndexList, target, callBack) {
const that = this
this.sendCommand({
func: "move_image",
iden: that.wslicence,
image_index_list: imageIndexList,
mode: 'index',
target: target
}, callBack)
},
//图像书籍排序
imageBookSort: function (callBack) {
const that = this
this.sendCommand({
func: "image_book_sort",
iden: that.wslicence
}, callBack)
},
//合成图像
mergeImage: function (imageIndexList, mode, align, getBase64, callBack) {
const that = this
this.sendCommand({
func: "merge_image",
iden: that.wslicence,
image_index_list: imageIndexList,
mode: mode,
align: align,
interval: 0,
get_base64: getBase64
}, callBack)
},
//合成多张图像
makeMultiImage: function (imageIndexList, format, callBack) {
const that = this
let msg = {
func: "make_multi_image",
iden: that.wslicence,
image_index_list: imageIndexList,
format: format,
tiff_compression: 'none',
tiff_jpeg_quality: 80,
get_base64: true
}
this.sendCommand(msg, callBack)
},
//交换图片
exchangeImage: function (index1, index2, callBack) {
const that = this
this.sendCommand({
func: "exchange_image",
iden: that.wslicence,
image_index_1: index1,
image_index_2: index2
}, callBack)
},
//拆分图像
splitImage: function (imageIndex, mode, location, callBack) {
const that = this
this.sendCommand({
func: "split_image",
iden: that.wslicence,
image_index: imageIndex,
mode: mode,
location: location,
get_base64: true
}, callBack)
},
//压缩图像
makeZipFile: function (imageIndexList, callBack) {
const that = this
this.sendCommand({
func: "make_zip_file",
iden: that.wslicence,
image_index_list: imageIndexList,
get_base64: true
}, callBack)
},
//图像纠偏
imageDeskew: function (imageIndex, getBase64, callBack) {
const that = this
this.sendCommand({
func: "image_deskew",
iden: that.wslicence,
image_index: imageIndex,
get_base64: getBase64
}, callBack)
},
//图片添加水印
imageAddWatermark: function (imageIndex, markInfo, getBase64,
callBack) {
const that = this
let params = {
func: "image_add_watermark",
iden: that.wslicence,
image_index: imageIndex,
text: markInfo.text,
text_color: markInfo.text_color,
text_opacity: markInfo.text_opacity,
text_pos: markInfo.text_pos,
margin_left: parseInt(markInfo.margin_left),
margin_top: parseInt(markInfo.margin_top),
margin_right: parseInt(markInfo.margin_right),
margin_bottom: parseInt(markInfo.margin_bottom),
location_x: parseInt(markInfo.location_x),
location_y: parseInt(markInfo.location_y),
font_name: markInfo.font_name,
font_size: parseInt(markInfo.font_size),
font_bold: markInfo.font_bold,
font_underline: markInfo.font_underline,
font_italic: markInfo.font_italic,
font_strikeout: markInfo.font_strikeout,
get_base64: getBase64
}
console.log('添加水印params===' + JSON.stringify(params))
this.sendCommand(params, callBack)
},
/*****************************************socket相关********************************************************************************/
callBackList: {}
,
addCallBack: function (key, listener) {
this.callBackList[key] = listener;
},
removeCallBack: function (key) {
delete this.callBackList[key];
},
getCallBack: function (key) {
return this.callBackList[key];
},
sendCommand: function (json, callBackListener) {
if (json.func && callBackListener) {
this.addCallBack(json.func, callBackListener)
}
this.SocketClient.send(JSON.stringify(json))
},
//初始化socketIO
initSocketIo: function (socketCallBack) {
this.socketCallBacks = socketCallBack
console.log(TAG, "initSocketIo ===============" + 'ws:' + this.wsUrl);
this.SocketClient = new WebSocket(this.wsUrl);
this.SocketClient.onopen = function (msg) {
console.log(TAG, "connect onopen")
socketCallBack(new Result(SOCKET_CONNECTED, "", null))
};
this.SocketClient.onmessage = function (event) {
console.log(TAG, "connect onmessage data:" + event.data)
if (event && event.data) {
socketCallBack(new Result(SOCKET_EVENT, "", event.data))
}
};
this.SocketClient.onclose = function (msg) {
console.log(TAG, "connect onclose:" + JSON.stringify(msg))
socketCallBack(new Result(SOCKET_DISCONNECTED, "", msg))
};
},
disconnect: function () {
if (this.SocketClient) {
this.SocketClient.close()
this.SocketClient = null
}
}
};
window.WebScanController = WebScanController;
})(window);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,121 @@
(function (window, debug, undefined) {
var loadding;
var ajaxDefault = {
beforeSend: function (xhr) {
loadding=window.eleLoadding();
},
complete: function (xhr) {
if(debug){
console.log(xhr);
}
},
data: {},
success: function (data, textStatus, jqXHR) {
if(debug){
console.log(data);
}
if (data == undefined) {
eleAlert('返回结果异常','warning');
}else if(data.code==200){
msg = '调用成功,放回状态码为:' + data.code;
if(msg.code!=200){
msg+=';返回信息为:'+data.message;
}
// layer.alert(msg)
}
},
error: function (xhr, error, exception) {
if(debug){
console.log(xhr);
console.log(error);
console.log(exception);
}
eleAlert('调用错误',"error");
}
};
function fnBeforeSend(xhr, callback) {
(callback || ajaxDefault.beforeSend)(xhr);
}
function fnAjaxSuccess(data, textStatus, jqXHR, callback) {
/* if(data!=undefined&&data.code!=undefined){
if(data.code===401){
layer.alert('请登陆',function(){
window.location.href = loginUrl;
});
return;
}else if(data.code===403){
layer.alert(data.message);
return;
}else if(data.code===404){
layer.alert(data.message);
return;
}else if(data.code===500){
layer.alert(data.message);
return;
}
} */
(callback || ajaxDefault.complete)(data, textStatus, jqXHR);
}
function fnComplete(data, textStatus, callback) {
loadding.close();
(callback || ajaxDefault.complete)(data, textStatus);
}
window.utils = {
post: function (obj) {
var paramObj = {};
jQuery.extend(paramObj, obj)
if (window.jQuery == undefined) {
alert('请引入jQuery');
}
var finalData = {};
jQuery.extend(finalData, paramObj.data);
$.ajax({
type: 'POST',
url: paramObj.url,
data: finalData,
beforeSend: function (xhr) {
fnBeforeSend(xhr, paramObj.beforeSend);
},
complete: function (xhr, textStatus) {
fnComplete(xhr, textStatus, paramObj.complete);
},
success: function (data, textStatus, jqXHR) {
fnAjaxSuccess(data, textStatus, jqXHR, paramObj.success);
}
});
},
get: function (obj) {
var paramObj = {};
jQuery.extend(paramObj, obj)
if (window.jQuery == undefined) {
alert('请引入jQuery');
}
var finalData = {};
jQuery.extend(finalData, paramObj.data);
$.ajax({
type: 'GET',
url: paramObj.url,
data: finalData,
beforeSend: function (xhr) {
fnBeforeSend(xhr, paramObj.beforeSend);
},
complete: function (xhr, textStatus) {
fnComplete(xhr, paramObj.complete);
},
dataType: paramObj.dataType || ajaxDefault.dataType,
success: function (data, textStatus, jqXHR) {
fnAjaxSuccess(data, textStatus, jqXHR, paramObj.success);
}
});
}
};
})(window, false);

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -0,0 +1,819 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="Shortcut Icon" href="logo.png" type="image/x-icon"/>
<link rel="stylesheet" href="js/element-ui/index.css"/>
<link rel="stylesheet" href="css/scan.css"/>
</head>
<body>
<el-container id="container">
<el-aside width="195px" class="aside" v-loading.fullscreen.lock="fullscreenLoading"
element-loading-text="拼命加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.7)">
<div class="header">
<i class="el-icon-document"></i>
&nbsp;图像预览
</div>
<div ref="imageArea" class="scroll" style="overflow: auto;height: calc(100% - 60px);">
<ul style="margin:auto;padding:0;margin-top:5px">
<li v-for="(image,index) in urls" :key="image"
style="padding:10px;padding-right:25px">
<div style="display:inline;position: relative;">
<span style="font-size:12px;position: absolute;left:0;width:25px;text-align:right">{{index +
1}}.</span>
<el-image
:class="{'imageListSelect': selectManyImages.indexOf(index)>=0}"
ref="imageList" :src="image.thumbnail" fit="contain"
imageIndex="{{index}}"
lazy
@dblclick="showBigImage(index)"
@click="!$event.ctrlKey && selectImage(image,index)"
@click.ctrl="selectManyImage(image,index)"
style="height:150px;margin-left:35px;width:80%;border:2px solid #dedede"
>
</el-image>
</div>
</li>
</ul>
</div>
<div style="position: fixed;background-color: #eaeaea;bottom: 0px;width:195px;height:25px;
line-height: 25px;padding-left:20px;color:#666">
总张数&nbsp;{{urls.length}}
</div>
</el-aside>
<el-container>
<!-- <el-header>-->
<!-- <div style="height: 100px;width: 100%">-->
<!-- <el-radio-group style="margin: 10px auto" v-model="debugMode">-->
<!-- <el-radio-button :label="true">调试模式</el-radio-button>-->
<!-- <el-radio-button :label="false">开发模式</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </div>-->
<!-- </el-header>-->
<el-header height="auto" v-if="!debugMode">
<div class="menuContainer">
<div style="display: inline-block;float: left;margin: 14px 0px;cursor: pointer">
<div class="iconContainer" @click="openDeviceSetting">
<img src="images/icons/setup.png"/>
</div>
<div class="menus">扫描设定</div>
</div>
<ul v-show="deviceOpened" style="float: left;padding-left: 0px">
<li @click="startScan()">
<div class="iconContainer">
<img src="images/icons/scan.png"/>
</div>
<div class="menu">顺序扫描</div>
</li>
<li @click="stopScan()">
<div class="iconContainer">
<img src="images/icons/stop.png"/>
</div>
<div class="menu">停止扫描</div>
</li>
<li @click="insertScan()">
<div class="iconContainer">
<img src="images/icons/insert-scan.png"/>
</div>
<div class="menu">插入扫描</div>
</li>
<li @click="coverScan()">
<div class="iconContainer">
<img src="images/icons/cover-scan.png"/>
</div>
<div class="menu">覆盖扫描</div>
</li>
<li>
<el-popover
placement="bottom"
width="360"
v-model="showBatchList">
<p style="font-weight: bold;font-size: 21px;color: black">批次选择</p>
<div @click="changeBatch(item)" class="batch-item" v-for="(item,index) in batchIdList" :key="index"
style="text-align: center;margin: 0;height: 45px;width: 100%;font-size: 21px">
<div style="display: inline-block;float: right;width: 120px;height: 100%">
<div class="operaBg" @click.stop="modifyBatchId(item,index)"
style="position:relative;line-height: 45px;float: left;display: inline;width: 60px;height:100%;">
<img style="position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);width: 28px;height: 28px"
src="images/icons/editor.png" title="编辑">
</div>
<div class="operaBg" @click.stop="deleteBatch(item,index)"
style="position:relative;float: left;display: inline;width: 50%;height:45px">
<img style="position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);height: 28px;width: 28px"
src="images/icons/delete.png" title="删除">
</div>
</div>
<span style="line-height: 45px;text-align: center;overflow: hidden;display: inline-block;float: right;height: 100%;width: 240px">{{item}}</span>
</div>
<el-divider></el-divider>
<div @click="createNewBatch" class="batch-item"
style="font-weight: bold;text-align: center; margin: 0;width: 100%;font-size: 21px;height: 45px;line-height: 45px">
新建批次
</div>
<div slot="reference">
<div class="iconContainer">
<img src="images/icons/betch.png"/>
</div>
<div class="menu">选择批次</div>
</div>
</el-popover>
</li>
<li @click="deleteSelectedImage()">
<div class="iconContainer">
<img src="images/icons/delImage.png"/>
</div>
<div class="menu">删除图片</div>
</li>
<li @click="exchangeImage()">
<div class="iconContainer">
<img src="images/icons/exchange.png" style="height:31px"/>
</div>
<div class="menu">图片互换</div>
</li>
<li @click="mergeHorizontal(true)">
<div class="iconContainer">
<img src="images/icons/merge-horizontal.png"/>
</div>
<div class="menu">水平合并</div>
</li>
<li @click="mergeHorizontal(false)">
<div class="iconContainer">
<img src="images/icons/merge-vertical.png" style="height:31px"/>
</div>
<div class="menu">垂直合并</div>
</li>
<li @click="bookSort()">
<div class="iconContainer">
<img src="images/icons/book_sort.png" style="height:31px"/>
</div>
<div class="menu">书籍自动排序</div>
</li>
<li @click="showBatchMarkConfigure=true">
<div class="iconContainer">
<img src="images/icons/add-watermark.png" style="height:31px"/>
</div>
<div class="menu">批量添加水印</div>
</li>
<li>
<el-popover
placement="bottom"
width="160"
v-model="showExportType">
<p style="font-weight: bold;font-size: 21px;color: black">导出类型选择</p>
<div style="text-align: center;margin: 0;height: 60px;width: 100%;font-size: 21px">
<div class="batch-item" @click="exportFile('pdf')"
style="position:relative;line-height: 45px;float: left;display: inline;width: 50%;height:100%;">
<img style="position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);width: 40px;height: 40px"
src="images/icons/pdf.png" title="pdf">
</div>
<div class="batch-item" @click="exportFile('ofd')"
style="position:relative;float: left;display: inline;width: 50%;height:100%">
<img style="height: 40px;width:40px;position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);"
src="images/icons/ofd.png" title="ofd">
</div>
<div class="batch-item" @click="exportFile('tif')"
style="position:relative;float: left;display: inline;width: 50%;height:100%">
<img style="position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);height: 40px;width: 40px"
src="images/icons/tiff.png" title="tiff">
</div>
<div class="batch-item" @click="exportFile('zip')"
style="position:relative;float: left;display: inline;width: 50%;height:100%">
<img style="position: absolute; left: 50%; top: 50%;transform: translate(-50%, -50%);height: 40px;width: 40px"
src="images/icons/zip.png" title="zip">
</div>
</div>
<div slot="reference">
<div class="iconContainer">
<img src="images/icons/export-file.png"/>
</div>
<div class="menu">文件导出</div>
</div>
</el-popover>
</li>
<li @click="clearBatch()">
<div class="iconContainer">
<img src="images/icons/delAll.png"/>
</div>
<div class="menu">清空列表</div>
</li>
<li @click="clearGlobalFileSavePath()">
<div class="iconContainer">
<img src="images/icons/delete-all.png"/>
</div>
<div class="menu">清理全局文件保存目录</div>
</li>
</ul>
</div>
</el-header>
<el-main>
<div style="width: 100%;height: 100%">
<div v-if="debugMode" style="height: 100%">
<div style="float: left;width: 60%;height: 100%;margin-top: 10px;margin-left: 10px;display: inline-block">
<el-input style="display: inline-block;width: 200px" v-model="serverIP" placeholder="请输入ip"></el-input>
<el-input style="display: inline-block;width: 200px" v-model="serverPort" placeholder="请输入端口号"></el-input>
<el-button :disabled="!connectEnable" type="primary" @click="initWebSocket()">连接</el-button>
<el-button :disabled="connectEnable" type="primary" @click="disconnectSocket()">断开</el-button>
<div style="margin-top: 30px">
<el-input style="display: inline-block;width: 400px" type="textarea"
:autosize="{ minRows: 5, maxRows: 10}" v-model="socketCommand"
:placeholder="jsonCommadnHolder"></el-input>
<el-button style="margin:auto 0px" type="primary" @click="sendSocketCommand()">发送socket命令</el-button>
</div>
<div style="margin-top: 30px">
<span style="margin-right: 30px">接收到的socket信息以及异常:</span>
<el-button type="primary" @click="clearLog()">清空日志</el-button>
</div>
<div ref="logArea"
style="margin-top: 20px;height:400px;width: 100%;background-color: #e3e3e3;overflow: scroll;white-space: pre-wrap;line-height:1.5">
{{socketMsg}}
</div>
</div>
<div style="float: left;width: 1px;height: 100%;background-color:#e3e3e3;margin-right: 30px;margin-left: 30px;margin-top: 10px"></div>
<div style="float: left;width: 30%;height: 100%;margin-right: 30px;margin-top: 10px;display: inline-block">
<el-input type="textarea"
:autosize="{ minRows: 6, maxRows: 10}" v-model="originJson" style="display: inline-block;width: 400px;max-height: 400px"
placeholder="请输入数据源"></el-input>
<el-button style="margin-top: 10px" type="primary" @click="formatJson()">格式化json</el-button>
<div style="width:100%;height:60%;margin-top: 20px;background-color: #e3e3e3;overflow: scroll">
<pre id='preId' style="white-space: pre;line-height: 1.5">{{formatedJson}}</pre>
</div>
</div>
</div>
<div v-else style="height: 100%;width: 100%;position: relative">
<div class="opt">
<ul style="margin-left:-40px;line-height:24px">
<li @click="scaleMax($event)">
<img src="images/icons/amplify.png" title="放大"></img>
</li>
<li @click="scaleMin($event)">
<img src="images/icons/narrow.png" title="缩小"></img>
</li>
<li @click="ajustDimensions($event)">
<img src="images/icons/auto.png" title="自适应"></img>
</li>
<li @click="realDimensions($event,true)">
<img src="images/icons/real.png" title="实际大小"></img>
</li>
<li @click="addListenerToDiv($event)">
<img src="images/icons/drag.png" title="拖拽"></img>
</li>
<li @click="rotate(-90,$event)">
<img src="images/icons/left-roate.png" title="左旋90度"></img>
</li>
<li @click="rotate(90,$event)">
<img src="images/icons/right-roate.png" title="右旋90度"></img>
</li>
<li @click="rotate(180,$event)">
<img src="images/icons/roate.png" title="旋转180度"></img>
</li>
<li @click="innerErase($event)">
<img src="images/icons/erase-inner.png" title="内擦除"></img>
</li>
<li @click="outerErase($event)">
<img src="images/icons/erase-outter.png" title="外擦除"></img>
</li>
<li @click="rectification($event)" id="rectification">
<img src="images/icons/rectification.png" title="纠偏"></img>
</li>
<li @click="undo($event)">
<img src="images/icons/undo.png" title="撤销" v-if="undoStack.length>0"></img>
<img src="images/icons/undogray.png" title="撤销"
v-if="undoStack.length<=0"></img>
</li>
<li @click="redo($event)">
<img src="images/icons/redo.png" title="前进" v-if="redoStack.length>0"/>
<img src="images/icons/redogray.png" title="前进"
v-if="redoStack.length<=0"/>
</li>
<li @click="split(true,$event)">
<img src="images/icons/split-horizontal.png" title="垂直拆分">
</li>
<li @click="split(false,$event)">
<img src="images/icons/split-vertical.png" title="水平拆分"/>
</li>
<li @click="showWaterMarkConfigure($event)">
<img src="images/icons/water-mark.png" title="添加水印"/>
</li>
<li @click="save()">
<img src="images/icons/save.png" title="保存"/>
</li>
</ul>
</div>
<div class="image-container scroll" id="canvas-container" ref="canvasContainer"
@contextmenu.prevent>
<div v-show="showWaterMark" ref="water-mark-opt"
style="background-color: white;width: 300px;height: 300px;z-index:20;position: absolute;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);left: 80px;top: 450px;padding: 8px">
<div>
<span>输入文字</span>
<el-input v-model="waterMarkText" style="width: 220px" placeholder="请输入要添加的文字"></el-input>
</div>
<div style="margin-top: 8px"><span>选择字体</span>
<el-select v-model="markFontName" placeholder="请选择">
<el-option
v-for="item in markFontNameList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
<div style="margin-top: 6px"><span>选择字号</span>
<el-select v-model="markFontSize" placeholder="请选择">
<el-option
v-for="item in markFontSizeList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
<div>
<span>字体颜色</span>
<el-color-picker
v-model="markFontColor"
:predefine="markPredefineColors">
</el-color-picker>
</div>
<div style="width: 100%;margin-top: 8px">
<div>
<el-checkbox class="font-style" v-model="markFontBold">
粗体
</el-checkbox>
<el-checkbox class="font-style" v-model="markFontUnderline">下划线</el-checkbox>
</div>
<div>
<el-checkbox class="font-style" v-model="markFontItalic">斜体</el-checkbox>
<el-checkbox class="font-style" v-model="markFontStrikeout">删除线</el-checkbox>
</div>
</div>
<div style="margin: 0 auto;display: inline-block;position: absolute;right: 8px;bottom:8px ">
<el-button @click="showWaterMark=false" type="info">取消</el-button>
<el-button @click="confirmMarkConfigure" type="primary">确定</el-button>
</div>
</div>
<div v-show="showWaterMarkPosition" ref="water-mark-opt"
style="background-color: white;width: 160px;height: 40px;z-index:20;position: absolute;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);left: 80px;bottom: 120px;padding: 8px">
x:{{markPositionTipX}} y:{{markPositionTipY}}
</div>
<div style="position: absolute;z-index:20000;top:30px;right:32px"
v-if="rectificationDialog">
<div style="display: flex;">
<span style="margin-top:8px">拖动旋转</span>
<el-slider @change="sliderRotateChange" style="width:420px;margin-left:20px"
v-model="repSliderValue" :min=-360 :max=360 :step=1
show-input=true input-size="mini"></el-slider>
</div>
</div>
<canvas id="imageCanvas" height="100%" width="100%"></canvas>
</div>
<el-dialog
title="扫描设定"
:visible.sync="isSetup"
width="50%">
<div class="messageBox">
<el-form ref="form" :model="scanParams" label-width="120px"
style="padding-left:10px">
<el-tabs v-model="activeName">
<el-tab-pane style="margin: 18px" label="设备参数" name="1">
<el-form-item label="设备" required>
<el-select @change="onDeviceChanged" v-model="currDevice" placeholder="请选择扫描仪" filterable="true">
<el-option :label="device" :value="device"
v-for="(device, index) in devices" :key="device">
</el-option>
</el-select>
<el-tag class="cursor-pointer" style="margin-left: 30px" v-show="deviceOpened" @click="resetScanParams">参数重置
</el-tag>
</el-form-item>
<div v-if="deviceOpened">
<el-tabs type="border-card">
<el-tab-pane v-for="(groupParam,groupIndex) in scanParamsRange" :key="groupIndex"
:label="groupParam.group_name">
<el-form-item v-for="(singleParam,singleParamIndex) in groupParam.group_param" :key="singleParamIndex"
:label="singleParam.name" label-width="auto">
<el-switch v-if="singleParam.value_type==='bool'"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"></el-switch>
<el-select v-else-if="singleParam.value_type==='string'"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"
placeholder="请选择">
<el-option v-for="(paramRange,index) in singleParam.value_list" :label="paramRange"
:value="paramRange"></el-option>
</el-select>
<el-input-number
v-else-if="singleParam.value_type==='double'&&singleParam.range_type==='min_max'"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"
:min="singleParam.value_min"
:precision="2"
:step="0.01"
placeholder="请输入"
:max="singleParam.value_max"></el-input-number>
<el-input-number
v-else-if="singleParam.value_type==='int'&&singleParam.range_type==='min_max'"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"
:min="singleParam.value_min" :step="1" :precision="0"
placeholder="请输入"
:max="singleParam.value_max"></el-input-number>
<el-select
v-else-if="singleParam.value_type=='int'&&singleParam.range_type==='list'"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"
placeholder="请选择">
<el-option v-for="(paramRange,index) in singleParam.value_list" :label="paramRange"
:value="paramRange"></el-option>
</el-select>
<el-input-number
v-else-if="singleParam.value_type=='int'&&singleParam.range_type==undefined"
v-model="scanParams[groupIndex].group_param[singleParamIndex].value"
:min="1" :step="1" :precision="0"
placeholder="请输入"
:max="9999"></el-input-number>
</el-form-item>
</el-tab-pane>
</el-tabs>
<!--
<el-form-item label="模式">
<el-radio-group v-model="scanParams.color_mode">
<el-radio v-for="(itemInfo,index) in scanParamsRange.color_mode_list" :label="itemInfo">
{{parameterTranslation(itemInfo)}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="单双面">
<el-radio-group v-model="scanParams.page_mode">
<el-radio v-for="(itemInfo,index) in scanParamsRange.page_mode_list" :label="itemInfo">
{{parameterTranslation(itemInfo)}}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="分辨率">
<el-select v-model="scanParams.resolution" placeholder="请选择分辨率">
<el-option v-for="(itemInfo,index) in scanParamsRange.resolution_list" :label="itemInfo"
:value="itemInfo"></el-option>
</el-select>
</el-form-item>
<el-form-item label="扫描幅面">
<el-select v-model="scanParams.paper_size" placeholder="请选择幅面">
<el-option v-for="(itemInfo,index) in scanParamsRange.paper_size_list"
:label="parameterTranslation(itemInfo)" :value="itemInfo"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否纠偏">
<el-switch v-model="scanParams.auto_crop"></el-switch>
</el-form-item>
<el-form-item label="是否裁剪">
<el-switch v-model="scanParams.paper_cut_enabled"></el-switch>
</el-form-item>
<div v-show="scanParams.paper_cut_enabled">
<el-form-item label="起始位置点坐标X">
<el-input v-model="scanParams.paper_cut_left"
placeholder="请输入坐标点X的值"></el-input>
</el-form-item>
<el-form-item label="起始位置点坐标Y">
<el-input v-model="scanParams.paper_cut_top"
placeholder="请输入坐标点Y的值"></el-input>
</el-form-item>
<el-form-item label="终点位置点坐标X">
<el-input v-model="scanParams.paper_cut_right"
placeholder="请输入坐标点X的值"></el-input>
</el-form-item>
<el-form-item label="终点位置点坐标Y">
<el-input v-model="scanParams.paper_cut_bottom"
placeholder="请输入坐标点Y的值"></el-input>
</el-form-item>
</div>
<el-form-item label="亮度">
<el-slider v-model="scanParams.brightness" :min="1"
:max="255"></el-slider>
</el-form-item>
<el-form-item label="对比度">
<el-slider v-model="scanParams.contrast" :min="1"
:max="7"></el-slider>
</el-form-item>
<el-form-item label="伽马值">
<el-input-number v-model="scanParams.gamma" :precision="2" :min="0.01" :step="0.01"
:max="5.00"></el-input-number>
</el-form-item>
-->
</div>
</el-tab-pane>
<el-tab-pane style="margin: 18px" label="全局配置" name="2" :disabled="!deviceOpened">
<el-form-item label="文件保存目录">
<el-input v-model="globalConfig.file_save_path"
placeholder="请输入文件保存目录"></el-input>
</el-form-item>
<el-form-item label="文件绑定目录">
<el-input v-model="bindFolderPath"
placeholder="请输入文件绑定目录"></el-input>
</el-form-item>
<el-form-item label="文件名前缀">
<el-input v-model="globalConfig.file_name_prefix"
placeholder="请输入文件名前缀"></el-input>
</el-form-item>
<el-form-item label="文件命名规则">
<el-select v-model="globalConfig.file_name_mode" placeholder="请选择命名规则">
<el-option label="date_time" value="date_time"></el-option>
<el-option label="random" value="random"></el-option>
</el-select>
</el-form-item>
<el-form-item label="文件保存格式">
<el-select v-model="globalConfig.image_format" placeholder="请选择格式">
<el-option label="jpg" value="jpg"></el-option>
<el-option label="png" value="png"></el-option>
<el-option label="bmp" value="bmp"></el-option>
<el-option label="tif" value="tif"></el-option>
<el-option label="pdf" value="pdf"></el-option>
<el-option label="ofd" value="ofd"></el-option>
<el-option label="ocr-pdf" value="ocr-pdf"></el-option>
<el-option label="ocr-ofd" value="ocr-ofd"></el-option>
</el-select>
</el-form-item>
<el-form-item label="jpg图片质量" v-show='globalConfig.image_format=="jpg"'>
<el-slider v-model="globalConfig.image_jpeg_quality" :min="0"
:max="100"></el-slider>
</el-form-item>
<el-form-item label="tiff压缩方式" v-show='globalConfig.image_format=="tif"'>
<el-select v-model="globalConfig.image_tiff_compression">
<el-option label="none" value="none"></el-option>
<el-option label="lzw" value="lzw"></el-option>
<el-option label="jpeg" value="jpeg"></el-option>
</el-select>
</el-form-item>
<el-form-item label="tiff压缩质量"
v-show='globalConfig.image_format=="tif"&&globalConfig.image_tiff_compression=="jpeg"'>
<el-slider v-model="globalConfig.image_tiff_jpeg_quality" :min="0"
:max="100"></el-slider>
</el-form-item>
<!--
<el-divider content-position="center">HTTP上传配置</el-divider>
<el-form-item label="上传地址">
<el-input v-model="globalConfig.upload_http_host"
placeholder="请输入上传地址"></el-input>
</el-form-item>
<el-form-item label="端口">
<el-input v-model="globalConfig.upload_http_port"
placeholder="请输入端口号"></el-input>
</el-form-item>
<el-form-item label="上传路径">
<el-input v-model="globalConfig.upload_http_path"
placeholder="请输入上传路径"></el-input>
</el-form-item>
<el-divider content-position="center">FTP上传配置</el-divider>
<el-form-item label="上传地址">
<el-input v-model="globalConfig.upload_ftp_host"
placeholder="请输入上传地址"></el-input>
</el-form-item>
<el-form-item label="端口号">
<el-input v-model="globalConfig.upload_ftp_port"
placeholder="请输入端口号"></el-input>
</el-form-item>
<el-form-item label="用户名">
<el-input v-model="globalConfig.upload_ftp_user"
placeholder="请输入用户名"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="globalConfig.upload_ftp_password"
placeholder="请输入密码"></el-input>
</el-form-item>
-->
</el-tab-pane>
</el-tabs>
</el-form>
<el-row style="text-align:center" v-if="deviceOpened">
<el-button type="primary" @click="saveParams()">保存</el-button>
</el-row>
</div>
</el-dialog>
<el-dialog
title="批量添加水印"
:visible.sync="showBatchMarkConfigure"
width="30%">
<div style="margin-top: 8px">
<span>插入值</span>
<el-input style="width: 70%;margin-left: 16px" v-model="waterMarkText" placeholder="请输入文字"></el-input>
</div>
<div style="margin-top: 8px">
<span>插入位置</span>
<el-select style="margin-left: 16px" v-model="markPosition" placeholder="请选择">
<el-option
v-for="(item,index) in waterMarkPositionList"
:key="item"
:label="item"
:value="waterMarkPositionSignList[index]">
</el-option>
</el-select>
</div>
<div v-show="markPosition!='location'">
<div style="margin-top: 8px">
<span>上边距</span>
<el-input style="width: 70%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markMarginTop" placeholder="请输入距离"></el-input>
</div>
<div style="margin-top: 8px">
<span>下边距</span>
<el-input style="width: 70%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markMarginBottom" placeholder="请输入距离"></el-input>
</div>
<div style="margin-top: 8px">
<span>左边距</span>
<el-input style="width: 70%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markMarginLeft" placeholder="请输入距离"></el-input>
</div>
<div style="margin-top: 8px">
<span>右边距</span>
<el-input style="width: 70%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markMarginRight" placeholder="请输入距离"></el-input>
</div>
</div>
<div style="margin-top: 8px" v-show="markPosition=='location'">
<div style="margin-top: 8px">
<span>起始位置X坐标像素</span>
<el-input style="width: 50%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markAbsoluteX" placeholder="请输入X坐标"></el-input>
</div>
<div style="margin-top: 8px">
<span>起始位置Y坐标像素</span>
<el-input style="width: 50%;margin-left: 16px"
oninput="if(isNaN(value)) { value = ''}if(value.indexOf('.')>0){value=value.slice(0,value.indexOf('.'))}"
v-model="markAbsoluteY" placeholder="请输入Y坐标"></el-input>
</div>
</div>
<div style="margin-top: 8px">
<span>插入范围</span>
<el-slider
style="margin-left: 16px"
v-model="markInsertRange"
range
show-stops
:min="1"
:max="urls.length">
</el-slider>
</div>
<div style="margin-top: 8px"><span>选择字体</span>
<el-select style="margin-left: 16px" v-model="markFontName" placeholder="请选择">
<el-option
v-for="item in markFontNameList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
<div style="margin-top: 8px"><span>选择字号</span>
<el-select style="margin-left: 16px" v-model="markFontSize" placeholder="请选择">
<el-option
v-for="item in markFontSizeList"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
<div style="margin-top: 8px">
<span>字体颜色</span>
<el-color-picker
style="margin-left: 16px"
v-model="markFontColor"
:predefine="markPredefineColors">
</el-color-picker>
</div>
<div style="width: 200px;margin-top: 8px;height: 60px">
<span>字体样式</span>
<div style="width: 100%">
<el-checkbox class="font-style" v-model="markFontBold">粗体</el-checkbox>
<el-checkbox class="font-style" v-model="markFontUnderline">下划线</el-checkbox>
</div>
<div style="width: 100%">
<el-checkbox class="font-style" v-model="markFontItalic">斜体</el-checkbox>
<el-checkbox class="font-style" v-model="markFontStrikeout">删除线</el-checkbox>
</div>
</div>
<div style="width: 100%;height: 40px">
<el-button style="float: right" type="primary" @click="addWaterMarkWithBatch">确 定</el-button>
<el-button style="float: right;margin-right: 16px" @click="showBatchMarkConfigure = false">取 消</el-button>
</div>
</el-dialog>
</div>
</div>
</el-main>
</el-container>
<div v-if="showBigImageDialog"
style="position: fixed;left: 0px;right: 0px;top: 0px;bottom: 0px;background-color: #000000">
<el-image @dblclick="showBigImageDialog=false"
ref="bigImage" :src="selectBigImage" fit="scale-down"
lazy
style="position:absolute;height:95%;width: 100%;left: 50%;top: 50%;transform: translate(-50%,-50%)">
</el-image>
</div>
</el-container>
<script src="js/polyfill.min.js"></script>
<script src="js/vue.min.js"></script>
<script src="js/element-ui/index.js"></script>
<script src="js/jquery-1.11.1.min.js"></script>
<script src="js/fabric.js"></script>
<script src="js/ScanEvent.js"></script>
<script src="js/WebScanController.js"></script>
<script src="js/util.js"></script>
<script src="js/FileSaver.js"></script>
<script src="js/colorpicker.js"></script>
<script src="js/scanWeb.js"></script>
</body>
</html>

View File

@ -0,0 +1,8 @@
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=MicrotekScan
Name[zh_CN]=中晶扫描仪WebServer重启
Exec=sh /opt/Microtekwebscan/bin/restart.sh
Icon=/opt/Microtekwebscan/static/microtek.png
Categories=Application;