Есть ли способ указать принтер PrintTo при порождении процесса? - PullRequest
9 голосов
/ 07 июля 2010

Что у меня есть

В настоящее время я пишу программу, которая принимает указанный файл и выполняет с ним определенные действия. В настоящее время он открывает его и / или прикрепляет к электронному письму и отправляет по указанному адресу.

Файл может иметь формат: Excel, Excel, Word или PDF.

То, что я сейчас делаю, - это создание процесса с путем к файлу, а затем запуск процесса; однако я также пытаюсь исправить добавленную мной функцию bug , которая добавляет глагол «PrintTo» к информации о запуске, в зависимости от указанной настройки.

Что мне нужно

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

Если нет способа сделать это в общем, мы могли бы найти способ сделать это для каждого отдельного типа файла.

Что вам нужно

Вот код, который я использую:

ProcessStartInfo pStartInfo = new ProcessStartInfo();
pStartInfo.FileName = FilePath;

// Determine wether to just open or print
if (Print)
{
    if (PrinterName != null)
    {
       // TODO: Add default printer.
    }

    pStartInfo.Verb = "PrintTo";
}

// Open the report file unless only set to be emailed.
if ((!Email && !Print) || Print)
{
    Process p = Process.Start(pStartInfo);
}

Как у меня дела ...

Все еще в замешательстве ... можно было бы назвать это, как Microsoft, «Это было разработано».

Ответы [ 2 ]

21 голосов
/ 25 марта 2011

Следующее работает для меня (проверено с * .doc и * .docx файлами)

диалоговое окно печати окна появляется с использованием «System.Windows.Forms.PrintDialog» и для «System.Diagnostics.ProcessStartInfo "Я просто беру выбранный принтер:)

, просто заменяю FILENAME на полное имя (путь + имя) вашего файла Office.Я думаю, что это также будет работать с другими файлами ...

// Send it to the selected printer
using (PrintDialog printDialog1 = new PrintDialog())
{
    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
        System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(**FILENAME**);
        info.Arguments = "\"" + printDialog1.PrinterSettings.PrinterName + "\"";
        info.CreateNoWindow = true;
        info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        info.UseShellExecute = true;
        info.Verb = "PrintTo";
        System.Diagnostics.Process.Start(info);
    }
}
3 голосов
/ 03 марта 2011

Теоретически, согласно статье на MSDN , вы должны иметь возможность изменить ее так, чтобы она соответствовала (не проверено):

// Determine wether to just open or print
if (Print)
{
    if (PrinterName != null)
    {
        pStartInfo.Arguments = "\"" + PrinterName + "\"";
    }

    pStartInfo.CreateNoWindow = true;
    pStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    pStartInfo.UseShellExecute = true;
    pStartInfo.WorkingDirectory = sDocPath;

    pStartInfo.Verb = "PrintTo";
}
...