手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

设置打印机后台打印数据格式的几个办法

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
先说说为什么要改变打印机后台打印数据格式的原因,这得从打印后台打印数据格式说起,一般SCRIPT打印机后台格式有多种,如RAW、EMF...,但RAW格式是唯一被全部打印机所支持。在远程打印中,只有RAW格式是被WINDOW支持的,这可以在MSDN中查到。另外,如果打印图像,除DIB图像外,部分打印机在采用EMF格式时无法打印,如HP LaserJet 1100。当然,如果采用GDIPLUS技术打印,在400DPI下也是可能正常打印,但当DPI大于400(具体上限没有测试),图像依然无法打印。

接下来,谈谈处理这个问题的几种办法:

不用说,这一种办法当然是打印机控制程序设置。招打,快闪!这个办法阿猫阿狗都会。

第二种办法,我是查了N多的资料才发现的,通过修改注册表中打印机参数,这其实也是这一种办法的变通办法,具体请看http://www2.lszy.net/tm/Article_Print.asp?ArticleID=804

第三种办法,能过调用WINSPOOL设置Printer_Info_2; ,这才是真正的设置打印机。

//取得当前打印机句柄
function TfrmPrint.GetCurrentPrinterHandle: THandle;
var
Device, Driver, Port : array[0..255] of char;
hDeviceMode: THandle;
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);     //得到当前打印机名称
if not OpenPrinter(@Device, Result, nil) then         //取得打印机句柄
RaiseLastWin32Error;
end;

//初始设置打印机
procedure TfrmPrint.initPrintSet;
var
hPrinter : THandle;
pInfo: PPrinterInfo2;
bytesNeeded: DWORD;
begin
hprinter := GetCurrentPrinterHandle;
try
Winspool.GetPrinter( hPrinter, 2, Nil, 0, @bytesNeeded );      //取得printerInfo2的structure size
pInfo := AllocMem( bytesNeeded ); //分配空间
try
Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded ); //取得具体参数组
pInfo.pDatatype :=''''RAW'''';                   //转成RAW格式
SetPrinter(hPrinter,2,pInfo,0);                 //保存新的参数组
finally
FreeMem( pInfo );
end;
finally
ClosePrinter( hPrinter );
end;
end;

到此,设置完成,不过,我还是有几个疑惑,查MSDN得知printerInfo2.Attributes中的PRINTER_ATTRIBUTE_RAW_ONLY好像也是设置RAW格式,但一直无法使用。

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!