Приложение C # Batch plot (проблемы PrintServer и PrintQueue) - PullRequest
4 голосов
/ 20 июля 2011

У меня есть проблема, с которой мне нужна помощь.Для моего текущего проекта мне нужно сделать приложение Batch Plot.В этом приложении будет около ~ 2000 чертежей AutoCAD, которые необходимо будет распечатать.

Приложению требуется 5 принтеров, по одному для каждого формата, от A4 до A0.Пока проблем нет.

Теперь мы все понимаем, что не можем поставить в очередь 2000 чертежей одновременно без каких-либо проблем.Я провел онлайн-исследование и нашел методы для просмотра текущей очереди печати.Использование PrintServer и PrintQueue.

Здесь начинаются проблемы.Во-первых, я не могу найти сетевые принтеры, которые мне нужны.Принтеры расположены по этому сетевому адресу: 192.168.0.14 (\ vps01w2k8).

Следуя инструкциям MSDN:

PrintServer m_PrintServer = new PrintServer(@"\\vps01w2k8");
    PrintQueueCollection m_PrintQueueCollection = m_PrintServer.GetPrintQueues();

    foreach (PrintQueue queue in m_PrintQueueCollection)
    {
         cbPrinters.Items.Add(queue.Name.ToString());
    }

Это не дает мне никаких принтеров.Попытка LocalPrintServer (или просто PrintServer без каких-либо параметров, переданных в него).Дает мне мои локальные принтеры (очевидно), а не сетевые принтеры.

Мой следующий шаг - найти способ найти все мои установленные принтеры, в которых я попал в using System.Drawing.Printing; вместо using System.Printing;.

foreach (String printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
    {
         cbPrinters.Items.Add(printer.ToString());
    }

Этот простой код дает мне все принтеры, которые у меня есть, включая сетевые.Однако сейчас я застрял между .NET 2.0 и 3.0 (и далее).Классы PrinterSettings и PrintServer / PrintQueue не имеют связи.

Наконец, я попытался получить доступ к очередям принтера, используя WMI подход .Запрос Win32_PrintJob, который дал мне результаты.К сожалению, они привели к 10-секундным блокировкам для получения этих результатов.

У меня нет идей.Я либо ищу исправление для PrintServer, чтобы правильно вернуть мои сетевые принтеры, либо какие-либо предложения по использованию аналогичных методов для пакетной печати с классом PrinterSettings.

Заранее спасибо,

Джорди

1 Ответ

13 голосов
/ 21 июля 2011

Нашел это.При вызове GetPrintQueues вы должны передать массив EnumeratedPrintQueueTypes.Теперь он возвращает мои локальные и сетевые принтеры (все установленные принтеры).

PrintServer m_PrintServer = new PrintServer();
PrintQueueCollection m_PrintQueueCollection = m_PrintServer.GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections });
...