文档章节

如何通过WebSocket实现远程文件扫描

yushulx
 yushulx
发布于 2014/06/25 17:18
字数 568
阅读 580
收藏 12

当我们使用的硬件设备变得更加多元化,各种尺寸,各种系统的手机,平板,电脑会让开发消耗更多的时间和精力。因此把应用部署到服务端才是上策。

参考原文:

How to Remotely Scan Documents from PCs and Mobile Devices with HTML5 WebSocket and Dynamic .NET TWAIN

准备工作

远程获取扫描仪图像数据

初始化Dynamic .NET TWAIN组件:

dynamicDotNetTwain = new Dynamsoft.DotNet.TWAIN.DynamicDotNetTwain(); // create Dynamic .NET TWAIN component
dynamicDotNetTwain.OnPostAllTransfers += new Dynamsoft.DotNet.TWAIN.Delegate.OnPostAllTransfersHandler(this.dynamicDotNetTwain_OnPostAllTransfers); 
dynamicDotNetTwain.MaxImagesInBuffer = 64;
dynamicDotNetTwain.IfAppendImage = true;
dynamicDotNetTwain.IfThrowException = true;
dynamicDotNetTwain.IfShowUI = false;
 

在服务端查询所有可用的扫描仪,并把数据打包成JSON格式发送到Web客户端中:

int iIndex;
dynamicDotNetTwain.OpenSourceManager();
 
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw))
{
    writer.Formatting = Formatting.Indented;
 
    writer.WriteStartObject();
    writer.WritePropertyName("Sources");
    writer.WriteStartArray();
    for (iIndex = 0; iIndex < dynamicDotNetTwain.SourceCount; iIndex++)
    {
        writer.WriteValue(dynamicDotNetTwain.SourceNameItems(Convert.ToInt16(iIndex)));
    }
    writer.WriteEnd();
    writer.WriteEndObject();
}
 
String msg = sw.ToString();
session.Send(msg);
 

使用JavaScript解析JSON数据:

var json = JSON.parse(data);
var jValue;
for (jProperty in json) {
    jValue = json[jProperty];
    switch (jProperty) {
        case "Sources":
            showSources(jValue);
            break;
        case "Draw":
            var w = jValue[0];
            var h = jValue[1];
            imageWidth = parseInt(w);
            imageHeight = parseInt(h);
            break;
    }
    break;
}
 

使用HTML的element和option元素来显示扫描仪列表:

var sources = document.getElementById('sources');
var option;
 
var count = values.length;
if (count == 0) {
    option = document.createElement('option');
    option.text = "N/A";
    sources.appendChild(option);
}
else {
    for (var i = 0; i < 3; i++) {
        option = document.createElement('option');
        option.text = values[i];
        sources.appendChild(option);
    };
}
 

在服务端获取文件图像:

private void appServer_NewMessageReceived(WebSocketSession session, string message)
{   
    int iIndex = Int32.Parse(message);
 
    try
    {
        dynamicDotNetTwain.CloseSource();
        bool success = dynamicDotNetTwain.SelectSourceByIndex(Convert.ToInt16(iIndex));
        dynamicDotNetTwain.OpenSource();
        dynamicDotNetTwain.AcquireImage();
    }
    catch (Dynamsoft.DotNet.TWAIN.TwainException exp)
    {
        String errorstr = "";
        errorstr += "Error " + exp.Code + "\r\n" + "Description: " + exp.Message + "\r\nPosition: " + exp.TargetSite + "\r\nHelp: " + exp.HelpLink + "\r\n";
        MessageBox.Show(errorstr);
    }
    catch (Exception exp)
    {
        String errorstr = "";
        errorstr += "ErrorMessage: " + exp.Message + "\r\n";
        MessageBox.Show(errorstr);
    }
}

图像数据准备好之后,发送到客户端:

private void dynamicDotNetTwain_OnPostAllTransfers()
        {
            if (dynamicDotNetTwain.MaxImagesInBuffer < 1)
            {
                MessageBox.Show("no image");
                return;
            }
 
            Image img = dynamicDotNetTwain.GetImage(0);
 
            ImageData imageData = load_image(img);
 
            /* send width & height in JSON */
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            using (JsonWriter writer = new JsonTextWriter(sw))
            {
                writer.Formatting = Formatting.Indented;
 
                writer.WriteStartObject();
                writer.WritePropertyName("Draw");
                writer.WriteStartArray();
                writer.WriteValue(imageData.Width);
                writer.WriteValue(imageData.Height);
                writer.WriteEnd();
                writer.WriteEndObject();
            }
            String msg = sw.ToString();
 
            IEnumerable<WebSocketSession> sessions = appServer.GetAllSessions();
            foreach (WebSocketSession session in sessions) 
            {
                session.Send(msg);
                session.Send(imageData.Data, 0, imageData.Data.Length);
            }
 
            imageData = null;
        }
 

最后在Chrome中的显示效果:

通过手机访问看到的效果:



本文转载自:http://www.codepool.biz/tech-frontier/html5/scan-documents-with-html5-websocket.html

共有 人打赏支持
yushulx
粉丝 25
博文 95
码字总数 54680
作品 0
杭州
私信 提问
漫谈 polling 和 Websocket

原文出处: whthomas的博客(@whthomas93) Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response。这让服务器很为恼火:我特么才是老大,我居然不能给...

oschina
2014/06/28
4.6K
29
漫扯:从polling到Websocket

Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response。这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息。。。 轮询   老大发火了,小...

i33
2014/08/01
0
0
spring-boot框架下的websocket服务

这几天在做web端实时展示服务端日志文件新增内容的功能。要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端。 关...

lilugoodjob
2018/07/02
0
0
结合Dynamic .NET TWAIN和Jetty,实现基于网页的TWAIN文件扫描

网页TWAIN扫描是通过多种技术结合实现的,看下流程图: 参考原文: Web-based Document Imaging Capture with .Net TWAIN and Jetty 准备工作 阅读: 如何通过jni4net,在Java应用中调用C#接...

yushulx
2014/08/18
0
0
SpringBoot使用WebSocket推送消息到浏览器

WebSocket 简介 WebSocket协议支持(在受控环境中运行不受信任的代码的)客户端与(选择加入该代码的通信的)远程主机之间进行全双工通信。用于此的安全模型是Web浏览器常用的基于原始的安全...

HGMrWang
2018/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL学习笔记之二

数据库的操作总结就是:增删改查(CURD),今天记录一下基础的检索查询工作。 检索MySQL 1.查询表中所有的记录 mysql> select * from apps;+----+------------+-----------------------+------...

凌宇之蓝
30分钟前
0
0
PaddlePaddle-GitHub的正确打开姿势

GitHub是一个面向开源及私有软件项目的托管平台、也是项目版本管理工具,会使用它是程序员入门的必备技能。PaddlePaddle也不例外,所有的源码及项目进展都在GitHub上开源公布。但对于刚入门写...

深度学习之路
30分钟前
1
0
最强NLP模型BERT可视化学习

摘要: 最强NLP模型谷歌BERT狂破11项纪录,全面超越人类,本文通过可视化带你直观了解它。 2018年是自然语言处理(Natural Language Processing, NLP)领域的转折点,一系列深度学习模型在智...

阿里云官方博客
37分钟前
1
0
导出功能

public void downloadD(HttpServletRequest request, HttpServletResponse res,String contractName, String contractPath) throws IOException {// FileAttach fileAttach = fileA......

卖星星的小矮人
41分钟前
1
0
gradle 打包可执行jar包

group 'android.com'version '1.0-SNAPSHOT'apply plugin: 'java'sourceCompatibility = 1.8repositories { mavenCentral()}jar { manifest { attributes ('Main-......

zdglf
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部