java Twain 直接打印/界面打印/ADF打印

76 篇文章 2 订阅

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

    }
}

 

 

Twain Capabilities 相关参数设置

https://blog.csdn.net/hanjun0612/article/details/99718921

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 262
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 262
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值