Crystal Reports печатает на сетевой принтер - PullRequest
0 голосов
/ 26 ноября 2018

На данный момент у нас есть около 50 активных пользователей, которые используют около 20 принтеров Zebra для печати этикеток.Чтобы не нужно было устанавливать, настраивать и делать все вручную для каждого пользователя и принтера, я создал сервер печати на Windows Server 2012 R2, установил все принтеры и поделился ими через GPO.

Пока все хорошо,все принтеры отображаются в Панели управления, в PowerShell Get-Printer перечислены все из них, обычная печать через Viewer работает как положено.

Теперь мы используем ручные устройства 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}");
    }

throws "Указанный принтер не найден. Он может быть недоступен в текущем контексте безопасности«.(следовательно, я попробовал олицетворение)

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и разрешение «Печать» предоставляется каждому.

Любая помощь очень ценится и крайне необходима.

...