无论如何,在生成进程时是否指定了PrintTo打印机?

时间:2010-07-07 18:45:31

标签: c# process shellexecute printers

我有什么

我目前正在编写一个程序,它接受一个指定的文件并用它执行一些操作。目前,它会打开它,和/或将其附加到电子邮件并将其邮寄到指定的地址。

文件可以是以下格式: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);
}

我是怎么做的......

仍然难倒......可能会像微软那样称呼它,'那是设计'。

3 个答案:

答案 0 :(得分:21)

以下适用于我(使用* .doc和* .docx文件测试)

使用“System.Windows.Forms.PrintDialog”显示windows printto对话框,对于“System.Diagnostics.ProcessStartInfo”,我只选择所选的打印机:)

只需将 FILENAME 替换为Office文件的FullName(路径+名称)即可。我认为这也适用于其他文件...

// 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);
    }
}

答案 1 :(得分:3)

理论上,根据an article on 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";
}

答案 2 :(得分:1)

从罗兰肖那里得到:

               ProcessStartInfo startInfo = new ProcessStartInfo(Url)
                {
                    Verb = "PrintTo",
                    FileName = FilePath,
                    CreateNoWindow = true,
                    WindowStyle = ProcessWindowStyle.Hidden,
                    UseShellExecute = true,
                    Arguments = "\"" + PrinterName+ "\"",
                };
                Process.Start(startInfo);

文件路径看起来像'D:\EECSystem\AttachedFilesUS\53976793.pdf'

PrinterName 是您的打印机名称

复制代码,它会工作。