现代浏览器内直接访问扫描仪进行图像扫描的方法

     在很久很久以前,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 回调接收结果,这样整个扫描及取回结果的过程就全部完成了,图像是要上传还是显示都是客户端业务逻辑问题了。

    

   

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
扫描仪插件ActiveX是一种用于构建扫描仪功能的软件组件,通过集成到浏览器中,使得网页可以直接调用扫描仪进行图像扫描。ActiveX是一种微软开发的技术,它是一种面向对象的计算机程序组件模型,用于开发功能丰富、交互性强的网页应用。 扫描仪插件ActiveX在网页中的应用具有很多优势。首先,它提供了用户友好的操作界面,方便用户进行扫描仪的设置和使用。其次,它可以实时显示扫描图像预览,让用户可以即时查看扫描结果,便于确认是否满足需求。此外,ActiveX插件还支持自定义设置,包括调整扫描的分辨率、颜色模式、文件格式等,满足不同用户的个性化需求。 然而,值得注意的是,扫描仪插件ActiveX在使用过程中也存在一些问题。首先,它只能在Internet Explorer浏览器中使用,不能在其他浏览器上实现相同的功能。此外,由于ActiveX插件是一种非常灵活的技术,所以也有一些潜在的安全风险。恶意网站可能通过利用ActiveX漏洞来进行攻击,因此用户在使用时需要保持警惕,及时更新插件版本,确保系统的安全性。 总的来说,扫描仪插件ActiveX是一种方便实用的技术,在网页中实现扫描仪功能具有很大的帮助。然而,用户在使用过程中需要注意安全问题,并根据实际需求选择合适的插件版本,确保系统的稳定性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peihexian

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值