С# заставляет задание на печать быть симплексным (принтер по умолчанию - дуплексный)

Проблема
1. У нашего клиента есть сетевой принтер, настроенный для двусторонней печати (это нельзя изменить).
2. Мы должны печатать листы этикеток формата A4 на этом принтере, но он не должен быть в дуплексном режиме, так как этикетки перемещаются вокруг роликов и запутываются.
3. Когда мы печатаем наши этикетки, задание на печать все еще находится в дуплексном режиме (проверено путем изучения вывода PCL путем печати в файл).

Линия

e.PageSettings.PrinterSettings.Duplex = Duplex.Simplex;  

не имеет никакого эффекта.

Как заставить страницу печататься в симплексе?

Наш код
Мы печатаем на принтере формата A4, используя классы .Net PrintDocument/PrintController, как показано ниже. Этот код взят из тестового приложения, которое может воспроизвести проблему на простом примере.

У нас есть собственный класс PrintDocument, который:
а) устанавливает параметры печати в OnQueryPageSettings;

protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
{
    // This setting has no effect
    e.PageSettings.PrinterSettings.Duplex = Duplex.Simplex;
}

б) Генерирует содержимое страницы в методе OnPrintPage:

protected override void OnPrintPage(PrintPageEventArgs e)
{
    Graphics g = e.Graphics;

    int fs = 12;
    FontStyle style = FontStyle.Regular;
    Font baseFont = new Font("Arial", fs, style);

    PointF pos = new PointF(10, 10);

    g.DrawString("This is a test page", baseFont, Brushes.Black, pos);

    e.HasMorePages = false;
}

Для этого мы создаем экземпляр нашего PrintDocument, назначаем ему StandardPrintController и вызываем Print():

void DoPrint()
{
    MyPrintDocument mydoc = new MyPrintDocument();

    PrinterSettings ps = ShowPrintDialog();
    if (ps != null)
    {
        mydoc.PrinterSettings = ps;
        StandardPrintController cont = new StandardPrintController();
        mydoc.PrintController = cont;
        mydoc.Print();
    }
}

Спасибо, Адам


person Adam    schedule 12.04.2012    source источник


Ответы (1)


Установка свойства PrinterSettings.Duplex в OnQueryPageSettings не имеет никакого эффекта, вам необходимо установить это свойство перед вызовом Print(). (Это кажется очевидным, теперь я думаю об этом!)

Это работает:

void DoPrint()
{
    MyPrintDocument mydoc = new MyPrintDocument();

    PrinterSettings ps = ShowPrintDialog();
    if (ps != null)
    {
        ps.Duplex = Duplex.Simplex; // This works

        mydoc.PrinterSettings = ps;
        StandardPrintController cont = new StandardPrintController();
        mydoc.PrintController = cont;
        mydoc.Print();
    }
}
person Adam    schedule 13.04.2012