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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM