在很久很久以前,IE浏览器支持activex技术,chrome和firefox等支持npapi技术,通过这些技术都可以开发原生c/c++程序访问客户端硬件外设,如驱动扫描仪进行图像扫描,但是随着windows操作系统新版不再支持IE浏览器,chrome等也都在49版本中移除了对npapi技术的支持,曾经风光一时的flash技术就是基于以上技术实现的。
要想实现在现代浏览器,如chrome 49以后的版本,EDGE、firefox等浏览器可以访问连接客户端电脑的扫描仪,需要通过websocket通讯方式与本地websocket服务器端程序进行通讯,然后在websocket服务器端程序内完成扫描仪驱动及扫描和图像处理应用。
本次介绍的scanonweb h5程序就是专门解决这类应用的程序,之前scanonweb有activex版本,用于嵌入在IE浏览器或者360浏览器等以IE为内核的浏览器内部工作,随着现代前端技术的发展,如新版的vue等前端开发框架早就移除了对IE的支持,现在的网页图像扫描技术方案不得不摒弃activex的技术方案了,否则没办法使用最新的前端开发技术。scanonweb h5版本提供了一个托盘服务程序,支持开机自启动,启动后内置websocket server启动,网页通过websocket连接后可读取连接到电脑的扫描仪硬件都有哪些,叫什么名称,支持什么特性,如双面扫描模式,支持ADF自动进纸器等,可以直接在网页里面通过js代码驱动扫描仪工作,先设置好图像扫描参数,如是使用黑白模式,还是灰度模式,或者彩色模式,扫描图像的分辨率是多少,如300X300,设备扫描后图像结果自动回传网页前端,可直接在网页里面预览查看,也可以直接通过ajax发送到服务器端进行永久保存。
以下一步步说明整个集成使用过程:
1.扫描托盘服务程序下载安装
https://www.brainysoft.cn/download/ScanOnWebH5Install.exe
下载后直接安装就行了,没有什么特殊注意事项,如果有安全软件阻止开机自启动建议允许开机自启动,后续可以随时卸载。
2. 网页开发集成使用
网页里面需要引入一个scanonweb.js文件,可以通过下载示例程序获得,地址:
https://www.brainysoft.cn/download/clientjs.zip
下载后复制scanonweb.js文件到项目内,可以参考test1.html文件里面的示例:
<script src="./scanonweb.js" type="text/javascript"></script>
接下来实例化Scanonweb对象,让其自动连接websocket托盘服务程序:
<script type="text/javascript">
var scanonweb = new ScanOnWeb();
实例对象成功连接websocket后会自动发指令询问当前客户端电脑连接了哪些扫描仪硬件,需要提供一个回调函数接收托盘服务程序返回的设备列表信息:
<script type="text/javascript">
var scanonweb = new ScanOnWeb();
//响应返回扫描设备列表的回调函数
scanonweb.onGetDevicesListEvent = function (msg) {
var deviceListDom = document.getElementById('devices');
//clear devices list
deviceListDom.innerHTML = "";
for (var i = 0; i < deviceListDom.childNodes.length; i++) {
ardeviceListDomea.removeChild(deviceListDom.options[0]);
deviceListDom.remove(0);
deviceListDom.options[0] = null;
//add devices info
for (var i = 0; i < msg.devices.length; ++i) {
var opt = document.createElement("option");
opt.innerHTML = msg.devices[i];
if (i == msg.currentIndex) {
opt.selected = true;
deviceListDom.appendChild(opt);
这样就在界面中列出了连接到客户端机器的扫描仪设备信息。
当需要让设备扫描时,先确定要按照哪种色彩模式去扫描,还有设置分辨率等,之后通过startScan()就可以驱动扫描仪进行图像扫描了:
//开始扫描命令
function startScan() {
if (document.getElementById("devices").selectedIndex == -1) {
alert('请先刷新或者选中要使用的扫描设备后再开始扫描!');
return;
//以下获取界面中的扫描参数设定
scanonweb.scaner_work_config.dpi_x = document.getElementById("dpi_x").value;
scanonweb.scaner_work_config.dpi_y = document.getElementById("dpi_y").value;
scanonweb.scaner_work_config.deviceIndex = document.getElementById("devices").selectedIndex;
scanonweb.scaner_work_config.showDialog = document.getElementById("showDialog").value;
scanonweb.scaner_work_config.autoFeedEnable = document.getElementById("feedEnable").value;
scanonweb.scaner_work_config.autoFeed = document.getElementById("autoFeed").value;
scanonweb.scaner_work_config.dupxMode = document.getElementById("dupxMode").value;
scanonweb.scaner_work_config.autoDeskew = document.getElementById("autoDeskew").value;
scanonweb.scaner_work_config.autoBorderDetection = document.getElementById("autoBorderDetection").value;
//开始发送扫描指令
scanonweb.startScan();
设备扫描图像后还是通过回调函数发送图像给前端网页,告诉前端js,本次扫描扫描之前托盘服务程序内存里面有多少页图像,扫描完成以后有多少页图像,如果使用了自动进纸器,可能一次性会扫描十几或几十页图像:
//响应获取某一页图像的回调函数
scanonweb.onGetImageByIdEvent = function (msg) {
var imageListDom = document.getElementById('imageList');
var imageDom = document.createElement("img");
imageDom.width = 300;
imageDom.height = 300;
imageDom.src = "data:image/jpg;base64," + msg.imageBase64;
imageListDom.appendChild(imageDom);
//响应扫描完成事件
scanonweb.onScanFinishedEvent = function (msg) {
console.log("扫描前:" + msg.imageBeforeCount + " 扫描后:" + msg.imageAfterCount);
//以下代码用于将新增的扫描图像从扫描服务程序中取回
for (var i = msg.imageBeforeCount; i < msg.imageAfterCount; i++) {
scanonweb.getImageById(i);
上面的代码在onScanFinishedEvent回调里面知道了新扫描了多少页图像,然后通过getImageById取回新增图像的base64编码数据,通过onGetImageByIdEvent 回调接收结果,这样整个扫描及取回结果的过程就全部完成了,图像是要上传还是显示都是客户端业务逻辑问题了。
java string存在哪里 java string在哪个包下
1.什么是String类? String类表示字符串,是由多个字符组成的一串数据(字符序列),java中所有的字符串都是String类的实例如:String s = "abc";
//其底层为一个char数组 char[] c = {'a','b','c'}在java程序中所有的字符串常量,如"abc",都被实现为String类的实例String类型的数据其值一旦创建