来源:邯郸万博网络教育学校时间:2013/5/9 14:04:36
大多数文档是面向应用的,如微软的Word,MS Excel或Adobe,“知道”如何打印文件。例如,Word文本保存DOC扩展名的文档里面。由Word(微软)决定doc文件的原始的内容,它知道如何打印doc文件。这同样适用于任何有可打印信息的已知类型的文件。
如果你需要从你的应用打印不同类型文件,你能知道如何传送文件,以便打印机能正确打印?我想答案是否定的。至少我不知道:)
Delphi打印任何类型的文件(PDF,文档,xls,HTML格式,RTF格式,docx)
那么,你如何用Delphi代码编程打印任何类型的文档?
嗯,我想我们应该问windows:应用程序如何打印? 例如,一个PDF文件。甚至我们应该告诉到Windows更多:这里有一个PDF文件,发送到
PDF文件关联的的打印程序。
打开Windows资源管理器,浏览一个包含了一些可打印的文件的目录,当您右键单击在Windows资源管理器中的文件时,大部分时间,你会找到“打印”命令。执行这个shell打印命令,文件被发送到默认打印机打印。
嗯,这正是我们想要的 - 一个文件类型,调用一个方法,将文件发送到相关的应用程序进行打印。
我们所寻找的功能就是ShellExecute的API函数。
ShellExecute: Print / PrintTo
简单的,让您可以编程调用ShellExecute启动任何应用程序/打开任何在用户的计算机上安装的文件。
然而,ShellExecute可以做更多。 ShellExecute可用于启动应用程序,打开Windows资源管理器,启动一个指定的目录中搜索的开始 -
,什么是重要的,我们现在:打印指定的文件。
指定 ShellExecute / Print 的打印机
以下是使用ShellExecute函数如何打印文件:
ShellExecute(Handle, 'print', PChar('c:\document.doc'), nil, nil, SW_HIDE) ;
请注意第二个参数:“print”。
使用上面的调用,一个在C盘的根目录的文件“document.doc”将被发送到Windows默认打印机。
ShellExecute对于"print"操作总是使用默认打印机。
如果你需要打印到不同的打印机,你想允许用户更改打印机吗?
PrintTo Shell命令
有些应用程序支持'printto操作。 PrintTo可用于指定打印操作中使用的打印机的名称。
打印机有3个参数:打印机名称,驱动器的名称和端口。
以编程方式打印文件
好了,有了足够的理论。现在时真正的写代码的时间了:
复制和粘贴前:Printer全局变量(TPrinter类型)为所有Delphi程序管理打印任务。
printer是在“printers”文件中定义,ShellExecute是在“shellapi”文件中定义。
拖放一个TComboBox到窗体上。将它命名为“cboPrinter”。设置样式为csDropDownLidt
把下面两行的代码加到窗体的OnCreate事件处理程序中:
//在combobox中填写有效的打印机的名称
cboPrinter.Items.Assign(printer.Printers);
//指定默认打印机
cboPrinter.ItemIndex := printer.PrinterIndex;
现在,您可以使用下面的程序在指定的打印机上打印任何类型的文件:
uses shellapi, printers;
procedure PrintDocument(const documentToPrint : string) ;
var
printCommand : string;
printerInfo : string;
Device, Driver, Port: array[0..255] of Char;
hDeviceMode: THandle;
begin
if Printer.PrinterIndex = cboPrinter.ItemIndex then
begin
printCommand := 'print';
printerInfo := '';
end
else
begin
printCommand := 'printto';
Printer.PrinterIndex := cboPrinter.ItemIndex;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode) ;
printerInfo := Format('"%s" "%s" "%s"', [Device, Driver, Port]) ;
end;
ShellExecute(Application.Handle, PChar(printCommand), PChar(documentToPrint), PChar(printerInfo), nil, SW_HIDE) ;
end;
注意:如果所选的打印机是默认的,程序使用“print”操作。如果所选的打印机不是默认的,程序使用“printo”的操作。
请注意,另外:某些文件类型没有关联的应用程序进行打印。有些不具备“printto”操作。