zoukankan      html  css  js  c++  java
  • 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:Javajdk1.80_32bitjdk1.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

  • 相关阅读:
    System.Web.Mvc.HttpPostAttribute vs System.Web.Http.HttpPostAttribute? [duplicate]
    Autofac Exception Summary Autofac异常汇总
    AppBox v1.0 发布了
    [原创]ExtAspNet秘密花园(十一) — 布局概述
    ExtAspNet v3.1.9
    ExtAspNet v3.1.8 发布了
    ExtAspNet 主题赏析 7款 超炫!
    ExtAspNet v3.1.7
    ExtAspNet v3.1.6
    [原创]采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/11365582.html
Copyright © 2011-2022 走看看