如何通过WebSocket实现远程文件扫描
博客专区 > yushulx 的博客 > 博客详情
如何通过WebSocket实现远程文件扫描
yushulx 发表于3年前
如何通过WebSocket实现远程文件扫描
  • 发表于 3年前
  • 阅读 557
  • 收藏 12
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 通过WebSocket的数据通信,可以把很多应用轻松部署到服务器端。这篇文章介绍如何在服务端链接扫描仪,并把图像数据传输到Web浏览器中。

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

参考原文:

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中的显示效果:

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



共有 人打赏支持
粉丝 24
博文 82
码字总数 34008
×
yushulx
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: