使用Windows Print Spooler API,我们可以打印出XPS文件。默认打印机设置被忽略
问题是打印假脱机程序忽略默认打印机设置。
(我们已经放弃了试图apply printer settings。默认的打印机设置将只需要就够了。)
例如...打印输出总是出来的颜色和每一个页纸张,无论控制面板中设置的设置:黑色&白色/彩色,双面/非双面,每页多页/每页单页。
其他应用程序如MS Word和Adobe尊重默认打印机设置。
我们使用Delphi XE2和Windows 7 64位。使用
这个测试代码是自包含的,所以你可以将其粘贴在测试它...
填充与打印机名称的组合框:
uses
Printers
ComboBox1.Items.Assign(Printer.Printers);
打印步骤:
uses
Winapi.WinSpool
procedure PrintXPS(PrinterName, FileNameXPS: string; ParentFormHandle: THandle = 0);
// Printer handle
procedure Printer_Open(out Printer: THandle; Defaults: PPrinterDefaultsW = nil);
begin
if not OpenPrinterW(PWideChar(PrinterName), Printer, Defaults) then
RaiseLastOSError;
end;
procedure Printer_Close(Printer: THandle);
begin
if not ClosePrinter(Printer) then
RaiseLastOSError;
end;
// Print jobs
function JobCreate(Printer: THandle; FileName: string): Cardinal;
var
lBufferSize: Cardinal;
lAddJobInfo: PAddJobInfo1W;
begin
// Create job
AddJobW(Printer, 1, nil, 0, lBufferSize);
GetMem(lAddJobInfo, lBufferSize);
try
if not AddJobW(Printer, 1, lAddJobInfo, lBufferSize, lBufferSize) then
RaiseLastOSError;
Result := lAddJobInfo.JobId;
// Copy the file into place
CopyFile(PWideChar(FileName), lAddJobInfo.Path, True);
finally
FreeMem(lAddJobInfo, lBufferSize);
end;
end;
procedure JobStart(Printer: THandle; JobID: Cardinal);
begin
if not ScheduleJob(Printer, JobID) then
RaiseLastOSError;
end;
var
PrinterA: THandle;
JobID: Cardinal;
begin
if not FileExists(FileNameXPS) then
raise Exception.Create('File not found: ' + FileNameXPS);
Printer_Open(PrinterA, nil);
try
JobID := JobCreate(PrinterA, FileNameXPS);
JobStart(PrinterA, JobID);
finally
Printer_Close(PrinterA);
end;
end;
这段时间以来,我一直在这方面工作,但如果您直接与后台打印程序交谈,那么您发送它的文件是最终的打印机准备好的内容,并且与打印机的默认设置完全没有关系。如果您正在假脱机数据文件 - 一致性,这是一件好事。如果你想像Word一样打印,那么你需要用print shell动词来运行应用程序(类似于“%1/Print”)。 – mj2008
这对我没有意义。无论XPS文件如何渲染为文件,用户可能都希望使用不同的纸盘,或更改纸张大小等。 –
感谢关于shell命令的指针。我会调查他们。 –