无论如何在产生进程时指定 PrintTo 打印机?

Posted

技术标签:

【中文标题】无论如何在产生进程时指定 PrintTo 打印机?【英文标题】:Is there anyway to specify a PrintTo printer when spawning a process? 【发布时间】:2010-07-07 18:45:30 【问题描述】:

我有什么

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

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

我过得怎么样……

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

【问题讨论】:

How to Print any document in a SELECTED printer 的可能重复项 【参考方案1】:

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

使用“System.Windows.Forms.PrintDialog”出现 windows printto 对话框,而对于“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);
    

【讨论】:

也适用于我的 pdf 文件!谢谢 - 帮了我很多 我们可以从打印对话框传递整个打印设置吗? @huMpty duMpty:“通过整个打印设置”是什么意思?您已经使用“yourPrintDialog1.PrinterSettings”从打印对话框接收所有打印设置。 它对我有用,但如果打印机不可用或未连接怎么办。他们是否可以通过任何方式向用户显示在这种情况下打印机不可用的错误消息。 @AvneeshSrivastava:如果打印机必须可用,则没有测试。也许windows printDialog 会处理它...【参考方案2】:

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

【讨论】:

我们可以将打印对话框中的整个打印设置作为参数传递吗? @huMptyduMpty No.ShellExecute只支持发送文档和打印机名称 有没有办法可以通过打印机设置? @huMptyduMpty 使用打印机设置对话框中的详细信息处理打印的唯一方法是自己处理打印(即页面布局等)。没有将设置传递给任意客户端应用程序的标准方法。【参考方案3】:

从罗兰·肖那里得到:

               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 是您的打印机名称

复制代码,它会工作。

【讨论】:

以上是关于无论如何在产生进程时指定 PrintTo 打印机?的主要内容,如果未能解决你的问题,请参考以下文章

试述死锁产生的原因和解决办法

如何在执行 time.sleep() 之前让 mpi4py 进程完成打印?

关于死锁的一些概念

死锁产生的原因

在文件中写入打印日志时,Python子进程在屏幕缓冲区中延迟

使用可变文件名访问 2010 打印到 .pdf