none
Почему выбирается Microsoft XPS Document Writer вместо принтера? RRS feed

  • Вопрос

  • Доброго времени суток.

    У меня в коде есть метод для вывода на печать текста:

    public void Print()
    {
       try
       {
          PrintDocument document = new PrintDocument();
          document.PrintController = new StandardPrintController();
          document.PrintPage += new PrintPageEventHandler(this.PrintPageEventHandler);
          document.Print();
       }
       catch (Exception exception)
       {
          this.DoFireUnavoidableError(string.Format("Ошибка при печати '{0}'.", exception.Message));
          return;
       }
       finally
       {
          this.lines = null;
          this.currentLine = 0;
          this.topMargin = 0;
       }
       this.DoFirePrinted();
    }

    Этот метод вызывается из двух разных приложений одного решения.

    В одном случае файл включен в проект и без проблем вызывается печать на принтер следующей строкой:

    printer.Print();
    В другом случае в приложении при возникновении необходимости печати посылается Handler, который отлавливается другим приложением (реализованным в виде службы) и в конечном итоге приводит к вызову:
    base.data.Adapter.Printer.Print();

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

    document.PrintPage += new PrintPageEventHandler(this.PrintPageEventHandler);

     

    не отрабатывается. Но я был не прав (прошу прощения у тех, кого ввел в заблуждение своим предыдущим вопросом "Почему не инициализируется PrintPageEventHandler?").

    Оказывается, что в этом случае в свойстве document.PrinterSettings указан Microsoft XPS Document Writer вместо принтера, а соответственно и вызов отправляется не на принтер, а на Microsoft XPS Document Writer.

    Подскажите, пожалуйста, как с этим справиться, чтобы работал принтер?

    • Изменено sigornjw 4 января 2012 г. 13:17 Обнаружил другую причину проблемы
    2 января 2012 г. 19:34

Ответы

  • Спасибо за помощь.

    Правда, по умолчанию у меня стоит Canon и из одного приложения печать без проблем посылается на него, а вот из другого приложения этот же вызов на этом же компьютере вызывает XPS...

    В общем, пока обошёл ошибку так:

    foreach (string printer in PrinterSettings.InstalledPrinters)
    {
       if (!printer.ToLower().Contains("xps"))
       {
          document.PrinterSettings.PrinterName = printer;
          break;
       }
    }
    

    Но этот вариант, на мой взгляд, не совсем (или даже Совсем НЕ) корректный, потому что я не знаю на каких компьютерах в дальнейшем будет использоваться конечный продукт и сколько каких принтеров на них будет установлено. Ну а пока это работает - ищу другие варианты.

    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2012 г. 12:19
    10 января 2012 г. 17:45

Все ответы

  • Судя по всему, дефолтным принтером является XPS принтер. Если знаете имя настоящего принтера, то его можно выставить через WinAPI:

    [DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
    public static extern bool SetDefaultPrinter(string Name);
    

    10 января 2012 г. 11:52
    Отвечающий
  • Спасибо за помощь.

    Правда, по умолчанию у меня стоит Canon и из одного приложения печать без проблем посылается на него, а вот из другого приложения этот же вызов на этом же компьютере вызывает XPS...

    В общем, пока обошёл ошибку так:

    foreach (string printer in PrinterSettings.InstalledPrinters)
    {
       if (!printer.ToLower().Contains("xps"))
       {
          document.PrinterSettings.PrinterName = printer;
          break;
       }
    }
    

    Но этот вариант, на мой взгляд, не совсем (или даже Совсем НЕ) корректный, потому что я не знаю на каких компьютерах в дальнейшем будет использоваться конечный продукт и сколько каких принтеров на них будет установлено. Ну а пока это работает - ищу другие варианты.

    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2012 г. 12:19
    10 января 2012 г. 17:45