默认打印机设置被忽略了。

3

通过使用 Windows 打印池 API,我们可以打印 XPS 文件。

问题在于打印池忽略了默认打印机设置。

(我们已放弃尝试 应用打印机设置。 默认打印机设置将足以满足需要。)

例如...打印总是彩色并且一页纸上只有一个,无论控制面板中的设置如何:黑白/彩色、双面/非双面、多页/单页。

其他应用程序如 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 等程序一样打印,那么你需要使用打印 shell 动词运行应用程序(类似于“%1 /Print”)。 - mj2008
这对我来说没有意义。用户可能希望使用不同的纸盘或更改纸张大小等,与XPS文件如何呈现无关。 - Peter Thönell
谢谢你提供关于 shell 命令的指针,我会去研究一下。 - Peter Thönell
1个回答

0

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

XPS代表XML Paper Specification,它实际上是一种“电子纸张”,屏幕上和打印出来的文档与作者预期的完全一致。任何曾经因为共享计算机上的不同默认打印机而导致Office文档页面布局发生偏移的人都会感激它。

编辑

测试

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

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

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

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

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

啊,终于懂了。嗯,白费了三个星期试图做不可能的事情。那么接下来我会尝试@ mj2008建议的shell命令。 - Peter Thönell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接