这两天,在搞归档系统。需要用到Twain协议来驱动扫描仪。
找了两天,java的twain操作资料真的不多。而且我还是要找直接打印的功能。
后来只能静下心来看类库和源码。最后搞定他。
打印方式分为3种,
1 直接打印:就是程序跑起来,扫描仪一起跑
2 界面打印:程序跑起来,只是调用打印的默认界面,打印操作在界面完成。
3 ADF打印:自动进纸
废话不多说了。上攻略:
一 ,首先下载 Twain相关架包
1 直接下载:(我用的方案1。)
https://imagej.nih.gov/ij/plugins/twain-scan.html
百度网盘(防止丢失):
https://pan.baidu.com/s/1lSlCz6RgRPdTHdvFSpfPDA
提取码:oef2
2 github:
mmscomputing/src/uk/co/mmscomputing/device at master · alex73/mmscomputing · GitHub
主要是 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
相关文档:mm's computing : java twain wrapper (windows)
三 ,上代码
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);
}
catch (ScannerIOException e)
{
e.printStackTrace();
}
//System.exit(0);
}
}
} 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();
}
}
}