Crystal Reports打印到网络打印机

时间:2018-11-26 16:50:11

标签: c# printing crystal-reports network-printers

到目前为止,我们拥有一个拥有约50个活跃用户的终端服务器,该服务器使用约20台Zebra打印机来打印标签。为了不必为每个用户和打印机手动安装和配置并执行所有操作,我在Windows Server 2012 R2上创建了一个打印服务器,并安装了所有打印机并通过GPO共享它们。

到目前为止,所有打印机都显示在“控制面板”下,powershell Get-Printer列出了所有打印机,通过查看器进行的正常打印可以正常进行。

现在,我们使用了手持式Symbol机器来自动打印,因此我无法显示弹出菜单来查找打印机。为了解决这个问题,我们在每台打印机上都有一个条形码来标识它(到目前为止,通过IP)。

当我尝试直接打印到该打印机时出现问题。 我尝试了三种不同的打印方法,但到目前为止我还没有运气。请考虑到所有这些方法均已尝试使用“无打印机”选项和默认打印机。在其中一种情况下,即使找到了打印机,Crystal Reports也会毫无理由地打印到默认打印机。

这是我到目前为止尝试过的一切:

[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
    public static extern bool SetDefaultPrinter(string Name);
    public void PrintToPrinter(string ip)
    {
        foreach (var queue in new PrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }))
        {
            if (queue.QueuePort.Name.Contains(ip) || queue.Name.Contains(ip))
            {
                SetDefaultPrinter(queue.Name);
                _rp.PrintOptions.PrinterName = queue.Name;
                _rp.PrintToPrinter(1, false, 1, viewer.ViewerCore.GetLastPageNumber());
                MessageBox.Show($"Found printer - {queue.Name} - {viewer.ViewerCore.GetLastPageNumber()}");
                return;
            }
        }
        MessageBox.Show($"Impresora no encontrada - {ip}");
    }

引发错误,提示“无效的打印机EtiquetaExpe 16236_14492_ {7390BEB2-00D9-4350-A289-29E445657570} .rpt”

public void PrintToPrinter(string ip)
    {
        foreach (var queue in new PrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }))
        {
            if (queue.QueuePort.Name.Contains(ip) || queue.Name.Contains(ip))
            {
                using (WindowsImpersonationContext wic = WindowsIdentity.Impersonate(IntPtr.Zero))
                {
                    SetDefaultPrinter(queue.Name);
                    //_rp.PrintOptions.PrinterName = queue.Name;
                    //_rp.PrintToPrinter(1, false, 1, viewer.ViewerCore.GetLastPageNumber());
                    var printOutputController = _rp.ReportClientDocument.PrintOutputController;
                    var repOpts = new CrystalDecisions.ReportAppServer.Controllers.PrintReportOptions();
                    repOpts.PrinterName = queue.Name;
                    printOutputController.PrintReport(repOpts);
                    MessageBox.Show($"Found printer - {queue.Name} - {viewer.ViewerCore.GetLastPageNumber()}");
                }
                return;
            }
        }
        MessageBox.Show($"Impresora no encontrada - {ip}");
    }

抛出“找不到指定的打印机。在当前的安全上下文中可能无法访问它。” (因此,我尝试了模仿)

public void PrintToPrinter(string ip)
    {
        foreach (var queue in new PrintServer().GetPrintQueues(new[] { EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections }))
        {
            if (queue.QueuePort.Name.Contains(ip) || queue.Name.Contains(ip))
            {
                using (WindowsImpersonationContext wic = WindowsIdentity.Impersonate(IntPtr.Zero))
                {
                    var pDoc = new System.Drawing.Printing.PrintDocument();
                    var printLayout = new CrystalDecisions.Shared.PrintLayoutSettings();
                    var printerSettings = new System.Drawing.Printing.PrinterSettings();
                    printerSettings.PrinterName = $@"{queue.Name}";
                    var pSettings = new System.Drawing.Printing.PageSettings(printerSettings);
                    _rp.PrintOptions.PrinterDuplex = CrystalDecisions.Shared.PrinterDuplex.Simplex;
                    var pagesettings = new System.Drawing.Printing.PageSettings(printerSettings);
                    _rp.PrintOptions.DissociatePageSizeAndPrinterPaperSize = true;

                    //_rp.PrintOptions.PrinterName = queue.Name;
                    //_rp.PrintToPrinter(1, false, 1, viewer.ViewerCore.GetLastPageNumber());
                    _rp.PrintToPrinter(printerSettings, pSettings, false);
                    _rp.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, $"");
                    MessageBox.Show($"Found printer - {queue.Name} - Pages: {viewer.ViewerCore.GetLastPageNumber()}");
                    wic.Undo();
                    return;
                }
            }
        }
        MessageBox.Show($"Impresora no encontrada - {ip}");
    }

抛出“访问打印机'<打印机名称>'的设置无效”,也尝试了模拟。

我要疯了,过去两周来我一直在做这个,我似乎对此无能为力。

总是可以找到打印机,在设置中和通过GPO共享打印机,并且向所有人授予“打印”权限。

非常感谢并且迫切需要任何帮助。

0 个答案:

没有答案