2012-05-28 119 views
2

使用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; 
+0

这段时间以来,我一直在这方面工作,但如果您直接与后台打印程序交谈,那么您发送它的文件是最终的打印机准备好的内容,并且与打印机的默认设置完全没有关系。如果您正在假脱机数据文件 - 一致性,这是一件好事。如果你想像Word一样打印,那么你需要用print shell动词来运行应用程序(类似于“%1/Print”)。 – mj2008

+0

这对我没有意义。无论XPS文件如何渲染为文件,用户可能都希望使用不同的纸盘,或更改纸张大小等。 –

+0

感谢关于shell命令的指针。我会调查他们。 –

回答

0

就像我知道你不能改变.xps文件的外观。

XPS代表XML纸张规范,它实际上是一个“电子纸”,屏幕上的文档和打印的方式完全是作者的意图。任何有经验的人都知道,由于不同的默认打印机,共享计算机上的Office文档的页面布局如何变化,非常感谢。

编辑

测试

1)默认的黑白打印机设置。打开。 xps文件打印。

  • 使用IE ==彩色输出。
  • 使用XPS Viewer EP ==彩色输出。

默认打印机设置==忽略。

2.)对话框:手动打印设置打印黑白套装。

  • IE ==黑白输出。
  • XPS Viewer EP ==黑白输出。
+0

啊。最后我明白了。那么,这是三个星期浪费在试图做不可能的事情上。接下来我将尝试@ mj2008建议的shell命令。 –

相关问题