java调用打印机打印问题求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java调用打印机打印问题求解相关的知识,希望对你有一定的参考价值。

/**
* 打印Excel
* @param path
* @param printerName
* @throws Exception
*/
public static void print(String path, String printerName)
throws Exception
ComThread.InitSTA();
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
try
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks, "Open", path).toDispatch();
Dispatch.callN(workbook, "PrintOut", new Object[]
Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
new Boolean(false), printerName, new Boolean(true),
Variant.VT_MISSING, "" );
Dispatch.call(workbook, "Close");
catch (Exception e)
e.printStackTrace();
throw e;
finally
xl.invoke("Quit", new Variant[] );
ComThread.Release();


这是打印方法,我用main方法调用这个方法能成功的打印出来,但是用我页面调用(弄个button访问后台方法),就不能打印了,这是怎么回事?
ComThread.InitSTA();到这个就不往下面走了

参考技术A 按你的描述,这句在初始化线程,分配资源,你查看下,是不是你的数据量过大,消耗的内存过多,导致溢出 参考技术B ComThread.InitSTA();这个里面的内容是什么?

ComThread这个类被封在jar中了?追问

对的,这个问题我已经解决了,但是推翻重做了,不用这个了,最终可以打印的,但是只能是服务器端的那台机子连着打印机方可打印,客户端是打印不了的。唉

追答

嗯,这个是正常的。
你用网页的话,肯定是向服务器端发送请求,所有的java代码都是在服务器端运行,
所以打印只能在服务器端进行,是正常的。

网页的打印方式有两种。
1.用浏览器打开你要打印的文件,调用浏览器的打印功能。(当然,这个也得是用户自己去点。用javascript好象也可以实现,但不是很把握,有可能会受安全限制而出问题)
2.下载文件到本地,让用户自己去打印。

我开始以为 ComThread 运行是被阴塞了,后来发现是init方法,所以问你类的内容是什么,
现在想来,可能是连接打印机的地方出了问题。
我 估计 ComThread这个类中,连接打印机是本机的,而不是网络的,你看看这个类有没有set方法可以设置打印机路径的,这样,你的WEB服务器可以连接打印服务器,进行打印,不用WEB服务器安装打印机。(当然这只是个猜测)

总得来说,不能直接实现WEB客户端实现打印。

追问

我现在用的就是调用浏览器的打印的功能,让用户自己去点,这样做不能实现批量打印让我很纠结
ComThread 卡在这是因为我tomcat没有加载jacob.dll跟jar,把他们放在bin目录下就可以了,其实服务器端打印很有局限性。但是可以满足局域网内需求,比如就一个公司这个项目,可以把服务器的打印机配置到别的打印机上,没试过,不过我想应该是可以的,外网访问这项目就不行了

追答

别纠结了,
B/S的就是这样,你看WEB页的有几个是可以批量打印的,这又不是C/S
好象WEB的也可以实现,但性能会差很多,以前关注过一阵这方面的,后来不怎么适用。
也没有开发任务,就放下了。

这个问题的分给我呗,呵呵

追问

哈哈,肯定给你

追答

:P
以后有问题,再一起讨论

本回答被提问者采纳

java调用博思得打印机的心得

转载:http://www.zuidai和ma.com/blog/2793091475983360.htm

www.zuidai ma.com居然是违禁字符,我也是醉了,所以在www.zuidai后面加一个和字。

曾经公司的项目  让我弄个一个二维码的打印 客户要求选择博思得品牌打印机  我试过调用java里面的打印机的api 可惜打印机可以运行了  但是打印不出图片 我也研究很多关于打印的东西 发现还是不行 后来找到他们技术 他们推荐我使用c/s 调用他们提供的dll 

可是我发现还是出现问题  到最后我才发现原来他们的打印机只支持单色的bmp格式图片 然后我只能把图片先转成bmp 终于成功了 。 我使用的是JNative的包

下面提供下代码给大家参考下:

 

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;


public class javaDll {

    /**
     * @param args
     *对于各个方法没做进一步的处理,只是抛异常而已。
     *执行Main函数可正常打印一张图片
     */
    static final String DLL_FILE = "D:\\CDFPSK.dll";
    public String OpenPort(int xx) throws NativeException,
            IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "OpenPort");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.setParameter(0, xx);
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
    }
    public String SetPCComPort(int BaudRate,boolean HandShake) throws NativeException,
            IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "SetPCComPort");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
   }
    
    public String GetErrState() throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "GetErrState");
        jn_handler.setRetVal(Type.VOID); // 指定返回参数的类型
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    
    public String PTK_GetInfo() throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_GetInfo");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_DrawTextTrueTypeW(int x,int y,int FHeight,int FWidth,String FType,int Fspin,int FWeight,int FLtatlic, int  FUnline, int FStrikeOut,String id_name, String data ) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_DrawTextTrueTypeW");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.setParameter(0, x);
        jn_handler.setParameter(1, y);
        jn_handler.setParameter(2, FHeight);
        jn_handler.setParameter(3, FWidth);
        jn_handler.setParameter(4, FType);
        jn_handler.setParameter(5, Fspin);
        jn_handler.setParameter(6, FWeight);
        jn_handler.setParameter(7, FLtatlic);
        jn_handler.setParameter(8, FUnline);
        jn_handler.setParameter(9, FStrikeOut);
        jn_handler.setParameter(10, id_name);
        jn_handler.setParameter(11, data);
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_PrintLabel(int number,int cpnumber) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_PrintLabel");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.setParameter(0, number);
        jn_handler.setParameter(1, cpnumber);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_BmpGraphicsDownload(String pxname,String pypath,int iDire) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_BmpGraphicsDownload");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.setParameter(0, pxname);
        jn_handler.setParameter(1, pypath);
        jn_handler.setParameter(2, iDire);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_BinGraphicsDownload(String pxname,String pbyte ,int iDire,char[] buff) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_BmpGraphicsDownload");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
        jn_handler.setParameter(0, pxname);
        jn_handler.setParameter(1, pbyte);
        jn_handler.setParameter(2, iDire);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_DrawPcxGraphics(int px,int py,String name) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_DrawPcxGraphics");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.setParameter(0, px);
        jn_handler.setParameter(1, py);
        jn_handler.setParameter(2, name);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    public String PTK_PcxGraphicsDel(String pid) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_PcxGraphicsDel");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.setParameter(0, pid);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    public String PTK_RWRFIDLabel(int a,int b,int c,int d,int f,String ff) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_RWRFIDLabel");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.setParameter(0, a);
        jn_handler.setParameter(1, b);
        jn_handler.setParameter(2, c);
        jn_handler.setParameter(3, d);
        jn_handler.setParameter(4, f);
        jn_handler.setParameter(5, ff);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }

    public String PTK_SetLabelHeight(int height,int gapH) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_SetLabelHeight");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.setParameter(0, height);
        jn_handler.setParameter(1,gapH);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }

    public String PTK_SetLabelWidth(int width) throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "PTK_SetLabelWidth");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.setParameter(0, width);
        
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    public String ClosePort() throws NativeException,
    IllegalAccessException {
        JNative jn_handler = null;
        jn_handler = new JNative(DLL_FILE, "ClosePort");
        jn_handler.setRetVal(Type.INT); // 指定返回参数的类型
    
        jn_handler.invoke(); // 调用方法
        return jn_handler.getRetVal();
        }
    
    
    
    public static void main(String[] args) throws NativeException, IllegalAccessException {
        // TODO Auto-generated method stub
        System.out.println(new javaDll().OpenPort(255));
//        System.out.println(new javaDll().PTK_DrawTextTrueTypeW (30,35,24,0,"宋体",4,400,0,0,0,"A1","机要绝密"));
        System.out.println(new javaDll().PTK_SetLabelHeight(-300,24));
        System.out.println(new javaDll().PTK_SetLabelWidth(0));
        //System.out.println(new javaDll().PTK_RWRFIDLabel(1,0,2,12,1,"123131312312"));
    
        System.out.println(new javaDll().PTK_PcxGraphicsDel("Bag"));
        System.out.println(new javaDll().PTK_BmpGraphicsDownload("Bag","D:\\001.bmp",0));//将一张图片打印
        System.out.println(new javaDll().PTK_DrawPcxGraphics(0,30,"Bag"));
        System.out.println(new javaDll().PTK_PrintLabel(1,1));
        
//        System.out.println(new javaDll().SetPCComPort(9600, true));
//        System.out.println(new javaDll().PTK_GetInfo());
        
        
    
    }

}

以上是关于java调用打印机打印问题求解的主要内容,如果未能解决你的问题,请参考以下文章

用java中的while循环打印乘法口诀表,不要for循环的求解

递归初探

TML 打印预览问题,怎么设置有些内容不出现在打印预览页面上。怎么控制,有下代码 看得不是很懂 求解释

C语言程序求解

打印机显示getLodop出错:ReferenceError: LODOP is not defined 是啥原因,求解,

数据结构与算法之深入解析“奇怪的打印机”的求解思路与算法示例