如何控制打印机?(100分)

P

pcw

Unregistered / Unconfirmed
GUEST, unregistred user!
如何用DELPHI4编程序:使打印时纸张连续不断地打下去(不跳纸),又如何
自定义纸张大小或设置WIN98系统的打印设置的'自定义'纸张大小?.急需扫描
仪控件for delphi4.望各位大师指教?.
 
windows下不跳纸不可能,只能用变通的办法,即把这页打满(对跨页缝的那一行特殊处理一下)
自定义纸张大小可以参见另一个问题<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=98048
">"我想在程序中把cr3240的默认纸张A4改为US SF(或其它纸张),请教如何实现?"</a>
是原代码. 有一点小改动如下:
把里面PDevMode类型改成PDeviceModeA即可
 
来自深度历险
http://vcl.vclxx.com/d32free/MULTWAIN.ZIP

MultiTWAIN 是一组封装 32 bit TWAIN 扫描仪接口的函式库 ( 1998 年
7 月 14 日版,附源码 ),作者 : Nieves。
 
To Another_eYes : 不跳纸的方法您能给简单的例子吗?
 
没有简单的例子,只有复杂的思路:
1. 取得页长(in pixel)
2. 打印时跟踪每行的高度和行间距, 判断是否超过当前页长, 如果超过, 超过多少(假设为x)
3. 如果正好一页打完则从换页继续打印下一行
如果这行跨页, 则换页, 设开始位置为(x-行高),重打当前行一次
4. 继续以上操作直到全部打完
 
如果你是图形打印的话,那么跳纸问题只好自己去判断跟踪页高和当前打印
位置来判断是否该换纸继续打

另一个方法是使用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;
do
cInfo: 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;
do
cInfo.pDocName := 'MyDocument';
do
cInfo.pOutputFile := nil;
do
cInfo.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
 
如果是图形图象的话,把纸设长一些程序实现比较简单,在9x下连续出3米是没有
问题的,如NT下几乎没有限制。
用分段的方法也可解决,但往往效果不好,尤其是接页的地方,必须精确到点,很麻
烦,效率并不高,因为最后系统都要做假脱机打印,所以还是用上面的方法好些。
关于程序中自动设置页面大小,已有问题回答,这里需提醒的是,有些设备并不是可
以设置任意大小的纸的,只能设置标准页面,需具体实验。
如果是文本的话,应该不会存在任何问题。
 
多人接受答案了。
 
顶部