久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java調(diào)用掃描儀2

 ctbtcol 2015-01-07

最近碰到的問題,,客戶端調(diào)用本地的掃描儀,將掃描的文件上傳,。

使用到的技術(shù):applet,twain,HttpClient

當(dāng)然也碰到很多問題,,因?yàn)樵谶@周之前我都不知道什么是applet

一.Applet操作本地資源

基于安全方面的原因,applet是不允許操作本地資源的,。但是java提供了相應(yīng)的為jar包簽名的機(jī)制來提升applet的權(quán)限,。相信很多人都碰到過這種對(duì)話框:

讓用戶來決定是否給applet提升權(quán)限,,如果用戶信任這個(gè)資源,,applet將能操作本地資源。

 

1.為applet依賴的jar包簽名

java提供了兩個(gè)工具,;

keytool用于生成存放key的庫

jarsigner用于為jar進(jìn)行簽名

 

首先建立一個(gè)keystore(這是在當(dāng)前路徑上操作):

keytool -genkey -alias zengge -keystore zengge.keystore

keytool -genkey表示建庫

-alias zengge是為要建立的key取一個(gè)別名

-keystore zengge.keystore是建立一個(gè)名字叫zengge.keystore的key庫,,key就存在里面.

如下圖:



 這樣一個(gè)keystore就建立好了,在當(dāng)前目錄下就多出了一個(gè)zengge.keystore的文件


 

有了keystore之后jarsigner就可以利用存放在keystore中的key來為jar簽名



 這里有兩個(gè)類,先打包

 


包里面的META-INFO里面只有一個(gè)文件,,且內(nèi)容為上圖

 

接下來為jar包簽名:

jarsigner -keystore zengge.keystore HelloWorld.jar zengge
zengge.keystore是keystore的路徑/名字,,這里是相對(duì)路徑
HelloWorld.jar是要簽名的jar包
zengge是存放在keystore中的密鑰的別名


密碼為建立keystore時(shí)的密碼

 

再來看一下簽過名的jar里面的情況有什么變化:


可以看到META-INFO里面現(xiàn)在是三個(gè)文件,.DSAG與.SF我想肯定是用來加解密用的,,大家注意現(xiàn)在的MANIFEST.MF,

可以看出為每個(gè)類添加了一個(gè)SHA簽名,,用它來保證,,這個(gè)jar里面的內(nèi)容不會(huì)被其它人修改,用戶可以相信這個(gè)jar,。

 

2.將applet嵌入html

applet是通過瀏覽器來運(yùn)行了,,可能你會(huì)問,java的東西瀏覽器怎么能運(yùn)行呢,,難道客戶端也要安裝java,?

實(shí)際上applet是通過嵌在瀏覽器中的jvm在運(yùn)行,但是這個(gè)jvm是從那里來的呢,?

對(duì)于IE,大家可以看一下,,下圖中的java如果選中,就表示會(huì)調(diào)用本地的jre來運(yùn)行applet,。


但是絕大部分情況下,,客戶端是不會(huì)安裝java的啊,還有firefox下面沒有類似的這種選項(xiàng),。那么要如何來解決這種問題呢,?

早期的applet都是用applet標(biāo)簽來嵌入html的(當(dāng)然現(xiàn)在也可以),例如:

<APPLET CODE = "HelloWorld" archive ="HelloWorld.jar" JAVA_CODEBASE = "." WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld"></APPLET>

這里的CODE表示類名(類名后可以加上.class),archvie表示類所在的jar包,,如果你有多個(gè)jar包,,可以全加在archive里面,用,,號(hào)分開(archive="a,jar,b.jar,c.jar",,當(dāng)然這些jar要簽名的還得簽名)。

如果用這種標(biāo)簽,,在IE下,,如果沒選中用本地jre運(yùn)行applet的話,是運(yùn)行不了的,沒安裝插件的firefox也是不能運(yùn)行的,。

 

面對(duì)這種情況,,升級(jí)版的標(biāo)簽出現(xiàn)了,java提供了一個(gè)工具名字叫HTMLconverter,通過它,能將html中的applet標(biāo)簽轉(zhuǎn)換成標(biāo)準(zhǔn)的標(biāo)簽,,如下

Html代碼  收藏代碼
  1. <object  
  2.     classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"  
  3.     codebase = "http://java./update/1.6.0/jinstall-6u14-windows-i586.cab#Version=6,0,0,8"  
  4.     WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld" >  
  5.     <PARAM NAME = CODE VALUE = "HelloWorld" >  
  6.     <PARAM NAME = CODEBASE VALUE = "." >  
  7.     <PARAM NAME = ARCHIVE VALUE = "applet_test.jar" >  
  8.     <PARAM NAMENAME = NAME VALUE = "HelloWorld" >  
  9.     <param name = "type" value = "application/x-java-applet;version=1.6">  
  10.     <param name = "scriptable" value = "false">  
  11.       
  12.     //上面是針對(duì)IE  
  13.     //下面的embed是針對(duì)firefox  
  14.       
  15.     <comment>  
  16.     <embed  
  17.             type = "application/x-java-applet;version=1.6" \  
  18.             CODE = "HelloWorld" \  
  19.             JAVA_CODEBASE = "." \  
  20.             ARCHIVE = "applet_test.jar" \  
  21.             NAME = "HelloWorld" \  
  22.             WIDTH = "320" \  
  23.             HEIGHT = "240"  
  24.         scriptable = false  
  25.         pluginspage = "http://java./products/plugin/index.html#download">  
  26.         <noembed>   
  27.             </noembed>  
  28.     </embed>  
  29.     </comment>  
  30. </object>  
  31. <!--  
  32. <APPLET CODE = "HelloWorld" JAVA_CODEBASE = "." WIDTH = "320" HEIGHT = "240" NAME = "HelloWorld">  
  33. </APPLET>  
  34. -->  
  35. <!--"END_CONVERTED_APPLET"-->  
 

其中Object部分是針對(duì)IE的,,embed是針對(duì)firefox的.classid與codebase都是表示相應(yīng)的plugin的下載地址,如果codebase的版本高于classid將下載codebase版本的plugin,。這樣不管本地有沒有安裝java,,applet都能正常運(yùn)行了。

 

現(xiàn)在,,在applet里面己經(jīng)能調(diào)用本地的資源了,,那么如何驅(qū)動(dòng)掃描儀呢?

 

二.applet調(diào)用TWain驅(qū)動(dòng)本地掃描儀

TWain是一個(gè)標(biāo)準(zhǔn),用于獲取掃描儀等設(shè)備的信息,,它有很多實(shí)現(xiàn)(基本都是收費(fèi)的),,這里選擇的是一個(gè)開源twain產(chǎn)品,,mmsc twain(官網(wǎng) http://www./例子很豐富)。

只要本地安裝有掃描儀驅(qū)動(dòng),,twain就能找到并運(yùn)行且獲取到掃描的數(shù)據(jù),。

它里面有個(gè)Scanner類,Scanner scanner = Scanner.getDevice()能獲取到相應(yīng)的設(shè)備,。然后為scanner添加一個(gè)監(jiān)聽器,,ScannerListener,它里面有個(gè)方法public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){},第二個(gè)參數(shù)即為掃描得到的數(shù)據(jù),,而且這個(gè)方法是在掃描述的狀態(tài)發(fā)生變變就會(huì)解發(fā),。具體可以看一些mmsc里面的例子。

 

三.applet與服務(wù)器通信

得到了掃描的數(shù)據(jù),,得把它上傳到服務(wù)器,。我這里用的是HttpClient(需要的jar包c(diǎn)ommons-codec-1.4.jar,commons-httpclient-3.0.jar,commons-io-1.4.jar,commons-logging-1.0.2.jar)。在使用時(shí)最好對(duì)這幾個(gè)jar包都簽名(我沒有測(cè)試這種方式,,我是將這幾個(gè)jar全給解壓了,,最后連同我的類一起打成了一個(gè)jar,最后簽名),上傳代碼位于update方法內(nèi)即可,。

因?yàn)閽呙鑳x有多種狀態(tài),,所以要進(jìn)行判斷,那次才是拿到了掃描數(shù)據(jù),。

Java代碼  收藏代碼
  1. public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){  
  2.   
  3.     if(type.equals(ScannerIOMetadata.ACQUIRED)){  
  4.       BufferedImage image=metadata.getImage();  
  5.       System.out.println("Have an image now!");  
  6.       HttpClient httpClient = new HttpClient();  
  7.       MultipartPostMethod mpm = new MultipartPostMethod("http://localhost:8086/ReiyenDMS/TestUploadServlet");  
  8. //      MultipartPostMethod mpm = new MultipartPostMethod("http://localhost:8086/applet_study/servlet/AppletServlet");  
  9.       File file = new File("c:/upload/abc"+index+".jpg");  
  10.       try{  
  11.         ImageIO.write(image, "jpg", file);  
  12.         index++;  
  13.        mpm.addParameter("aFile""haha.pdf", file);  
  14.         httpClient.executeMethod(mpm);  
  15.   
  16.       }catch(Exception e){  
  17.         e.printStackTrace();  
  18.       }  
  19.     }else if(type.equals(ScannerIOMetadata.NEGOTIATE)){  
  20.       ScannerDevice device=metadata.getDevice();  
  21. /* 
  22.       try{ 
  23.         device.setResolution(100); 
  24. //        device.setRegionOfInterest(0.0,0.0,40.0,50.0);       // top-left corner 40x50 mm 
  25.         device.setRegionOfInterest(0,0,400,500);               // top-left corner 400x500 pixels 
  26.         device.setShowUserInterface(false); 
  27.         device.setShowProgressBar(false); 
  28.       }catch(Exception e){ 
  29.         e.printStackTrace(); 
  30.       } 
  31. */  
  32.     }else if(type.equals(ScannerIOMetadata.STATECHANGE)){  
  33.       System.err.println(metadata.getStateStr());  
  34.     }else if(type.equals(ScannerIOMetadata.EXCEPTION)){  
  35.       metadata.getException().printStackTrace();  
  36.     }  
  37.   }  
 

 

完工

中間碰到最多的問題就是,,applet簽名及applet布署,開始老以為applet根平時(shí)的類布署是一樣的,,后來發(fā)現(xiàn)就應(yīng)該把它當(dāng)成一個(gè)獨(dú)立的應(yīng)用來對(duì)等,。

 

中間可能有錯(cuò),有問題請(qǐng)?jiān)诩抑赋?,謝謝

 

效果圖(點(diǎn)擊中間的acquire就能掃描了):

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多