網頁TWAIN掃描是經過多種技術結合實現的,看下流程圖:html
參考原文:html5
閱讀:
java
在Eclipse中運行Java Application,選擇UIMain
當這個窗口啓動的時候,Websocket Server已經初始化完成。session
Load:加載本地圖片socket
Send:把圖片推送到網頁客戶端ide
Scan:經過掃描儀掃描文件,把圖像自動發送到網頁客戶端ui
在Chrome中選擇一個掃描儀源this
顯示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; }