繁体   English   中英

在本地系统帐户下的 C# windows 服务中打印 PDF 文件

[英]printing a PDF file in a C# windows service under Local system account

我在 C# 中开发了一个 Windows 服务,它通过网络接收一个 PDF 文件,它需要将它打印到已安装的打印机上。 我正在使用库进行实际打印( HiQPdf )。 我在模拟控制台应用程序中对其进行了测试。

当我在本地系统帐户下安装并运行该服务时,该库会抛出 {"No printers are installed."} System.Drawing.Printing.InvalidPrinterException我通过将服务作为调试运行并附加到 Visual Studio 中的服务发现了这一点在管理员模式下。

如果我通过转到服务属性(通过键入 services.msc 访问服务)和登录选项卡在该机器上指定用户帐户,我指定此帐户以及我登录的当前用户的用户名和密码上,然后服务完美地打印

这种方法现在有一个缺点,即需要用户对服务属性进行此更改并保持用户的密码为最新,这并不理想。

现在我的问题是,有没有办法在本地系统帐户或任何其他帐户系统帐户下运行该 Windows 服务,而不是需要为该帐户提供用户名和密码的用户帐户

我还发现以下文章从 Windows 服务打印,它建议不要在 Windows 服务中使用某些库并加载用户配置文件(我猜这需要用户凭据),但没有建议如何在本地系统帐户下执行此操作。

同样有趣的是,即使在本地系统帐户下,我也可以获得已安装打印机的列表,其中包括提到的所需打印机:

try
{
    if (System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count > 0)
    {
        string[] ar = new string[System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count];
        System.Drawing.Printing.PrinterSettings.InstalledPrinters.CopyTo(ar, 0);
        System.IO.File.WriteAllLines(@"c:\Projects\list_of_printter.txt", ar);
    }
}
catch (Exception e)
{
    Console.WriteLine(e);
}

以下代码片段实际执行打印作业:

try
 {
   var pdfPrinter = new PdfPrinter();
   logger.LogInformation("Created pdf printer");

   pdfPrinter.PrinterSettings.PrinterName = printerName;
   pdfPrinter.SerialNumber = "MY_LICENSE";
   pdfPrinter.SilentPrinting = true;
   pdfPrinter.PageSettings.Margins.Bottom = 0;
   pdfPrinter.PageSettings.Margins.Left = 0;
   pdfPrinter.PageSettings.Margins.Right = 0;
   pdfPrinter.PageSettings.Margins.Top = 0;
   pdfPrinter.PageSettings.Landscape = true;

   logger.LogInformation("About to print document");
   pdfPrinter.PrintPdf(fileBytes);
   logger.LogInformation("Document should be printed now");
 }
 catch (Exception e)
 {
   logger.LogError($"Error when printing.  Exception: {e}. Message: {e.Message}");
    throw;
 }

系统用户没有安装打印机,它看不到您作为用户安装的打印机。

要从作为系统的服务打印到网络打印机,您需要将打印机安装为本地打印机。

http://techgenix.com/AddSharedPrinterasaLocalPrinter/

我将此用于打印 PDF 的 Widows 服务。

我只是遇到了几乎相同的问题,但使用 Windows 服务甚至更早失败了。 我的建议只是不要使用该 Windows 服务项目类型。 创建一个控制台应用程序并使用NSSM - Non-Sucking Service Manager使其成为一项服务。 此外,安装和卸载服务也不会那么痛苦,如果您愿意,还可以使用 GUI。

那么问题是默认打印机不同。 您必须手动设置默认打印机:

var settings = new PrinterSettings();
settings.PrinterName = "HPBF11E5 (HP OfficeJet 6950)";

var p = new PrintDocument();
p.PrinterSettings = settings; //set settings with new default printer
...

这样我什至在没有“允许服务与桌面交互”选项的情况下使用 LocalService 帐户让它工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM