如何在 c# 中打印 txt 文件时删除 "Save Print output as" 对话框

How to remove the "Save Print output as" dialog when printing a txt file in c#

你好 Whosebug 社区,我正在开发一个简单的 windows 表单应用程序,它在特定目录中有一个侦听器,用于侦听 txt 文件,如果侦听器检测到新文件,它将自动发送 txt 文件到本地默认打印机,但它也显示一个 "Save print output as" 对话框,我需要打印过程是即时的,而不必与任何对话框交互。

为此,我正在使用当前命名空间 "using System.Drawing.Printing; using System.IO;",我已经看到了 Print() 方法的定义,但似乎代码受到保护,因此我无法访问删除 "save print output as" 对话框。有什么想法吗?

这是我的代码...

文件观察者:

private void fileSystemWatcher1_Created(object sender, FileSystemEventArgs e)
{
    try
    {
        MyPrintMethod(e.FullPath);
    }
    catch (IOException)
    {
    }
}

我的打印方法:

private void MyPrintMethod(string path)
{
    string s = File.ReadAllText(path);
    printDocument1.PrintController = new StandardPrintController();
    printDocument1.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
    {
        e1.Graphics.DrawString(s, new Font("Times New Roman", 12), new SolidBrush(Color.Black), new RectangleF(0, 0, printDocument1.DefaultPageSettings.PrintableArea.Width, printDocument1.DefaultPageSettings.PrintableArea.Height));

    };
    try
    {
        printDocument1.Print();
    }
    catch (Exception ex)
    {
        throw new Exception("Exception Occured While Printing", ex);
    }
}

当正在使用的打印机是文档编写器时会出现该对话框,例如 Microsoft XPS Document WriterMicrosoft Print to PDF。由于您没有按名称指定打印机,问题很可能是当前的默认打印机。

如果您知道要使用的打印机名称,则可以这样指定:

printDocument1.PrinterSettings.PrinterName = 
    @"\printSrv.domain.corp.company.com\bldg1-floor2-clr";

如果您不知道名称,那么最好的办法可能就是询问用户他们想要打印到哪一个。您可以像这样获得已安装打印机的列表:

var installedPrinters = PrinterSettings.InstalledPrinters;

And then when one is chosen, you can specify the name as in the first code sample.下面是一些代码,您可以使用这些代码提示用户输入打印机,并将打印机设置为他们选择的打印机:

Console.WriteLine("Please select one of the following printers:");
for (int i = 0; i < installedPrinters.Count; i++)
{
    Console.WriteLine($" - {i + 1}: {installedPrinters[i]}");
}

int printerIndex;
do
{
    Console.Write("Enter printer number (1 - {0}): ", installedPrinters.Count);
} while (!int.TryParse(Console.ReadLine(), out printerIndex)
         || printerIndex < 1 
         || printerIndex > installedPrinters.Count);

printDocument1.PrinterSettings.PrinterName = installedPrinters[printerIndex - 1];