请问 Windows 2000/XP如何控制打印机打印完之后自动复位? ( 积分: 300 )

  • 主题发起人 主题发起人 majorsoft
  • 开始时间 开始时间
M

majorsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
用epson LQ 1600kiii针式进行连打时,用的自定义纸张类型,纸张规格为218mm(宽) * 279 mm(高),但是每一张会有0.1mm左右的偏移,连续打印10~20张还接受,在进行大批量的连打时,偏移就很明显了,因为会累加,如100张时就有10mm左右的偏差,就必须手工切一下纸张, 然后由打印机自动退纸张到初始位置,然后继续打印,我想请教大家的是,有没有办法自动完成这个复位的过程(不需要人工干预切纸)
我目前知道有以下几个办法,但试了之后,还是没有解决问题,敬请各位指点:
测试环境 windows 2000 + epson LQ 1600kiii
1. 直接发送控制码,在windows 2k会报错"file access denied", 文件不可以访问,我的打印机是装在LPT1口的
SendPrintCode(Char(27) + '@');
//函数定义
function SendPrintCode(str: string): boolean;
var
F:TextFile;
begin
result:= false;
try
Assignfile(F,'LPT1');
rewrite(F);
Write(F, Str);
CloseFile(F);
result:= true;
except
end;
end;
2.通过在控制面板设置“自动切纸”,就可以解决该问题,但我找遍了打印机的属性页也没有发现。
3.设置模式为高精度英寸模式
SetMapMode(DeviceHandle, MM_HIENGLISH);
但是不知道如何设置英寸单位的纸张类型, 通过测试发现以下的还是 毫米的 模式。
有没有直接设置以英寸为单位的方法?
DevMode := GlobalLock(DeviceHandle);
if DevMode <> nil then
begin
//SetMapMode(DeviceHandle, MM_HIENGLISH);
DevMode^.dmPaperSize := DMPAPER_USER;
DevMode^.dmPaperLength := APaperH;
//自定义纸张高度 单位为 0.1mm
DevMode^.dmPaperWidth := APaperW;
//自定义纸张宽度
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERSIZE;
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERLENGTH;
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERWIDTH;
ResetDC(Printer.Handle, DevMode^);
GlobalUnlock(DeviceHandle);
end;

敬请各位指点,问题可能比较复杂,可另加分。
 
用epson LQ 1600kiii针式进行连打时,用的自定义纸张类型,纸张规格为218mm(宽) * 279 mm(高),但是每一张会有0.1mm左右的偏移,连续打印10~20张还接受,在进行大批量的连打时,偏移就很明显了,因为会累加,如100张时就有10mm左右的偏差,就必须手工切一下纸张, 然后由打印机自动退纸张到初始位置,然后继续打印,我想请教大家的是,有没有办法自动完成这个复位的过程(不需要人工干预切纸)
我目前知道有以下几个办法,但试了之后,还是没有解决问题,敬请各位指点:
测试环境 windows 2000 + epson LQ 1600kiii
1. 直接发送控制码,在windows 2k会报错&quot;file access denied&quot;, 文件不可以访问,我的打印机是装在LPT1口的
SendPrintCode(Char(27) + '@');
//函数定义
function SendPrintCode(str: string): boolean;
var
F:TextFile;
begin
result:= false;
try
Assignfile(F,'LPT1');
rewrite(F);
Write(F, Str);
CloseFile(F);
result:= true;
except
end;
end;
2.通过在控制面板设置“自动切纸”,就可以解决该问题,但我找遍了打印机的属性页也没有发现。
3.设置模式为高精度英寸模式
SetMapMode(DeviceHandle, MM_HIENGLISH);
但是不知道如何设置英寸单位的纸张类型, 通过测试发现以下的还是 毫米的 模式。
有没有直接设置以英寸为单位的方法?
DevMode := GlobalLock(DeviceHandle);
if DevMode <> nil then
begin
//SetMapMode(DeviceHandle, MM_HIENGLISH);
DevMode^.dmPaperSize := DMPAPER_USER;
DevMode^.dmPaperLength := APaperH;
//自定义纸张高度 单位为 0.1mm
DevMode^.dmPaperWidth := APaperW;
//自定义纸张宽度
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERSIZE;
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERLENGTH;
DevMode^.dmFields := DevMode^.dmFields or DM_PAPERWIDTH;
ResetDC(Printer.Handle, DevMode^);
GlobalUnlock(DeviceHandle);
end;

敬请各位指点,问题可能比较复杂,可另加分。
 
//----------------------------------
下面是用WINAPI控制打印机的方法,绝对好使
procedure printstring(s:string);
type
tdocinfor=record
pdocname:pchar;
poutputfile:pchar;
pdatatype:pchar;
end;

var handle:Thandle;
N:DWORD;
do
cInfo1:TDOCINFOR;
prtname:string;
begin
prtname:= printer.Printers[printer.printerIndex];
if not openPrinter(pchar(prtname),handle,nil) then
begin
showmessage('打印机错误:'+INTTOstr(getlasterror));
exit;
end;
withdo
cinfo1do
begin
pdocname:=pchar('testdo
c');
poutputfile:=nil;
pdatatype:='RAW';
end;
startdocprinter(handle,1, @docinfo1);
startpageprinter(handle);
writeprinter(handle,pchar(s),length(s),N);
endpageprinter(handle);
enddocprinter(handle);

closeprinter(handle);
end;

//----------------------------------回车、换行-------
procedure prnlf(no:cardinal);
var i:cardinal;
begin
for i:=1 to nodo
begin
printstring(chr(13));// 你换成 这两个代码试试 Char(27) + '@'
printstring(chr(10));
end;
end;
 
试的如何?
 
后退
顶部