【问题标题】:Printing to non default printer from c#从 C# 打印到非默认打印机
【发布时间】:2013-03-25 10:12:41
【问题描述】:

我需要能够在没有用户输入的情况下自动打印出许多文档。

应用程序将位于服务器上并在每天的某个时间点进行打印。我需要将一些文档打印到一台打印机和一些到另一台打印机。

我无法让我的代码打印到非默认打印机,除非该非默认打印机是 Microsoft XPS 文档编写器,这导致我怀疑权限。

我正在使用PrinterSettings.PrinterName = "*printername*" 设置打印机,但收到一个打印机异常错误,提示设置不正确。

我确实找到了一篇提到类似错误的文章,但这是与 ASP.Net 而不是 C# - 它与 Windows Impersonation 有关,但我真的不明白如何让它在 c# 中工作。

我应该补充一点,我知道网络打印机名称是正确的,因为我有一点 MS 代码来显示所有已安装的打印机并从它提供的列表中复制了名称。

【问题讨论】:

  • 我认为如果您发布用于打印的实际代码会有所帮助。我以前做过这种类型的应用程序,它非常简单。权限可能是个问题,并确保运行应用程序的用户实际安装了打印机。

标签: c# printing


【解决方案1】:

如果你想设置默认打印机,你可以通过 winapi 来设置:

[DllImport("winspool.drv", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetDefaultPrinter(string Name);

如果您想在代码完成后重置默认打印机,您可能需要 winapi 中的另一种方法:

[DllImport("winspool.drv", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetDefaultPrinter(StringBuilder pszBuffer, ref int size);

您可以通过以下方式获得的所有可用打印机的列表:

List<string> printers = PrinterSettings.InstalledPrinters.Cast<string>().ToList();

【讨论】:

    【解决方案2】:

    我刚刚发现,如果我打印到 \servername\printername 它可以工作,而不是打印到控制面板中显示的打印机名称。我现在有一个不同的问题 - 如果我打印到默认打印机,即不指定打印机,那么它会很快将它们吐出。如果我指定一台打印机,它会等待大约一分钟然后打印,然后等待一分钟然后打印下一个等等 - 为什么这样需要更长的时间?

    【讨论】:

    • 您应该将您的不同问题作为新问题发布。
    • 是的...这确实是一个不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多