如何在 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 Writer
或 Microsoft 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];
你好 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 Writer
或 Microsoft 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];