到目前为止,我们拥有一个拥有约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共享打印机,并且向所有人授予“打印”权限。
非常感谢并且迫切需要任何帮助。