2012-05-28 3 views
2

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

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

(Мы отказались от пытаться apply printer settings. По умолчанию параметры принтера просто достаточно.)

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

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

Мы используем 64-разрядную версию Delphi XE2 и Windows 7.

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

Заполняем поле со списком с именами принтеров с помощью: процедуры

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 и т. Д., Вам нужно запустить приложение с помощью глагола оболочки печати (что будет «% 1/Печать»). – mj2008

+0

Это не имеет смысла для меня. Пользователь может захотеть использовать другой лоток для бумаги или изменить размер бумаги и т. Д., Независимо от того, как файл XPS был передан в файл. –

+0

Спасибо за указатель команд оболочки. Я исследую их. –

ответ

0

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

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

EDIT

Тест

1.) По умолчанию черно-белые настройки принтера. Открой. xps file Печать.

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

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

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

  • IE == черно-белый выход.
  • XPS Viewer EP == черно-белый выход.
+0

Ах. Наконец, я понял. Ну, это было три недели, потраченных на попытку сделать невозможное. Итак, я попробую команду оболочки, предложенную @ mj2008. –

 Смежные вопросы

  • Нет связанных вопросов^_^