下面是一個解決方案 , 用到 Morena 6.0 Framework 框架 里的 javaTwain功能 , 貌似搜了一下
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的響水網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
好像要收費的,不過你可以找找是否有破解版的,沒有的話,那就只有走偏門了 看是否能通過反編譯 ,看改源代碼了......
RE:
javatwain may be a powerful solution,you can go to to download the newest package.
JavaTwain version 5.1 is a part of the Morena 6.0 Framework now.
below is an simple example:
/*
* $Id: ExampleShow.java,v 1.5 2002/07/15 13:48:55 mmotovsk Exp $
*
* Copyright (c) 1999-2002 Gnome spol. s r.o. All Rights Reserved.
*
* This software is the confidential and proprietary information of
* Gnome spol. s r.o. You shall not disclose such Confidential
* Information and shall use it only in accordance with the terms
* of the license agreement you entered into with Gnome.
*/
// JavaTwain package version 5.1
/**
ExampleShow demonstrates how to scan an image using defaults
from the Twain source.
*/
import java.awt.*;
import java.awt.event.*;
import SK.gnome.twain.*;
public class ExampleShow extends Frame
{ Image image;
public void paint(Graphics g)
{ if (null!=image)
g.drawImage(image, 0, 0, this);
}
WindowListener windowAdapter=new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
};
public ExampleShow()
{ try
{ addWindowListener(windowAdapter);
setTitle("ExampleShow Frame Application");
// Open TWAIN select source dialog box
// and initialize the source selected by the user.
TwainSource source=TwainManager.selectSource(null);
image=Toolkit.getDefaultToolkit().createImage(source);
// wait for the image to be completed
MediaTracker tracker=new MediaTracker(this);
tracker.addImage(image, 0);
// this is the moment the scanner user interface pops up
System.err.println("Start loading image ...");
try
{ tracker.waitForAll();
}
catch (InterruptedException e)
{ System.err.println("Image loading was interrupted!");
e.printStackTrace();
}
tracker.removeImage(image);
System.err.println("Image loaded ...");
setSize(image.getWidth(this), image.getHeight(this));
setVisible(true);
TwainManager.close();
}
catch (TwainException e)
{ e.printStackTrace();
}
}
public static void main(String[] args)
{ new ExampleShow();
}
}
import?java.util.Scanner;
public?class?Tese1{
{
public?static?void?main?(?String[]?args?)
{
Scanner?in?=?new?Scanner?(System.in);
System.out.println?("請輸入你的姓名");
String?name?=?in.next?();
System.out.println?("姓名:"?+?name);
System.out.println?("請輸入你的年齡");
int?age?=?in.nextInt?();
System.out.println?("年齡:"?+?age);
System.out.println?("請輸入你的性別");
String?xb?=?in.next?();
System.out.println?("性別:"?+?xb);
in.close?();
}
}
下載一個jar包,放在lib目錄下面,然后再把這個jar加入到項目里面就可以了,右鍵add as libary,就可以引用源代碼了
Scanner是jdk1.5新增的一個類,使用該類可創(chuàng)建一個對象,Scanner scan=new Scanner(System.in);意思是聲明一個Scanner類的對象,并實例化,system.in即接收鍵盤輸入。
1。先搞清楚要在哪種類型的程序中調(diào)用掃描儀
如果開發(fā)的程序是java application或者基于 swing的程序,可以算作是單機或者 c/s架構(gòu)的程序,applet和java fx技術(shù)也可以這么算,因為都是直接通過java程序去操控掃描儀設(shè)備。
如果是基于瀏覽器的應(yīng)用,即b/s架構(gòu)的程序,掃描圖像的工作是在客戶端完成的,這種情況下Java程序其實是接收和保存掃描儀讀取的圖像結(jié)果,并不需要直接的控制掃描儀工作,這一點上和c/s架構(gòu)的程序有本質(zhì)的區(qū)別。
2。架構(gòu)與技術(shù)應(yīng)用
2.1 c/s架構(gòu)程序的掃描儀調(diào)用
c/s架構(gòu)需要通過java代碼直接操控掃描儀設(shè)備,java語言本身被設(shè)計為跨o/s平臺,對特定平臺的硬件操控能力有限,因此需要借助外部技術(shù)實現(xiàn)掃描儀控制調(diào)用,可以通過jni(java原生應(yīng)用程序接口) 技術(shù)去實現(xiàn)掃描儀調(diào)用,具體的細節(jié)實現(xiàn)就是jni中定義掃描儀操作方法,如scan()等方法,然后使用javah生成c語言的.h頭文件,然后使用vc等編程語言去實現(xiàn)jni接口方法。
在windows平臺和mac平臺上面,操作掃描儀都可以通過twain協(xié)議
總之c/s架構(gòu)的java程序調(diào)用掃描儀通過jni+twain編程既可完成。
2.2 b/s架構(gòu)程序的掃描儀調(diào)用
b/s架構(gòu)的掃描儀調(diào)用在前面已經(jīng)提到過,java程序?qū)崿F(xiàn)上做的事情是接收掃描結(jié)果圖像數(shù)據(jù) ,例如在struts2的 action中或者jsp/servlet等等程序中接收掃描儀圖像掃描結(jié)果,真實的客戶端掃描儀調(diào)用應(yīng)該借助客戶端技術(shù)去實現(xiàn)。
在Linux中的Mozilla瀏覽器中如何調(diào)用掃描儀掃描圖像呢?這個著實是個難題,需要做Mozilla的插件才可以,但是在windows平臺有ActiveX技術(shù)供程序員使用,因此瀏覽器是在windows平臺中的話借助Activex技術(shù)即可擴展瀏覽器能力。
使用 DatagramSocket(int port) 建立socket(套間字)服務(wù)。
將數(shù)據(jù)打包到DatagramPacket中去
通過socket服務(wù)發(fā)送 (send()方法)
關(guān)閉資源
public static void main(String[] args) {
DatagramSocket ds = null; //建立套間字udpsocket服務(wù)
try {
ds = new DatagramSocket(8999); //實例化套間字,指定自己的port
} catch (SocketException e) {
System.out.println("Cannot open port!");
System.exit(1);
}
byte[] buf= "Hello, I am sender!".getBytes(); //數(shù)據(jù)
InetAddress destination = null ;
try {
destination = InetAddress.getByName("192.168.1.5"); //需要發(fā)送的地址
} catch (UnknownHostException e) {
System.out.println("Cannot open findhost!");
System.exit(1);
}
DatagramPacket dp =
new DatagramPacket(buf, buf.length, destination , 10000);
//打包到DatagramPacket類型中(DatagramSocket的send()方法接受此類,注意10000是接受地址的端口,不同于自己的端口?。?/p>
try {
ds.send(dp); //發(fā)送數(shù)據(jù)
} catch (IOException e) {
}
ds.close();
}
}
接收步驟:
使用 DatagramSocket(int port) 建立socket(套間字)服務(wù)。(我們注意到此服務(wù)即可以接收,又可以發(fā)送),port指定監(jiān)視接受端口。
定義一個數(shù)據(jù)包(DatagramPacket),儲存接收到的數(shù)據(jù),使用其中的方法提取傳送的內(nèi)容
通過DatagramSocket 的receive方法將接受到的數(shù)據(jù)存入上面定義的包中
使用DatagramPacket的方法,提取數(shù)據(jù)。
關(guān)閉資源。
import java.net.*;
public class Rec {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10000); //定義服務(wù),監(jiān)視端口上面的發(fā)送端口,注意不是send本身端口
byte[] buf = new byte[1024];//接受內(nèi)容的大小,注意不要溢出
DatagramPacket dp = new DatagramPacket(buf,0,buf.length);//定義一個接收的包
ds.receive(dp);//將接受內(nèi)容封裝到包中
String data = new String(dp.getData(), 0, dp.getLength());//利用getData()方法取出內(nèi)容
System.out.println(data);//打印內(nèi)容
ds.close();//關(guān)閉資源
}
}