针式打印机连续打印纸问题

Frightingzhouxf 2009-11-30 11:21:07
我的打印机是EPSON LQ-635K ESC/P2:我用的是链纸打印,现在出现这样的问题:打印的内容是两页,他打印完第一张完毕后剩下的纸就不打印第二页,把剩余的纸都吐出来,要重新放一次纸,才可以打印第二页。也就是不能连续的打印。
...全文
2359 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
缪军 2010-01-24
  • 打赏
  • 举报
回复
楼主所说的链纸在windows纸张类型中称作Letter纸,它的尺寸比A4短一点,比A4宽一点
在分页的情况下,如果打印机默认值张是A4的时候会出现楼主所说的情况,请设置Letter为默认纸张
自windows2000开始有了windows的打印服务,但是却取消了用户自定义纸张(win98里有)这种说法,
所以不能直接实现楼主所说的所谓的连续打印,但是有2种间接解决的方案:
1、绕过驱动,直接控制打印机,这种方法兼容性差,一般以Epson的命令控制,见过其他公司采用,但是他们会要求客户部署他们指定的打印机;
2、先向系统中添加一个专用的新纸张比如叫做MyPaper,长度设为客户最常用的纸张尺寸,比如:A4、Letter
然后根据要打印的内容计算出页长,修改MyPaper的长度,再将其设为默认纸张,
接下来执行打印,打印完毕后,将系统默认纸张恢复原先的设置(一般系统默认的是A4,可以先记下来)
最后把这一系列操作的代码封装成Dll
  • 打赏
  • 举报
回复
or,打印机驱动上设置的纸类型不对。
  • 打赏
  • 举报
回复
windows打印机驱动程序选择不对。
sprbreeze 2010-01-24
  • 打赏
  • 举报
回复
本人刚刚做了这个个系统,用绕过驱动(如果调用驱动就相当于多了一层数据处理,有时就不可靠了),接向打印机发送命令的方式写的.下面是核心代码,
源程序可以去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;
Lovely_baby 2009-11-30
  • 打赏
  • 举报
回复
额~~
yuyu622 2009-11-30
  • 打赏
  • 举报
回复
你纸张格式不有设对。要是设置对了就不得了。

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧