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

java Twain 直接打印/界面打印的更多相关文章

  1. java中直接打印对象

    java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...

  2. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  3. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  4. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

  5. Java 图形化界面设计(GUI)实战练习(代码)

    关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...

  6. EOS下控制台以及图形界面打印sql语句

    EOS下控制台以及图形界面打印sql语句 场景需求:在eos中打印sql语句,包括数据实体,查询实体和命名sql的sql语句. 所需资源: P6spy:负责拦截sql,并打印. Sqlprofiler ...

  7. 01 Java图形化界面设计——容器(JFrame)

    程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构,现在就进入java图形化界面编程. 一.Jav ...

  8. 【计项02组01号】Java版图形界面计算器

    Java版图形界面计算器1.0版本 项目分析[1.0] 组成部分 代码结构 (1)窗口的创建 在<JDK 核心 API>中我们提到,创建一个窗口需要使用 JFrame 类.在本实验中,我们 ...

  9. Java jacob调用打印机打印word文档

    前面说了Java如何生成复杂的Word文档,今年记录下Java如何调用打印机打印word文档. 起初用的是自带的PrintJob,但是系统提供的打印机制并不成熟完整.网上的代码也是千篇一律,在我的打印 ...

随机推荐

  1. 剑指offer第二版面试题2:数组中重复的数字(JAVA版)

    题目:在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的.请找出数组中任意一个重复的数字,但是不能修改输入的数组.例如,如果输入长度为8的数组{2,3,5,4,3 ...

  2. HDU 6685 Rikka with Coin (枚举 思维)

    2019 杭电多校 9 1006 题目链接:HDU 6685 比赛链接:2019 Multi-University Training Contest 9 Problem Description Rik ...

  3. shell提取rpm的报名

    说明: rpm本身未安装,下面方法是基于rpm包文件实现提取rpm的包名 rpm -qpi ZXVEi-git0/CgsOS/abrt-2.1.11-48.el7.centos.x86_64.rpm ...

  4. 通过java api 读取sql 中数据(查询)

    配置文件:dbconfig.properties 里面的数据 jdbc.url.jwhat=jdbc\:mysql\://ip\:3306/laibadev?useUnicode\=true& ...

  5. 68.最大k乘积问题 (15分)

    C时间限制:3000 毫秒 |  C内存限制:3000 Kb题目内容:设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和 ...

  6. 在vue中运用mt-loadmore 实现上拉加载,下拉刷新

    元旦了,给手残党直接复制的机会,代码如下: 1. :style="{'-webkit-overflow-scrolling': scrollMode}" 最外层div设置,以便兼容 ...

  7. WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置

    来自:  http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...

  8. php的生命周期的概述

    1. PHP是随着WEB服务器(apache)的启动而运行的: 2. PHP通过mod_php5.so()模块和服务器(apache)相连 3. PHP总共有三个模块:内核.Zend引擎.以及扩展层: ...

  9. mysql全套

    1. 什么是数据库 存储数据的仓库 2. 什么数据: 大家所知道的都是数据.比如:你同学的名字,年龄,性别等等 3. 数据库概念 1.数据库服务器 2.数据库管理系统 重点 3.库 4.表 5.记录 ...

  10. Comparable和Comparator接口是干什么的?列出它们的区别

    Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象. Java提供了 ...