Печать на сетевой принтер в C # - PullRequest
4 голосов
/ 06 сентября 2011

Я пытаюсь печатать на сетевой сервер через C # в VS2010, но столкнулся с трудностями, заставляя его работать. Если я использую «печатать» глагол insted, он печатает нормально, но только на принтер по умолчанию. Я использую PrintTo Verb, чтобы попытаться указать принтер. В моем случае, используя глагол печати, я могу успешно печатать на том же сетевом принтере, на котором я пытаюсь распечатать, используя глагол printto после того, как я заменю свой принтер по умолчанию на другой принтер. Вот код, который я сейчас использую. Любая помощь будет принята с благодарностью.

    private string FindPrinter(string printerName)
    {
        string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}'", printerName);
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        ManagementObjectCollection printers = searcher.Get();

        foreach (ManagementObject printer in printers)
        {
            if (!String.IsNullOrEmpty(printer.Properties["PortName"].Value.ToString()))
            {
                return printerName = string.Format(@"\\{0}\{1}", printer.Properties["PortName"].Value.ToString(), printerName);
            }
        }

        return printerName;
    }

    private void Print(string fileName, string printerName)
    {
        PrinterSettings ps = new PrinterSettings();
        ps.PrinterName = printerName;
        if (ps.IsValid)
        {
            try
            {
                ProcessStartInfo processStartInfo = new ProcessStartInfo(fileName);
                using (PrintDialog pd = new PrintDialog())
                {
                    pd.ShowDialog();

                    printerName = this.FindPrinter(pd.PrinterSettings.PrinterName);
                    if (printerName.IndexOf(@"\\") == 0)
                    {

                        processStartInfo.Verb = "PrintTo";
                        processStartInfo.Arguments = printerName;
                    }
                    else
                    {
                        processStartInfo.Verb = "print";
                    }
                }

                processStartInfo.CreateNoWindow = true;
                processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

                Process printProcess = new Process();
                printProcess.StartInfo = processStartInfo;
                bool printStarted = printProcess.Start();
                MessageBox.Show(string.Format("{0} printed to {1}", fileName, printerName), "Report Print", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Report Print", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {
            MessageBox.Show(string.Format("{0} printer does not exist.  Please contact technical support.", printerName), "Report Print", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

1 Ответ

2 голосов
/ 17 сентября 2013

использовать только глагол PrintTo и используйте двойные кавычки, чтобы указать имя принтера

processStartInfo.Verb = "PrintTo";
processStartInfo.Arguments = "\"" + printerName + "\"";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...