最近在做一个发票的连续打钱,用jsp读取的数据,循环生成多张发票,是连在一起的,然后用针孔打印机来打。不过打到30多张的时候 就开始走纸了。
  各位大侠有没有遇到过类似的,能不能让打印机每打完20多张的时候,让它往回调2mm的样子,这样子就不会走纸了。。
                 还望高手们赐教呀!!先谢谢了!

解决方案 »

  1.   

    嘿嘿。以前遇见一个同样的问题。
    java 操作硬件是很吃力的。
    关注。
      

  2.   

    java 操作硬件是很吃力的。
    关注
      

  3.   

    可以的,我的程序就加了"每打印n张纸多走或少走x毫米"的功能,用绕过驱动(如果调用驱动就相当于多了一层数据处理,有时就不可靠了),接向打印机发送命令的方式写的,delphi开发(其实任何语言道理都一样).下面是核心代码,
    源程序可以去http://download.csdn.net/source/2019243 下载下面这些指令都是参考了爱普生官方网站上的打印机编程指南,主要是
    设定绝对水平打印位置, 设定相对水平打印位置, 顺方向(向下)走纸3个命令.
         需要说明的是,垂直方向为了精确打印,本人也考虑过半行半行打印.但发现如果这样,打印了上百张纸后,位置精确就不能保障,因此最终本人还是采用一行一行打印的.////连接打印机端口
      Try
        //printport为电脑的打印端口,为lpt1,lpt2…
        AssignFile(F,unit7.printPort);
        Rewrite(F);
      except on e:exception do
      begin
         showmessage('连接'+unit7.printPort+'打印端口失败,可能你的电脑没有'+unit7.printPort+'端口,'+
         '如果是上述情况,可以在 打印管理--打印端口设置 界面中修改打印机端口'+e.Message);
         form1.button1.Enabled:=true;
         exit;
      end;////打印第一页第一行之前,打印机向下走纸距离,一个单位为1/180英寸(2.54厘米)
    //itemp为走纸距离,由于一次走纸不能超过255,所以需要一个for循环,为多次走纸考虑.
    for i:=1 to (itemp div 255) do
    begin
        //向下走纸255个单位
        Write(f,chr(27)+chr(74)+chr(255));
    end;
    Write(f,chr(27)+chr(74)+chr(itemp mod 255));////将打印机指针,移动到水平绝对位置8.9cm处(即接下去从8.9cm处开始打印了)
    //这里一个单位是1/6英寸(2.54厘米)
      itemp:=round(8.9/2.54*60);
      itemp2:=0;
      //由于不能超过255,所以要做以下处理
      if(itemp>255) then
      begin
        itemp2:=itemp div 256;
        itemp:=itemp mod 256;
      end;
      //移到itemp*256+itemp2处
      Write(f,chr(27)+chr(36)+chr(itemp)+chr(itemp2));////打印收款人姓名
      custName:=ADOQuery1.FieldByName('custName').AsString;
      //打印26个空格后再打印收款人姓名
      writeln(f,space(26)+custName);
    space函数为自己写的,代码如下
    function space(count:integer):string;
    var
      str:string;
      i:integer;
    begin
      str:='';
      for i:=1 to count do
      begin
        str:=str+' ';
      end;
      result:=str;
    end;////打印带间距的字符串,打印的效果如”s   t   r   I   n   g”的样子
    procedure writeWideString(strdata:string;int:integer;var f:textfile);
    var
      i:integer;
      len:integer;
    begin
      len:=length(strdata);
      for i:=1 to len do
      begin
        write(f,midbstr(strdata,i,1));
        if (i<>len) then
    begin
      //水平走纸(或说移动到相对水平位置)int个单位
      //一个单位是1/180英寸
          Write(f,chr(27)+chr(92)+chr(int)+chr(00));
        end;
      end;
    end;
    ////打印半行,最终考虑到垂直方向位置准确度,没有采用.如果你仅仅连续打印几十张,建议采用
    procedure writeHalfLn(var f:textfile);
    begin
      //一行尾1/6英寸,一个单位1/180英寸,一行为30个单位,因此半行为15个单位.
    Write(f,chr(27)+chr(74)+chr(15));
    end;
      

  4.   

    程序已经更新了,还是去我的资源 http://sprbreeze.download.csdn.net/ 中看吧,这样能看到所有版本
      

  5.   

    用c++写一个组件,dll,或是ocx,然后在jsp页面中调用.c++操作氐层,比较容易.