На данный момент у нас есть около 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и разрешение «Печать» предоставляется каждому.
Любая помощь очень ценится и крайне необходима.