Настройки принтера по умолчанию игнорируются

Используя Windows Print Spooler API, мы можем распечатать файлы XPS.

Проблема в том, что диспетчер очереди печати игнорирует настройки принтера по умолчанию.

(Мы перестали пытаться применить настройки принтера. Стандартных настроек принтера просто должно хватить.)

Например... распечатки всегда выходят в цвете и по одной бумаге на страницу, независимо от того, какие настройки установлены на панели управления: черно-белые / цветные, дуплексные / недуплексные, несколько страниц на листе / одна страница за лист.

Другие приложения, такие как MS Word и Adobe, уважают настройки принтера по умолчанию.

Мы используем Delphi XE2 и Windows 7 64-bit.

Этот тестовый код самодостаточен, поэтому вы можете просто вставить его, чтобы протестировать...

Заполните поле со списком имен принтеров, используя:

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;

1 ответ

Насколько я знаю, вы не можете изменить внешний вид файла.xps.

XPS расшифровывается как XML Paper Specification, фактически это "электронная бумага", документ на экране и в печати - именно то, что было задумано автором. Любой, кто когда-либо сталкивался с изменением макета страницы документа Office на компьютере с общим доступом из-за другого принтера по умолчанию, оценит это.

РЕДАКТИРОВАТЬ

Тестовое задание

1.) Стандартные настройки черно-белого принтера. Открой. XPS файл Печать.

  • С IE == цветной вывод.
  • С XPS Viewer EP == цветной вывод.

Настройки принтера по умолчанию == игнорируются.

2.) Диалог: настройки принтера вручную для печати черно-белого набора.

  • IE == черно-белый вывод.
  • XPS Viewer EP == черно-белый вывод.
Другие вопросы по тегам