這兩天,在搞歸檔系統。需要用到Twain協議來驅動掃描儀。
找了兩天,java的twain操作資料真的不多。而且我還是要找直接打印的功能。
后來只能靜下心來看類庫和源碼。最后搞定他。
打印方式分為3種,
1 直接打印:就是程序跑起來,掃描儀一起跑
2 界面打印:程序跑起來,只是調用打印的默認界面,打印操作在界面完成。
3 ADF打印:自動進紙
廢話不多說了。上攻略:
一 ,首先下載 Twain相關架包
1 直接下載:(我用的方案1。)
https://imagej.nih.gov/ij/plugins/twain-scan.html
2 github:
https://github.com/alex73/mmscomputing/tree/master/src/uk/co/mmscomputing/device
主要是 Twain和Scanner
二 ,准備
架包,該導入的導入。github下載的話,可以直接放java類。
掃描機,該裝驅動的裝驅動。確保自己打印機能正常工作。
需要打印的材料放好。
我用的是EPSON GT-1500。
最后,一定要使用 jdk 32位。(不然會報錯,因為廠商基本實現了32位驅動,但是64位版本較少。)
環境變量一定要配對!!!(我就是粗心了,測試機器CLASSPATH沒有配,導致掃描一直卡住)
CLASSPATH .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar; JAVA_HOME D:\Java\jdk1.80_32bit\jdk1.8.0_131 Path %JAVA_HOME% %JAVA_HOME%/jre/bin
三 ,上代碼
1 直接打印:
package com.kintech.scanAF.controllerScan; import uk.co.mmscomputing.device.scanner.Scanner; import uk.co.mmscomputing.device.scanner.ScannerIOException; import uk.co.mmscomputing.device.scanner.ScannerIOMetadata; import uk.co.mmscomputing.device.scanner.ScannerListener; import uk.co.mmscomputing.device.twain.TwainScanner; import uk.co.mmscomputing.device.twain.jtwain; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; /** * @author Tyler * @date 2019/8/16 */ public class testTwain_Source implements ScannerListener { static int index=0; static String filename=System.getProperty("user.home")+"\\My Documents\\test"; Scanner scanner = Scanner.getDevice(); public testTwain_Source(String[] var1) throws ScannerIOException { TwainScanner twainScanner = new TwainScanner(); twainScanner.addListener(this); jtwain.setScanner(twainScanner); jtwain.getSource().setShowUI(false);
//選擇驅動,注釋代表默認上次選擇
//jtwain.select();
//防止多個驅動,默認查找EPSON驅動
//jtwain.select("EPSON DS-410"); jtwain.acquire(twainScanner);
//這樣也可以
//scanner.addListener(this);
//jtwain.getSource().setShowUI(false);
//scanner.acquire();
} public void update(ScannerIOMetadata.Type var1, ScannerIOMetadata var2) { if (var1.equals(ScannerIOMetadata.ACQUIRED)) { System.out.println("ACQUIRED"); BufferedImage var3 = var2.getImage(); try { ImageIO.write(var3, "png", new File(filename+index+".png")); } catch (Exception var5) { var5.printStackTrace(); } } else if (var1.equals(ScannerIOMetadata.NEGOTIATE)) { System.out.println("NEGOTIATE"); // ScannerDevice var6 = var2.getDevice(); BufferedImage var3 = var2.getImage(); try { ImageIO.write(var3, "png", new File(filename+index+".png")); } catch (Exception var5) { var5.printStackTrace(); } } else if (var1.equals(ScannerIOMetadata.STATECHANGE)) { System.out.println("STATECHANGE"); System.err.println(var2.getStateStr()); if (var2.isFinished()) { System.exit(0); } } else if (var1.equals(ScannerIOMetadata.EXCEPTION)) { System.out.println("EXCEPTION"); var2.getException().printStackTrace(); } } public static void main(String[] var0) throws ScannerIOException { new testTwain_Source(var0); } }
主要是 setShowUI(false) 隱藏界面。
連上打印機,直接打運行就是了。其他不用管。
2 界面打印
這個就簡單了。(下載的jar里面有)
可以直接寫一個class,main中 new TwainExample就可以了。
源碼如下:
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package uk.co.mmscomputing.device.twain; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import uk.co.mmscomputing.device.scanner.Scanner; import uk.co.mmscomputing.device.scanner.ScannerDevice; import uk.co.mmscomputing.device.scanner.ScannerIOException; import uk.co.mmscomputing.device.scanner.ScannerIOMetadata; import uk.co.mmscomputing.device.scanner.ScannerListener; import uk.co.mmscomputing.device.scanner.ScannerIOMetadata.Type; public class TwainExample implements ScannerListener { static TwainExample app; Scanner scanner = Scanner.getDevice(); public TwainExample(String[] var1) throws ScannerIOException { this.scanner.addListener(this);
//選擇驅動
//this.scanner.select();
//防止多個驅動,默認查找EPSON驅動
//this.scanner.select("EPSON DS-410"); this.scanner.acquire(); } public void update(Type var1, ScannerIOMetadata var2) { if (var1.equals(ScannerIOMetadata.ACQUIRED)) { BufferedImage var3 = var2.getImage(); System.out.println("Have an image now!"); try { ImageIO.write(var3, "png", new File("mmsc_image.png")); } catch (Exception var5) { var5.printStackTrace(); } } else if (var1.equals(ScannerIOMetadata.NEGOTIATE)) { ScannerDevice var6 = var2.getDevice(); } else if (var1.equals(ScannerIOMetadata.STATECHANGE)) { System.err.println(var2.getStateStr()); if (var2.isFinished()) { System.exit(0); } } else if (var1.equals(ScannerIOMetadata.EXCEPTION)) { var2.getException().printStackTrace(); } } public static void main(String[] var0) { try { app = new TwainExample(var0); } catch (Exception var2) { var2.printStackTrace(); } } }
3 ADF打印(參照架包里的:ADFTwainExample)
package com.kintech.scanAF.controllerScan; import uk.co.mmscomputing.device.scanner.Scanner; import uk.co.mmscomputing.device.scanner.ScannerIOException; import uk.co.mmscomputing.device.scanner.ScannerIOMetadata; import uk.co.mmscomputing.device.scanner.ScannerListener; import uk.co.mmscomputing.device.twain.TwainIOMetadata; import uk.co.mmscomputing.device.twain.TwainSource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; /** * @author Tyler * @date 2019/8/20 */ public class testTwainADF implements ScannerListener { static testTwainADF app; Scanner scanner = Scanner.getDevice(); int transferCount = 0; String filename=System.getProperty("user.home")+"\\My Documents\\test"; public testTwainADF(String[] var1) throws ScannerIOException { this.scanner.addListener(this);
//選擇驅動
//this.scanner.select();
//防止多個驅動,默認查找EPSON驅動
//this.scanner.select("EPSON DS-410"); this.scanner.acquire(); } public void update(ScannerIOMetadata.Type var1, ScannerIOMetadata var2) { if (var1.equals(ScannerIOMetadata.ACQUIRED)) { BufferedImage var3 = var2.getImage(); ++this.transferCount; try { ImageIO.write(var3, "png", new File(filename+this.transferCount+".png")); } catch (Exception var5) { var5.printStackTrace(); } } else if (var1.equals(ScannerIOMetadata.NEGOTIATE)) { TwainSource var8 = ((TwainIOMetadata)var2).getSource(); String var4 = var8.getProductName(); var8.setShowUI(false); try { //var8.getCapability(4385, 2).setCurrentValue(90.0D); //取消雙面打印 var8.setCapability(4115,false); //彩色打印 var8.setCapability(TwainCapability.ICAP_PIXELTYPE ,TWPT_RGB); System.out.println("set transferCount: " + this.transferCount); } catch (Exception var7) { System.out.println("CAP_FEEDERENABLED/CAP_AUTOFEED/CAP_XFERCOUNT: " + var7.getMessage()); } } else if (var1.equals(ScannerIOMetadata.STATECHANGE)) { System.err.println(var2.getStateStr() + " [" + var2.getState() + "]"); if (var2.getLastState() == 4 && var2.getState() == 3) { if (this.transferCount < 1) { try { this.scanner.acquire(); } catch (Exception var6) { System.err.println(var6); } } else { try { this.scanner.setCancel(true); //System.exit(0); } catch (ScannerIOException e) { e.printStackTrace(); } } } } else if (var1.equals(ScannerIOMetadata.EXCEPTION)) { var2.getException().printStackTrace(); } } public static void main(String[] var0) { try { app = new testTwainADF(var0); } catch (Exception var2) { var2.printStackTrace(); } } }