结合Dynamic .NET TWAIN和Jetty,实现基于网页的TWAIN文件扫描

网页TWAIN扫描是通过多种技术结合实现的,看下流程图:

准备工作

阅读:

如何运行

  1. 在Eclipse中运行Java Application,选择UIMain       
    当这个窗口启动的时候,Websocket Server已经初始化完成。
    • Load:加载本地图片
    • Send:把图片推送到网页客户端
    • Scan:通过扫描仪扫描文件,把图像自动发送到网页客户端
  2. 在Chrome中选择一个扫描仪源
  3. 显示TWAIN扫描文件图像

TWAIN网页扫描流程解析

首先把所有相关的库(DLL & Jar)导入到Eclipse工程中:

结合准备工作中两篇文章的代码,创建一个类SourceManager

package com.data;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
 
import javatwain.DotNetScanner;
import javatwain.IJavaProxy;
import javatwain.INativeProxy;
 
import javax.swing.Timer;
 
import com.server.WSHandler;
import com.util.ImageUtil;
 
import net.sf.jni4net.Bridge;
 
public class SourceManager implements INativeProxy {
    private IJavaProxy mScanner;
    private String[] mSources;
    private ScanAction mScanAction;
 
    public SourceManager() {
        initTWAIN();
        mScanAction = new ScanAction();
    }
 
    private void initTWAIN() {
        try {
            Bridge.init();
            Bridge.LoadAndRegisterAssemblyFrom(new java.io.File("libs\\jni\\JavaTwain.j4n.dll"));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
 
        mScanner = new DotNetScanner();
        mScanner.RegisterListener(this);
        mSources = mScanner.GetSources();
    }
 
    public String[] getSources() {
        return mSources;
    }
 
    public synchronized void acquireImage(int index) {
        mScanAction.setIndex(index);
        mScanAction.start();
    }
 
    @Override
    public boolean Notify(String message, String value) {
        ArrayList<WSHandler> sessions = WSHandler.getAllSessions();
        for (WSHandler session : sessions) {
            session.sendImage(ImageUtil.getImageBytes(new File(value)));
        }
 
        return true;
    }
 
    public class ScanAction {
        private int mIndex;
        private int mDelay = 1;
        private Timer mTimer;
 
        public ScanAction() {
            mTimer = new Timer(mDelay, mTaskPerformer);
            mTimer.setRepeats(false);
        }
 
        private ActionListener mTaskPerformer = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                mScanner.AcquireImage(mIndex);
                ActionListener taskPerformer = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent evt) {
                        mScanner.CloseSource();
                    }
                };
                int delay = 1; 
                Timer timer = new Timer(delay, taskPerformer);
                timer.setRepeats(false);
                timer.start();
            }
        };
 
        public void setIndex(int index) {
            mIndex = index;
        }
 
        public void start() {
            mTimer.start();
        }
    }
}

Java Websocket server和JavaScript client之间通过JSON通讯。

使用Java创建发送JSON数据:

JsonObject jsonObj = new JsonObject();
JsonArray jsonArray = new JsonArray();
 
String[] sources = mSourceManager.getSources();
if (sources != null) {
    for (String source : sources) {
        jsonArray.add(new JsonPrimitive(source));
    }
}
 
jsonObj.add(Msg.MSG_SOURCES, jsonArray);
 
String s = jsonObj.toString();
 
try {
    session.getRemote().sendString(s);
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

使用Java分析解析JSON数据:

public void onMessage(String message) {
        JsonParser parser = new JsonParser();
        boolean isJSON = true;
        JsonElement element = null;
        try {
            element =  parser.parse(message);
        }
        catch (JsonParseException e) {
            System.out.println("exception: " + e);
            isJSON = false;
        }
 
        if (isJSON && element != null) {
            JsonObject obj = element.getAsJsonObject();
            element = obj.get(Msg.MSG_MESSAGE);
            if (element != null) {
                switch (element.getAsString()) {
                case Msg.MSG_SOURCE:
                    int index = obj.get(Msg.MSG_INDEX).getAsInt();
                    mSourceManager.acquireImage(index);
                    break;
                }
            }
        }
 
        System.out.println("Message: " + message);
    }

使用JavaScript创建发送JSON数据:

var json = {};
json.Message = MSG_SOURCE;
json.Index = i;
var msg = JSON.stringify(json);
ws.send(msg);

使用JavaScript分析解析JSON数据:

ws.onmessage = function (evt) { 
    var data = evt.data;
        var json = JSON.parse(data);
        var value = json[MSG_SOURCES];
        showSources(value);
    }

创建一个类ScanAction,在其中创建一个运行在UI线程中的Timer,用于处理扫描事件:

public class ScanAction {
        private int mIndex;
        private int mDelay = 1;
        private Timer mTimer;
 
        public ScanAction() {
            mTimer = new Timer(mDelay, mTaskPerformer);
            mTimer.setRepeats(false);
        }
 
        private ActionListener mTaskPerformer = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                mScanner.AcquireImage(mIndex);
                ActionListener taskPerformer = new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent evt) {
                        mScanner.CloseSource();
                    }
                };
                int delay = 1; 
                Timer timer = new Timer(delay, taskPerformer);
                timer.setRepeats(false);
                timer.start();
            }
        };
 
        public void setIndex(int index) {
            mIndex = index;
        }
 
        public void start() {
            mTimer.start();
        }
    }

数据扫描完成之后,就可以发送到Web页面中了:

public boolean Notify(String message, String value) {
        ArrayList<WSHandler> sessions = WSHandler.getAllSessions();
        for (WSHandler session : sessions) {
            session.sendImage(ImageUtil.getImageBytes(new File(value)));
        }
 
        return true;
    }

结合Dynamic .NET TWAIN和Jetty,实现基于网页的TWAIN文件扫描

时间: 2024-07-31 21:45:27

结合Dynamic .NET TWAIN和Jetty,实现基于网页的TWAIN文件扫描的相关文章

Struts2文件上传(基于表单的文件上传)

•Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目 •Commons-FileUpload组件特点 –使用简单:可以方便地嵌入到JSP文件中,编写少量代码即可完成文件的上传功能 –能够全程控制上传内容 –能够对上传文件的大小.类型进行控制 •需要下载Common-FileUplaod框架地址(当然MyEclipce中Struts2支持里自带有这两个包): –http://jak

Servlet3.0学习总结——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 <%@ page language="java&

用c++开发基于tcp协议的文件上传功能

用c++开发基于tcp协议的文件上传功能 2005我正在一家游戏公司做程序员,当时一直在看<Windows网络编程> 这本书,把里面提到的每种IO模型都试了一次,强烈推荐学习网络编程的同学阅读,比 APUE 讲的更深入 这是某个银行广告项目(p2p传输视频)的一部分 IO模型采用的阻塞模式,文件一打开就直接上传 用vc 2003编译,生成win32 dll 麻雀虽小五脏俱全,CSimpleSocket,CReadStream dll 输出一虚类 extern "C" __d

基于网页版的2048游戏

前段时间有个很火的游戏叫2048,刚好趁着暑假想练习前端,顺带就把它作为练习项目做成Web Applications 该游戏基于HTML5+JS+CSS 文件结构: index.html 游戏界面展示 index.css 主界面的CSS样式,16方格采用绝对布局的方式 main.js 游戏的主要逻辑 show.js 游戏的一些动画效果 support.js 底层支撑 jquery.js 页面做了响应式布局,游戏效果如下: 代码如下: index.hml <!DOCTYPE html PUBLIC

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传

Servlet3.0学习总结(三)——基于Servlet3.0的文件上传 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了. 一.使用Servlet3.0提供的API实现文件上传 1.1.编写上传页面 1 <%@ page language="jav

基于asp.net 的文件上传和下载~~~转

基于asp.net 的文件上传和下载 摘要: 文件的上传和下载是网络中非常重要的两种应用, 本文介绍了使用asp.net 控件实现文件上传的基本方法.解决了当上传大文件时出现各种问题, 并给出了几种解决方案和技巧.另外, 下载文件用二进制读写的方式实现. 1 引言          文件的上传和下载是网络中非常重要的两种应用.其实现方法主要有FTP 方式和HTTP 方式两种, FTP( File Transfer Protocol)是指文件传输协议, 主要用来在网络上传输文件.这种方式虽说文件传

服务器基于PHP CodeIgniter,Android基于Volley实现多文件/图片上传(含服务器,web版和android客户端完整代码)

问题背景:app在上传图片时,同时传递参数,支持传递多个图片.本文中的环境默认已经配好了服务器的CodeIgniter框架.事实上不使用这个框架也是可以的. 一,服务器部分 1,在controllers下的helpers新建文件upload_helper.php <?php /** * Make multifile array input complaint with CI_Upload.<br> * For use files[ ] input name you must use it

django 基于form表单上传文件和基于ajax上传文件

一.基于form表单上传文件 1.html里是有一个input type="file" 和 'submit'的标签 2.vies.py def fileupload(request): if request.method == 'POST': print(request.POST) print(request.FILES) # from django.core.files.uploadedfile import InMemoryUploadedFile print(type(reque

基于Tcp通讯的文件传输小例子 (wpf)

源码下载 示例基于wpf技术 是networkcomms2.3.1自带的示例 通讯框架 英国的networkcomms2.3.1C#通信框架 using System; using System.Collections.Generic; using System.Linq; using System.Text; using NetworkCommsDotNet; using System.ComponentModel; using System.IO; namespace ExamplesWPF