Serveur d'impression

Imprimer ZPL sur l'imprimante Zebra via C # .NET – Bien choisir son serveur d impression

Par Titanfall , le 12 mars 2020 - 7 minutes de lecture

je développe un websockt pour ce cas ZPLwebSocket

  1. Téléchargez le fichier et décompressez.
  2. Exécutez SetUp.exe sur le PC client.
  3. Accédez aux services et lancez «Servicio de Impresion desde Navegador»
  4. ouvrez trysocket.html avec GoogleChrome ou mozilla
  5. écrire le nom de l'imprimante locale
  6. cliquez sur le bouton 'enviar'
  7. afficher les messages du serveur

    c'est le code javascript sur la page.

    $ (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', fonction (événement) 
        reader.readAsText (event.data);
      );
    
      reader.addEventListener ('loadend', (e) => 
        const text = e.srcElement.result;
        console.log (texte);
        $ (". serverResponse"). val (texte);
      );
    
    );
    

c'est le code de socket c # pour exécuter sur ConsoleApp:

Programme de cours
{

    serveur statique statique Server.WebsocketServer websocketServer;
    System.Diagnostics.EventLog statique statique eventLog1 = new EventLog ();
    static void Main (chaîne[] args)
    
        if (! System.Diagnostics.EventLog.SourceExists ("MySource"))
        
            System.Diagnostics.EventLog.CreateEventSource (
                "MySource", "MyNewLog");
        

        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";


        websocketServer = nouveau Server.WebsocketServer ();
        websocketServer.LogMessage + = WebsocketServer_LogMessage;

        websocketServer.Start ("http: // localhost: 2645 / tryservice /");

        Console.Read ();
    



    void privé statique WebsocketServer_LogMessage (expéditeur d'objet, Server.WebsocketServer.LogMessageEventArgs e)
    
        // eventLog1.WriteEntry (e.Message);
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine (e.Message);
        Console.ForegroundColor = ConsoleColor.White;
    
classe publique WebsocketServer
{
    événement public OnLogMessage LogMessage;
    délégué public void OnLogMessage (expéditeur d'objet, LogMessageEventArgs e);
    Classe public class LogMessageEventArgs: EventArgs
    
        chaîne publique Message get; ensemble; 
        public LogMessageEventArgs (chaîne Message) 
            this.Message = Message;
        
    

    bool public commencé = faux;
    async public void Start (chaîne httpListenerPrefix)
    
        HttpListener httpListener = new HttpListener ();
        httpListener.Prefixes.Add (httpListenerPrefix);
        httpListener.Start ();
        LogMessage (ceci, nouveau LogMessageEventArgs ("Listening ..."));
        commencé = vrai;

        pendant (commencé)
        
            HttpListenerContext httpListenerContext = attendre httpListener.GetContextAsync ();
            if (httpListenerContext.Request.IsWebSocketRequest)
            
                ProcessRequest (httpListenerContext);
            
            autre
            
                httpListenerContext.Response.StatusCode = 400;
                httpListenerContext.Response.Close ();
                LogMessage (ceci, nouveau LogMessageEventArgs ("Closed ..."));
            
        
    

    public void Stop ()
    
        commencé = faux;
    

    Liste privée _printers = nouvelle liste();
    Liste publique Imprimantes get
        
            _printers.Clear ();
            foreach (chaîne imp dans System.Drawing.Printing.PrinterSettings.InstalledPrinters)
            
                _printers.Add (imp);
            
            return _printers;
        
    

    async privé void ProcessRequest (HttpListenerContext httpListenerContext)
    {
        WebSocketContext webSocketContext = null;

        essayer
        
            webSocketContext = attendre httpListenerContext.AcceptWebSocketAsync (subProtocol: null);
            LogMessage (ceci, nouveau LogMessageEventArgs ("Connecté"));
        
        capture (exception e)
        
            httpListenerContext.Response.StatusCode = 500;
            httpListenerContext.Response.Close ();
            LogMessage (ceci, nouveau LogMessageEventArgs (String.Format ("Exception: 0", e)));
            revenir;
        

        WebSocket webSocket = webSocketContext.WebSocket;
        essayer
        {


            while (webSocket.State == WebSocketState.Open)
            {

                ArraySegment buffer = new ArraySegment(nouvel octet[8192]);

                WebSocketReceiveResult result = null;

                en utilisant (var ms = new System.IO.MemoryStream ())
                {
                    faire
                    
                        résultat = attendre webSocket.ReceiveAsync (tampon, 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(r);
                            bool valid = true;
                            octet[] toBytes = Encoding.UTF8.GetBytes ("Erreur ..."); ;

                            si (t! = null)
                            
                                if (t.Impresora.Trim () == string.Empty)
                                
                                    var printers = "";
                                    Printers.ForEach (print => 
                                        imprimantes + = imprimer + " n";
                                    );

                                    toBytes = Encoding.UTF8.GetBytes ("No se Indicó la Impresora  nLas Impresoras disponibles son:  n" + imprimantes);
                                    valide = faux;
                                
                                sinon si (! Printers.Contains (t.Impresora))
                                
                                    var printers = "";
                                    Printers.ForEach (print =>
                                    
                                        imprimantes + = imprimer + " n";
                                    );

                                    toBytes = Encoding.UTF8.GetBytes ("Impresora no valida  nLas Impresoras disponibles son:  n" + imprimantes);
                                    valide = faux;
                                


                                if (t.nombre.Trim () == string.Empty)
                                
                                    toBytes = Encoding.UTF8.GetBytes ("Aucun indicateur du nombre de documents");
                                    valide = faux;
                                
                                if (t.code == null)
                                
                                    toBytes = Encoding.UTF8.GetBytes ("Aucune donnée de foin para enviar a la Impresora");
                                    valide = faux;
                                


                                if (valide && 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 ...");
                                

                                attendre webSocket.SendAsync (nouveau ArraySegment(toBytes, 0, int.Parse (toBytes.Length.ToString ())), WebSocketMessageType.Binary, result.EndOfMessage, CancellationToken.None);


                            
                            autre
                            
                                toBytes = Encoding.UTF8.GetBytes ("Erreur ...");
                                attendre webSocket.SendAsync (nouveau ArraySegment(toBytes, 0, int.Parse (toBytes.Length.ToString ())), WebSocketMessageType.Binary, result.EndOfMessage, CancellationToken.None);
                            
                        
                    }
                }
            }
        }
        capture (exception e)
        
            LogMessage (ceci, nouveau LogMessageEventArgs (String.Format ("Exception: 0  nLinea: 1", e, e.StackTrace)));
        
        enfin
        
            if (webSocket! = null)
                webSocket.Dispose ();
        
    }


}

public class Datos 
    énumération publique TipoArchivo zpl, pdf, doc, json, text
    chaîne publique nombre get; ensemble; 
    code de chaîne publique get; ensemble; 
    public TipoArchivo Tipo get; ensemble;  = TipoArchivo.text;
    chaîne publique Impresora get; ensemble;  = "";



}

le lien RAWPrinterClass:

    Classe public class RawPrinter
    {
        // Structure et déclarations d'API:
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public class DOCINFOA
        
            [MarshalAs(UnmanagedType.LPStr)]
            chaîne publique pDocName;
            [MarshalAs(UnmanagedType.LPStr)]
            chaîne publique pOutputFile;
            [MarshalAs(UnmanagedType.LPStr)]
            chaîne publique pDataType;
        
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        externe statique externe bool OpenPrinter ([MarshalAs(UnmanagedType.LPStr)]
chaîne szPrinter, ref IntPtr hPriknter, IntPtr pd);

        [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public statique externe 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)]
        externe statique externe 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)]
        externe statique externe bool EndPagePrinter (IntPtr hPrinter);

        [DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public statique externe bool WritePrinter (IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, ref Int32 dwWritten);

        // SendBytesToPrinter ()
        // Lorsque la fonction reçoit un nom d'imprimante et un tableau non géré
        // d'octets, la fonction envoie ces octets à la file d'attente d'impression.
        // Renvoie vrai en cas de succès, faux en cas d'échec.
        bool statique public SendBytesToPrinter (chaîne szPrinterName, IntPtr pBytes, Int32 dwCount, chaîne DocName = "")
        
            Int32 dwError = 0;
            Int32 dwWritten = 0;
            IntPtr hPrinter = new IntPtr (0);
            DOCINFOA di = nouveau DOCINFOA ();
            bool bSuccess = false;
            // Supposons un échec sauf si vous réussissez spécifiquement
            di.pDocName = string.IsNullOrEmpty (DocName)? "Mon document RAW C # .NET": DocName;
            di.pDataType = "RAW";

            // Ouvrez l'imprimante.
            if (OpenPrinter (szPrinterName.Normalize (), ref hPrinter, IntPtr.Zero))
            
                // Démarrer un document.
                if (StartDocPrinter (hPrinter, 1, di))
                
                    // Démarrer une page.
                    if (StartPagePrinter (hPrinter))
                    
                        // Écrivez vos octets.
                        bSuccess = WritePrinter (hPrinter, pBytes, dwCount, ref dwWritten);
                        EndPagePrinter (hPrinter);
                    
                    EndDocPrinter (hPrinter);
                
                ClosePrinter (hPrinter);
            
            // Si vous n'avez pas réussi, GetLastError peut donner plus d'informations
            // pourquoi pas.
            if (bSuccess == false)
            
                dwError = Marshal.GetLastWin32Error ();
            
            return bSuccess;
        

        bool statique public SendFileToPrinter (chaîne szPrinterName, chaîne szFileName)
        
            // Ouvrez le fichier.
            FileStream fs = new FileStream (szFileName, FileMode.Open);
            // Créez un BinaryReader sur le fichier.
            BinaryReader br = nouveau BinaryReader (fs);
            // Dim un tableau d'octets assez grand pour contenir le contenu du fichier.
            Octet[] octets = nouvel octet[fs.Length];
            bool bSuccess = false;
            // Votre pointeur non géré.
            IntPtr pUnmanagedBytes = new IntPtr (0);
            int nLength = 0;

            nLength = Convert.ToInt32 (fs.Length);
            // Lire le contenu du fichier dans le tableau.
            bytes = br.ReadBytes (nLength);
            // Alloue de la mémoire non managée pour ces octets.
            pUnmanagedBytes = Marshal.AllocCoTaskMem (nLength);
            // Copiez le tableau d'octets gérés dans le tableau non géré.
            Marshal.Copy (octets, 0, pUnmanagedBytes, nLength);
            // Envoie les octets non gérés à l'imprimante.
            bSuccess = SendBytesToPrinter (szPrinterName, pUnmanagedBytes, nLength);
            // Libérez la mémoire non managée que vous avez allouée précédemment.
            Marshal.FreeCoTaskMem (pUnmanagedBytes);
            return bSuccess;
        
        bool statique public SendStringToPrinter (chaîne szPrinterName, chaîne szString, chaîne DocName = "")
        
            IntPtr pBytes = default (IntPtr);
            Int32 dwCount = par défaut (Int32);
            // Combien de caractères contient la chaîne?
            dwCount = szString.Length;
            // Supposons que l'imprimante attend du texte ANSI, puis convertissez
            // la chaîne en texte ANSI.
            pBytes = Marshal.StringToCoTaskMemAnsi (szString);
            // Envoie la chaîne ANSI convertie à l'imprimante.
            var t = SendBytesToPrinter (szPrinterName, pBytes, dwCount, DocName);
            Marshal.FreeCoTaskMem (pBytes);
            return t;
        
    }

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.