从Windows Server 2012上的Windows服务打印

时间:2018-02-08 21:37:44

标签: c# windows printing windows-services windows-server-2012-r2

我在C#.NET 4.6.1中有一个Windows服务,它正在构建SSRS报告并将报告发送到各种网络打印机。所有打印机都安装在安装服务的服务器上。所有这些都在Windows Server 2008R2服务器上运行,最近客户端升级到Windows Server 2012R2,现在没有打印输出。我没有收到错误,当检查打印机上的作业状态时,我可以看到打印机上的作业数增加1,PrintJobStatus.Spooling为真,但打印机上没有任何错误。

            private bool PrintSheet(AppPrintRequest model, PackagingEntities db)
            {
                try
                {                                                
                    var oPrinter = db.AppPrinters.Where(x => x.AppPrinterID == model.AppPrinterID).FirstOrDefault();

                    var lpsPrintServer = new LocalPrintServer();
                    var psPrintServer = new PrintServer();
                    var sbLog = new StringBuilder();

                    byte[] reportBytes = BuildSSRSReport(model);

                    PrintQueueCollection pqcAvailablePrinters;

                    if (!string.IsNullOrEmpty(oPrinter.AppPrinterServer))
                    {
                        pqcAvailablePrinters = lpsPrintServer.GetPrintQueues();
                    }
                    else
                    {
                        pqcAvailablePrinters = psPrintServer.GetPrintQueues();
                    }

                    sbLog.AppendFormat("System: {0} ", model.AppPrintRequestSystem);
                    sbLog.AppendFormat("Printer: {0} ", oPrinter.AppPrinterAddress);

                    foreach(var oAvailablePrinter in pqcAvailablePrinters)
                    {
                        sbLog.AppendFormat("Printer FullName: {0} ", oAvailablePrinter.FullName);
                        sbLog.AppendFormat("Printer Name: {0} ", oAvailablePrinter.Name);
                        sbLog.AppendFormat("Printer Description: {0} ", oAvailablePrinter.Description);
                    }

                    var oLaserPrinter = pqcAvailablePrinters.FirstOrDefault(pqCurrent => pqCurrent.Name.ToUpper() == oPrinter.AppPrinterAddress.ToUpper());

                    sbLog.AppendFormat("Report Bytes is null = {0} ", reportBytes == null);
                    sbLog.AppendFormat("Laser Print is null = {0} ", oLaserPrinter == null);

                    if (reportBytes != null && oLaserPrinter != null)
                    {
                        sbLog.AppendFormat("Report Bytes Length: {0} ", reportBytes.Length);
                        sbLog.AppendFormat("Laser Printer: {0} ", oLaserPrinter.Name);
                        sbLog.AppendFormat("Laser Printer Busy: {0} ", oLaserPrinter.IsBusy);

                        PrintSystemJobInfo oPrintJob = oLaserPrinter.AddJob();                                                            

                        sbLog.AppendFormat("Laser Printer Job Count: {0} ", oLaserPrinter.NumberOfJobs);                    

                        GetPrintJobStatus(oPrintJob, sbLog);

                        oPrintJob.JobStream.Write(reportBytes, 0, reportBytes.Length);
                        oPrintJob.JobStream.Close();

                        oPrintJob.Refresh();

                        sbLog.AppendFormat("Job Completed: {0} ", oPrintJob.IsCompleted);

                        NLogger.Debug(string.Format("Print Sheet: {0}", sbLog.ToString()));

                        return true;
                    }

                    NLogger.Debug(string.Format("Print Sheet: {0}", sbLog.ToString()));

                    return false;
                }
                catch (Exception ex)
                {
                    NLogger.Fatal("PrintEngine_PrintSheet", ex);

                    return false;
                }
            }

0 个答案:

没有答案