当我们使用的硬件设备变得更加多元化,各种尺寸,各种系统的手机,平板,电脑会让开发消耗更多的时间和精力。因此把应用部署到服务端才是上策。
参考原文:
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中的显示效果:
通过手机访问看到的效果: