可以的,我的程序就加了"每打印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;
java 操作硬件是很吃力的。
关注。
关注
源程序可以去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;