結合Dynamic .NET TWAIN和Jetty,實現基於網頁的TWAIN文件掃描

網頁TWAIN掃描是經過多種技術結合實現的,看下流程圖:html

參考原文:html5

Web-based Document Imaging Capture with .Net TWAIN and Jetty


準備工做

閱讀:
java

如何運行

  1. 在Eclipse中運行Java Application,選擇UIMain       
    當這個窗口啓動的時候,Websocket Server已經初始化完成。session

      • Load:加載本地圖片socket

      • Send:把圖片推送到網頁客戶端ide

      • Scan:經過掃描儀掃描文件,把圖像自動發送到網頁客戶端ui

    • 在Chrome中選擇一個掃描儀源
      this

    • 顯示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;
        }
     
    相關文章
    相關標籤/搜索