【问题标题】:how to select printer for multiple documents?如何为多个文档选择打印机?
【发布时间】:2024-04-13 13:35:02
【问题描述】:

我有一个带有文档列表的 WPF 应用程序。我创建了一个全部打印按钮,它将所有文档发送到我的默认打印机。我想让用户能够选择打印机,然后将所有文档发送到该打印机。

但是如何显示打印对话框并保存打印机信息?以及如何在关闭对话框后打印到特定的打印机?

我的打印功能中有这个,而且效果很好(但打印机用错了)

var p = new Process
{
    StartInfo = new ProcessStartInfo
    {
       CreateNoWindow = true,
       Verb = "print",
       FileName = filePath
    }
};
p.Start();

【问题讨论】:

    标签: c# wpf printing


    【解决方案1】:

    感谢 Ray 的大力帮助。

    以下方法适用于选择打印机。当用户在打印对话框中单击“打印”时,将捕获打印机队列。

    public PrintQueue SelectPrinter()
    {
         var dialog = new PrintDialog();
         if (dialog.ShowDialog() == true)
         {
            if (dialog.PrintQueue != null)
               return dialog.PrintQueue;
         }
         return null;
    }
    

    打印多个文档时可以使用打印队列;

    ...
    var startInfo = new ProcessStartInfo
                            {
                               CreateNoWindow = true,
                               Verb = "printTo",
                               FileName = filePath,
                               Arguments = printQueue.FullName, // <-- here
                               WindowStyle = ProcessWindowStyle.Hidden,
                               UseShellExecute = true,
                            };
    var p = Process.Start(startInfo);
    ...
    

    【讨论】:

      【解决方案2】:

      您可以使用PrintDialog

      一个常见的使用模式是

      PrintDialog dialog = new PrintDialog();
      if (dialog.ShowDialog() == true)
      {
          dialog.PrintVisual(visual, "Job Name");
          //dialog.PrintDocument(paginator, "Document Name");
      
      }
      

      如果您想从文件中打印,您需要加载该文件并创建一个DocumentPaginator。如何执行此操作取决于您尝试打​​印的文件格式。

      【讨论】:

      • 好的,分页器解决方案是否比使用带有 Verb="printTo" 的 ProcessStartInfo 更好?
      • 取决于您所说的更好。它可以让你做更多事情,比如打印预览等,它允许用户设置打印选项(这是你需要的)。
      • 好的,谢谢雷。打印选项很好。我猜预览对于多个文档来说有点问题。此外,我的简单解决方案似乎经常在打印最后一个文档后让 Acrobat 阅读器保持打开状态。我会查看分页器。
      • 哦 PDF :( 这不会很有趣。您可能需要一些第三方组件,所以可能不值得。
      • 你说的很对,一点都不好玩。如果我只是使用 PrintTo 动词将它们全部发送到打印机,则在打印前一个文档之前似乎在 acrobat 中打开了一个文档。我可以让它等待,但我什么时候知道 acrobat 何时完成打印?
      【解决方案3】:

      这只是一个线索,而不是一个完整的答案,但我认为它会有所帮助。

      您可以使用 Windows 注册表列出打印机并更改默认打印机。

      herehere

      您可以使用 .NET 框架轻松地在注册表中读取和写入。

      【讨论】:

      • 感谢您的提示,但我希望尽可能避免更改默认打印机