java Twain 直接打印/界面打印

这两天,在搞归档系统。需要用到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

 

 相关文档:http://thorntonzone.com/manuals/Compression/Fax,%20IBM%20MMR/MMSC/mmsc/uk/co/mmscomputing/device/twain/index.html

 

三 ,上代码

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(); } } }

 

 

 

Twain Capabilities 相关参数设置

https://www.cnblogs.com/hanjun0612/p/11376293.html

posted @ 2019-08-16 18:03  正怒月神  阅读(2144)  评论(14编辑  收藏  举报