通过C#NET将ZPL打印到Zebra打印机

通过C#NET将ZPL打印到Zebra打印机,c#,.net,visual-studio-2017,windows-10,zebra-printers,C#,.net,Visual Studio 2017,Windows 10,Zebra Printers,我正在建设一个网站,将打印ZPL代码到斑马打印机“140XiIII”。具体内容如下: 打印机通过并行端口连接到计算机 打印机未连接到网络 网站管理员希望尽可能避免使用Javascript,而将重点放在C上 我曾尝试使用该代码,该代码声明它将在任何端口上工作。我运行了代码,没有收到任何错误,但也没有任何内容发送到打印机 我曾试图破译并使用Input32/64 DLL,尽管这比我所学的知识所能理解的要复杂得多 其他选项可能需要将打印机连接到网络,也可能已过时,并且由于不再在Windows代码中

我正在建设一个网站,将打印ZPL代码到斑马打印机“140XiIII”。具体内容如下:

  • 打印机通过并行端口连接到计算机

  • 打印机未连接到网络

  • 网站管理员希望尽可能避免使用Javascript,而将重点放在C上

  • 我曾尝试使用该代码,该代码声明它将在任何端口上工作。我运行了代码,没有收到任何错误,但也没有任何内容发送到打印机

    我曾试图破译并使用Input32/64 DLL,尽管这比我所学的知识所能理解的要复杂得多

    其他选项可能需要将打印机连接到网络,也可能已过时,并且由于不再在Windows代码中而不再是选项


    谢谢。

    我建议尝试以下方法:

    • 最好以服务设置为运行的用户身份登录服务器
    • 确保Zebra打印机作为本地打印机安装,并且打印机名称正确
    • 从打印机属性打印测试页
    • 手动打印ZPL:
    net使用lpt1“打印机共享名”
    打印“C:\Users\serviceuser\desktop\label.txt”


    如果您尝试上面的方法并成功,我会惊讶于您链接的代码不起作用。

    我为这种情况开发了一个WebSock

  • 下载文件并解压缩
  • 在客户端PC上运行SetUp.exe
  • 转到“服务”并启动“纳维加多印象服务”
  • 用谷歌浏览器或mozilla打开trysocket.html
  • 写下本地打印机的名称
  • 点击“enviar”按钮
  • 显示服务器的消息

    这是第页的javascriptcode

    $(document).ready(function () {  var connection = new WebSocket('ws://localhost:2645/service/');  const reader = new FileReader();
    
      $('.sendZPL').on('click', function () {
    
        var tosend = {
          TipoArchivo: 0,
          nombre: "Etiqueta de Prueba",
          code: $(".sendZPL").val(),
          Tipo: 4,
          Impresora: $(".impresora").val()
        }
        connection.send(JSON.stringify(tosend));
      });
    
      connection.addEventListener('message', function (event) {
        reader.readAsText(event.data);
      });
    
      reader.addEventListener('loadend', (e) => {
        const text = e.srcElement.result;
        console.log(text);
        $(".serverResponse").val(text);
      });
    
    });
    
  • 这是ConsoleApp上运行的套接字代码c#:

    class Program
    {
    
        private static Server.WebsocketServer websocketServer;
        private static System.Diagnostics.EventLog eventLog1= new EventLog();
        static void Main( string[] args )
        {
            if (!System.Diagnostics.EventLog.SourceExists( "MySource" ))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog" );
            }
    
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
    
    
            websocketServer = new Server.WebsocketServer();
            websocketServer.LogMessage += WebsocketServer_LogMessage; 
    
            websocketServer.Start( "http://localhost:2645/tryservice/" );
    
            Console.Read();
        }
    
    
    
        private static void WebsocketServer_LogMessage( object sender, Server.WebsocketServer.LogMessageEventArgs e )
        {
            // eventLog1.WriteEntry( e.Message );
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine( e.Message );
            Console.ForegroundColor = ConsoleColor.White;
        }
    public  class WebsocketServer
    {
        public event OnLogMessage LogMessage;
        public delegate void OnLogMessage(Object sender, LogMessageEventArgs e);
        public class LogMessageEventArgs : EventArgs
        {
            public string Message { get; set; }
            public LogMessageEventArgs(string Message) {
                this.Message = Message;
            }
        }
    
        public bool started = false;
        public async void Start(string httpListenerPrefix)
        {
            HttpListener httpListener = new HttpListener();
            httpListener.Prefixes.Add(httpListenerPrefix);
            httpListener.Start();
            LogMessage(this, new LogMessageEventArgs("Listening..."));
            started = true;
    
            while (started)
            {
                HttpListenerContext httpListenerContext = await httpListener.GetContextAsync();
                if (httpListenerContext.Request.IsWebSocketRequest)
                {
                    ProcessRequest(httpListenerContext);
                }
                else
                {
                    httpListenerContext.Response.StatusCode = 400;
                    httpListenerContext.Response.Close();
                    LogMessage(this, new LogMessageEventArgs("Closed..."));
                }
            }
        }
    
        public void Stop()
        {
            started = false;
        }
    
        private List<string> _printers = new List<string>();
        public List<string> Printers { get
            {
                _printers.Clear();
                foreach (string imp in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                {
                    _printers.Add(imp);
                }
                return _printers;
            }
        }
    
        private async void ProcessRequest(HttpListenerContext httpListenerContext)
        {
            WebSocketContext webSocketContext = null;
    
            try
            {
                webSocketContext = await httpListenerContext.AcceptWebSocketAsync(subProtocol: null);
                LogMessage(this, new LogMessageEventArgs("Connected"));
            }
            catch (Exception e)
            {
                httpListenerContext.Response.StatusCode = 500;
                httpListenerContext.Response.Close();
                LogMessage(this, new LogMessageEventArgs(String.Format("Exception: {0}", e)));
                return;
            }
    
            WebSocket webSocket = webSocketContext.WebSocket;
            try
            {
    
    
                while (webSocket.State == WebSocketState.Open)
                {
    
                    ArraySegment<Byte> buffer = new ArraySegment<byte>(new Byte[8192]);
    
                    WebSocketReceiveResult result = null;
    
                    using (var ms = new System.IO.MemoryStream())
                    {
                        do
                        {
                            result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
                            ms.Write(buffer.Array, buffer.Offset, result.Count);
                        }
                        while (!result.EndOfMessage);
    
                        ms.Seek(0, System.IO.SeekOrigin.Begin);
    
                        if (result.MessageType == WebSocketMessageType.Text)
                        {
                            using (var reader = new System.IO.StreamReader(ms, Encoding.UTF8))
                            {
                                var r = System.Text.Encoding.UTF8.GetString(ms.ToArray());
                                var t = Newtonsoft.Json.JsonConvert.DeserializeObject<Datos>(r);
                                bool valid = true;
                                byte[] toBytes = Encoding.UTF8.GetBytes("Error..."); ;
    
                                if (t != null)
                                {
                                    if (t.Impresora.Trim() == string.Empty)
                                    {
                                        var printers = "";
                                        Printers.ForEach(print => {
                                            printers += print + "\n";
                                        });
    
                                        toBytes = Encoding.UTF8.GetBytes("No se Indicó la Impresora\nLas Impresoras disponibles son:\n" + printers);
                                        valid = false;
                                    }
                                    else if(!Printers.Contains(t.Impresora))
                                    {
                                        var printers = "";
                                        Printers.ForEach(print =>
                                        {
                                            printers += print + "\n";
                                        });
    
                                        toBytes = Encoding.UTF8.GetBytes("Impresora no valida\nLas Impresoras disponibles son:\n" + printers);
                                        valid = false;
                                    }
    
    
                                    if (t.nombre.Trim() == string.Empty)
                                    {
                                        toBytes = Encoding.UTF8.GetBytes("No se Indicó el nombre del Documento");
                                        valid = false;
                                    }
                                    if (t.code== null)
                                    {
                                        toBytes = Encoding.UTF8.GetBytes("No hay datos para enviar a la Impresora");
                                        valid = false;
                                    }
    
    
                                    if (valid && print.RawPrinter.SendStringToPrinter(t.Impresora, t.code, t.nombre))
                                    {
                                        LogMessage(this, new LogMessageEventArgs(String.Format("Enviado: {0} => {1} => {2}", t.Impresora, t.nombre, t.code)));
                                        toBytes = Encoding.UTF8.GetBytes("Correcto...");
                                    }
    
                                    await webSocket.SendAsync(new ArraySegment<byte>(toBytes, 0, int.Parse(toBytes.Length.ToString())), WebSocketMessageType.Binary, result.EndOfMessage, CancellationToken.None);
    
    
                                }
                                else
                                {
                                    toBytes = Encoding.UTF8.GetBytes("Error...");
                                    await webSocket.SendAsync(new ArraySegment<byte>(toBytes, 0, int.Parse(toBytes.Length.ToString())), WebSocketMessageType.Binary, result.EndOfMessage, CancellationToken.None);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                LogMessage(this, new LogMessageEventArgs(String.Format("Exception: {0} \nLinea:{1}", e, e.StackTrace)));
            }
            finally
            {
                if (webSocket != null)
                    webSocket.Dispose();
            }
        }
    
    
    }
    
    public class Datos {
        public enum TipoArchivo { zpl, pdf, doc, json, text}
        public string nombre { get; set; }
        public string code { get; set; }
        public TipoArchivo Tipo { get; set; } = TipoArchivo.text;
        public string Impresora { get; set; } = "";
    }
    
    
    }
    

    对于我们希望涵盖的具体情况,似乎正确的答案是,鉴于我们面临的限制,无法在我们的zebra打印机上打印。由于这台打印机没有连接到网络,我们不得不使用一个独立的桌面应用程序来完成我们需要的工作


    感谢所有协助并提供想法和想法的人。

    打印机位于客户机或主机上?对于打印,您已尝试发送ZPL代码或打印文档以了解如何向打印机发送数据?您是否检查了ZPL代码是否正确?有在线ZPL查看器,您可以在其中检查ZPL代码是否正常工作。我知道我们自己的Zebra打印机不会抱怨ZPL错误,他们只是默默地放弃了打印作业。@HansPassant我一直在尝试这些代码变体。(11)上的第一个使用了不再受支持的表单FileStream。第二个(32)是试图调用表单,这让我觉得它似乎是为webforms而不是.net设计的。第三个选项(System.IO.File.Copy(inputFilePath,printerPath);)用于共享打印机,该选项不共享,甚至不在网络上。选项4(9)目前正被硬塞进代码中进行尝试。其他选项是VB或网络打印机选项,这两个选项在这种情况下都不可行。@DirkTrilsbeek我将看看是否可以从中找出一个并进行检查。我直接从旧方法(VB6代码)中提取代码,可能会导致错误。当您说登录到服务器时,您的意思是使用承载网站的物理计算机?Zebra未连接到Web服务器,这可能是问题的一部分吗?网络共享打印机是在windows中按用户设置的。您必须登录到服务运行的帐户,然后将共享打印机安装到该帐户。此回答导致我们尝试从网页向客户端打印机发送cmd命令,但无论我们将要打印的文件放在何处,我们都无法通过网页将其打印。通过命令提示符手动插入命令进行打印将允许我们进行打印。您不清楚。命令提示符起作用了,但它是从服务器上的远程桌面发出的吗?还是客户?Web服务运行的服务器帐户是否安装了共享打印机?好的,我现在看到打印机仅在客户端可用,而在服务器上不可用。是的,使用ZPL的唯一解决方案是在客户端预加载软件。此答案无效,因为我们没有,也无法将此打印机连接到网络。打印机连接到哪里?我认为你在客户端电脑上连接了打印机,因此,打印机是客户端机器上的本地打印机,在客户端机器上安装服务在客户端机器上写下本地打印机的名称,该服务在客户端机器上运行,而不是在主机电脑上运行,这样你甚至可以在internet上打印,如果服务和打印机安装在客户机上。
     public class RawPrinter
        {
            // Structure and API declarions:
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public class DOCINFOA
            {
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDocName;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pOutputFile;
                [MarshalAs(UnmanagedType.LPStr)]
                public string pDataType;
            }
            [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)]
    string szPrinter, ref IntPtr hPriknter, IntPtr pd);
    
            [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool ClosePrinter(IntPtr hPrinter);
    
            [DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In(), MarshalAs(UnmanagedType.LPStruct)]
    DOCINFOA di);
    
            [DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndDocPrinter(IntPtr hPrinter);
    
            [DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool StartPagePrinter(IntPtr hPrinter);
    
            [DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool EndPagePrinter(IntPtr hPrinter);
    
            [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
            public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, ref Int32 dwWritten);
    
            // SendBytesToPrinter()
            // When the function is given a printer name and an unmanaged array
            // of bytes, the function sends those bytes to the print queue.
            // Returns true on success, false on failure.
            public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount, string DocName = "")
            {
                Int32 dwError = 0;
                Int32 dwWritten = 0;
                IntPtr hPrinter = new IntPtr(0);
                DOCINFOA di = new DOCINFOA();
                bool bSuccess = false;
                // Assume failure unless you specifically succeed.
                di.pDocName = string.IsNullOrEmpty(DocName) ? "My C#.NET RAW Document" : DocName;
                di.pDataType = "RAW";
    
                // Open the printer.
                if (OpenPrinter(szPrinterName.Normalize(), ref hPrinter, IntPtr.Zero))
                {
                    // Start a document.
                    if (StartDocPrinter(hPrinter, 1, di))
                    {
                        // Start a page.
                        if (StartPagePrinter(hPrinter))
                        {
                            // Write your bytes.
                            bSuccess = WritePrinter(hPrinter, pBytes, dwCount, ref dwWritten);
                            EndPagePrinter(hPrinter);
                        }
                        EndDocPrinter(hPrinter);
                    }
                    ClosePrinter(hPrinter);
                }
                // If you did not succeed, GetLastError may give more information
                // about why not.
                if (bSuccess == false)
                {
                    dwError = Marshal.GetLastWin32Error();
                }
                return bSuccess;
            }
    
            public static bool SendFileToPrinter(string szPrinterName, string szFileName)
            {
                // Open the file.
                FileStream fs = new FileStream(szFileName, FileMode.Open);
                // Create a BinaryReader on the file.
                BinaryReader br = new BinaryReader(fs);
                // Dim an array of bytes big enough to hold the file's contents.
                Byte[] bytes = new Byte[fs.Length];
                bool bSuccess = false;
                // Your unmanaged pointer.
                IntPtr pUnmanagedBytes = new IntPtr(0);
                int nLength = 0;
    
                nLength = Convert.ToInt32(fs.Length);
                // Read the contents of the file into the array.
                bytes = br.ReadBytes(nLength);
                // Allocate some unmanaged memory for those bytes.
                pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
                // Copy the managed byte array into the unmanaged array.
                Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
                // Send the unmanaged bytes to the printer.
                bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
                // Free the unmanaged memory that you allocated earlier.
                Marshal.FreeCoTaskMem(pUnmanagedBytes);
                return bSuccess;
            }
            public static bool SendStringToPrinter(string szPrinterName, string szString, string DocName = "")
            {
                IntPtr pBytes = default(IntPtr);
                Int32 dwCount = default(Int32);
                // How many characters are in the string?
                dwCount = szString.Length;
                // Assume that the printer is expecting ANSI text, and then convert
                // the string to ANSI text.
                pBytes = Marshal.StringToCoTaskMemAnsi(szString);
                // Send the converted ANSI string to the printer.
                var t= SendBytesToPrinter(szPrinterName, pBytes, dwCount, DocName);
                Marshal.FreeCoTaskMem(pBytes);
                return t;
            }
        }