首页  编辑  

连续打印

Tags: /超级猛料/Print.打印/   Date Created:

问题标题 : 如何控制打印机? 100 分)

答案提供者 : Another_eYes-25,jiangtao-20,zhaoyipeng-30, 王寒松 -25,

来自: pcw   时间: 99-01-24  22:38:05  ID: 99037

如何用 DELPHI4 编程序:使打印时纸张连续不断地打下去(不跳纸) ?

来自: Another_eYes   时间: 99-1-24 23:07:07 ID: 99040

windows 下不跳纸不可能,只能对跨页缝的那一行特殊处理。

1. 取得页长 (in pixel)

2. 打印时跟踪每行的高度和行间距 , 判断是否超过当前页长 , 假设超过值为 x)

3. 如果正好一页打完则从换页继续打印下一行;如果这行跨页,则换页,设开始位置为 (x- 行高 ) ,重打当前行一次

4. 继续以上操作直到全部打完

来自: 王寒松   时间: 99-3-9 4:28:53 ID: 101950

如果你是图形打印的话,那么跳纸问题只好自己去判断跟踪页高和当前打印位置来判断是否该换纸继续打。另一个方法是使用 DOS 下的行打印技术,在 WINDOWS 下实现比较麻烦。下面是将一个文本文件使用行打印技术到打印机的办法与 WINDOWS 图形打印不同的是:在行打印中需要绕过打印机驱动。

procedure PrintFile(const sFileName: string);

const

 BufSize = 16384;

type

 TDoc_Info_1 = record

   pDocName: pChar;

   pOutputFile: pChar;

   pDataType: pChar;

 end;

var

 Count, BytesWritten: integer;

 hPrinter: THandle;

 Device : array[0..255] of char;

 Driver : array[0..255] of char;

 Port   : array[0..255] of char;

 hDeviceMode: THandle;

 DocInfo: TDoc_Info_1;

 f: file;

 Buffer: Pointer;

begin

 Printer.PrinterIndex := -1;

 Printer.GetPrinter(Device, Driver, Port, hDeviceMode);

 if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then exit;

 DocInfo.pDocName := 'MyDocument';

 DocInfo.pOutputFile := nil;

 DocInfo.pDatatype := 'RAW';

 if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then

 begin

   WinSpool.ClosePrinter(hPrinter);

   exit;

 end;

 if not StartPagePrinter(hPrinter) then

 begin

   EndDocPrinter(hPrinter);

   WinSpool.ClosePrinter(hPrinter);

   exit;

 end;

 System.Assign(f, sFileName);

 try

   Reset(f, 1);

   GetMem(Buffer, BufSize);

   while not eof(f) do

   begin

     Blockread(f, Buffer^, BufSize, Count);

     if Count > 0 then

     begin

       if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then

       begin

         EndPagePrinter(hPrinter);

         EndDocPrinter(hPrinter);

         WinSpool.ClosePrinter(hPrinter);

         FreeMem(Buffer, BufSize);

         exit;

       end;

     end;

   end;

   FreeMem(Buffer, BufSize);

   EndDocPrinter(hPrinter);

   WinSpool.ClosePrinter(hPrinter);

 finally

   System.Closefile( f );

 end;

end;

上面的例子改一改就可以做成通用的行打,注意 uses 子句里一定要加上 WinSpool