Imprimer les codes à barres de la page Web à l'imprimante zèbre

nous essayons d'imprimer des codes à barres d'une page web vers notre imprimante Zebra.

je me demande s'il y a un moyen de les imprimer en utilisant la propre police de l'imprimante peut-être en utilisant des polices web ou si je connaissais le nom de la police utilisée?

j'ai essayé d'utiliser des générateurs de codes à barres php, qui génèrent essentiellement des images contenant le code à barres. En fait j'ai essayé cette approche pour quelques jours déjà, sans succès.

le problème est que quand je les imprime, ce n'est pas lisible par les scanners. J'ai essayé de modifier la résolution de l'image pour qu'elle corresponde à celle de l'imprimante (203dpi), j'ai aussi essayé de jouer avec la taille de l'image et les formats, mais les codes à barres après impression ne peuvent toujours pas être scannés.

Si quelqu'un a de l'expérience avec cela?

Printer: Zebra TLP 2844

Codes À Barres requis par page:

  • 01 Code39 horizontal (scannable seulement si imprimé à une taille et à un navigateur très spécifiques)
  • 01 Code128 verticale (toujours pas de travail, l'impression est toujours très floue et ne seront pas numérisés)

===========

j'ai fait un peu de progrès, j'ai découvert que cette imprimante supporte le langage EPL2, donc j'essaie de l'utiliser pour imprimer les codes à barres.

J'ai D'abord eu besoin d'activer le mode pass through, Je l'ai fait sur les options D'imprimante > Configuration avancée > divers.

maintenant je suis capable d'imprimer des codes-barres de façon impeccable en utilisant l'imprimante police intégrée: d en utilisant cette commande:

ZPL: B10,10,0,1,2,2,60,N, " TEXT-GOES-HERE" : ZPL

mais je ne peux l'imprimer qu'à partir du bloc-notes, je n'arrive toujours pas à l'imprimer à partir d'un navigateur... C'est probablement un problème que LF soit remplacé par CR+LF...

comment surmonter ce problème??

===========

l'étiquette que j'essaie d'Imprimer a en fait un peu de texte avant le code à barres, avec quelques tables html le formatant bien. J'ai donc besoin de imprimer cette première, et au milieu j'ai besoin de bâton dans une belle étiquette, puis ajouter un peu plus de texte.

donc je ne peux pas utiliser pur EPL2 pour imprimer la chose entière, je me demande si je peux utiliser une partie des deux html + EPL2 + html pour atteindre mon but ou est-ce que ce n'est pas autorisé?? = /

29
demandé sur user1447134 2012-06-10 13:21:47

8 réponses

Vous êtes en cours d'exécution dans quelques obstacles:

1) lorsque vous imprimez par l'intermédiaire du pilote d'imprimante installé sur le système D'exploitation, le pilote d'imprimante essaie de prendre les données qui lui sont envoyées et (re)rastérize ou échelle il pour le périphérique de sortie (l'imprimante Zebra). Étant donné que la résolution de l'imprimante est relativement faible à 203dpi, il n'en faut pas trop pour que le pilote d'impression doive mettre à l'échelle la qualité du code à barres. C'est pourquoi les codes à barres générés les commandes directes ZPL sont beaucoup plus fiable.

2) en raison de la sécurité que les navigateurs web fournissent intentionnellement en ne permettant pas l'accès à l'ordinateur du client, vous ne pouvez pas communiquer directement avec l'imprimante du client. Ce sandboxing est ce qui aide à protéger les utilisateurs de logiciels malveillants de sorte que les sites Web néfastes ne peuvent pas faire des choses comme écrire des fichiers à la machine client ou envoyer la sortie directement à des appareils tels que les imprimantes. Si vous n'êtes pas en mesure d'envoyer directement les commandes ZPL via le navigateur vers l'imprimante connectée au client.

cependant, il y a une façon de faire ce que vous décrivez. Les étapes nécessaires ne seront généralement utiles que si vous avez un certain degré de contrôle sur l'ordinateur client qui accède au site qui essaie d'imprimer vers les imprimantes Zebra. Par exemple, cela ne sera utilisé que par des machines sur le réseau de votre entreprise, ou par des clients qui sont prêts à installer une petite application dont vous avez besoin pour écrire. Pour ce faire, vous aurez besoin de regarder les étapes suivantes:

A) vous devez créer votre propre type MIME personnalisé. Il s'agit essentiellement de n'importe quel nom que vous voulez utiliser qui ne va pas entrer en collision avec un types MIME enregistrés.

B) ensuite, vous définirez une extension de nom de fichier qui correspondra à votre type MIME personnalisé. Pour ce faire, vous aurez généralement besoin de configurer votre serveur web (les étapes pour cela dépendent du serveur web que vous utilisez) pour autoriser le nouveau type MIME vous voulez définir et quelle extension de fichier est utilisé pour ces types de fichiers.

C) ensuite, sur votre application web, quand vous voulez sortir les données ZPL, vous les écrivez dans un fichier en utilisant une extension de nom de fichier qui est mappée à votre nouveau type MIME. Ensuite, une fois que le fichier est généré, vous pouvez soit fournir un lien HTML, ou rediriger le navigateur client vers le fichier. Vous pouvez tester si votre fichier fonctionne correctement à ce point en copiant manuellement le fichier que vous avez créé directement sur l'imprimante brute. port.

D) Ensuite, vous devez écrire une petite application qui peut être installé sur le client. Lorsque l'application est installée, vous devez lui faire enregistrer lui-même comme une application consommatrice valide pour votre type MIME personnalisé. Si un navigateur détecte qu'il y a une application installée pour un fichier du type MIME spécifié, il écrit simplement le fichier dans un répertoire temporaire sur la machine client et tente ensuite de lancer l'application du même type MIME enregistré avec le fichier temporaire comme paramètre de l'application. Ainsi, votre application ne fait que lire le fichier que le navigateur lui a transmis et tente ensuite de le transférer directement à l'imprimante.

Ceci est un aperçu de ce que vous devez faire afin d'accomplir ce que vous décrivez. Certaines des étapes spécifiques dépendront du type de serveur web que vous utilisez et de ce que sont les machines de vos clients OS. Mais c'est l'aperçu de haut niveau qui vous permettra d'accomplir ce que vous êtes tenter.

19
répondu dmarietta 2012-06-11 22:44:08

si vous envisagez de charger un applet java, qz-print (auparavant jzebra) peut faire exactement ce que vous décrivez et fonctionne bien avec le LP2844 mentionné dans les commentaires.

https://code.google.com/p/jzebra/

8
répondu Tres Finocchiaro 2014-01-26 20:27:41

Ce que nous avons fait pour notre application web :

1) Téléchargez gratuitement l'application printfile http://www.lerup.com/printfile/

"PrintFile est un logiciel libre MS Windows utility program qui vous permettra d'imprimer des fichiers rapidement et facilement. Le programme reconnaît le texte simple, PostScript, PostScript encapsulé (EPS) et les formats binaires. L'utilisation de ce programme peut vous sauver beaucoup de papier et donc aussi sauver de précieuses ressources naturelles."

quand vous courez pour la première fois PrintFile, allez dans les options avancées et activez "Envoyer à l'imprimante directement".

2) Configurer l'imprimante ZEBRA dans windows comme une imprimante de texte générique.

2) Générer un fichier.prt fichier dans l'application web qui est juste un texte simple fichier EPL.

3) un double clic sur le fichier téléchargé permet d'imprimer instantanément le code à barres. Fonctionne comme un charme. Vous pouvez même configurer PrintFile de sorte que vous ne voyez même pas une interface graphique.

4
répondu cmrichards 2015-06-12 16:37:55

je développe quelque chose de similaire ici. J'ai besoin d'imprimer dans un LP2844 de mon webapp. Le problème est que mon webapp est dans un serveur distant dans le nuage (Amazon EC2) et l'imprimante va être dans un bureau entrepôt.

ma solution: Le webapp génère le code EPL2 pour l'étiquette avec les codes à barres, puis publier un PubNub message. J'ai écrit un petit programme C# qui s'exécute sur l'ordinateur auquel l'imprimante est connectée. Le programme reçoit le message puis envoyez le code de l'imprimante.

3
répondu Mario Campa 2012-10-14 20:04:50

vous pouvez également envoyer les commandes ZPL dans un fichier texte (vous pouvez empaqueter plusieurs étiquettes dans un seul fichier) et demander à l'utilisateur d'ouvrir et d'imprimer le fichier via le bloc-notes de windows. La seule réserve est qu'ils doivent supprimer l'en-tête et le pied de page par défaut (file --> Page Setup).

C'est un peu de formation d'utilisateur, mais peut être acceptable si vous n'avez pas le contrôle sur les machines du client.

2
répondu StingyJack 2012-12-17 18:17:57

j'ai suivi l'idée proposée par "Tres Finocchiaro" sur mon application basée sur:

  1. ASP.NET 4,0
  2. IIS
  3. Chrome, IExplorer, Firefox
  4. Zebra TLP 2844
  5. EPL protocolo

Malheureusement, le jzebra nécessite certaines améliorations pour fonctionner directement en raison des problèmes de sécurité du navigateur actuel.

installation de jzebra

Télécharger jzebdra et de dist répertoire je copie dans votre répertoire (par ex. mydir):

  • web
    • mydir
      • js
        • ..
        • deployJava.js
      • lib
        • ..
      • qz-imprimer.jar
      • QZ-print_jnlp.jnlp

Créer votre impression.html

<html>
<script type="text/javascript" src="js/deployJava.js"></script>
<script type="text/javascript">
    /**
    * Optionally used to deploy multiple versions of the applet for mixed
    * environments.  Oracle uses document.write(), which puts the applet at the
    * top of the page, bumping all HTML content down.
    */
    deployQZ();

    /** NEW FUNCTION **/
    function initPrinter() {
        findPrinters();
        useDefaultPrinter();
    }

    /** NEW FUNCTION **/    
    function myalert(txt) {
        alert(txt);
    }


    /**
    * Deploys different versions of the applet depending on Java version.
    * Useful for removing warning dialogs for Java 6.  This function is optional
    * however, if used, should replace the <applet> method.  Needed to address 
    * MANIFEST.MF TrustedLibrary=true discrepency between JRE6 and JRE7.
    */
    function deployQZ() {
        var attributes = {id: "qz", code:'qz.PrintApplet.class', 
            archive:'qz-print.jar', width:1, height:1};
        var parameters = {jnlp_href: 'qz-print_jnlp.jnlp', 
            cache_option:'plugin', disable_logging:'false', 
            initial_focus:'false'};
        if (deployJava.versionCheck("1.7+") == true) {}
        else if (deployJava.versionCheck("1.6+") == true) {
            delete parameters['jnlp_href'];
        }
        deployJava.runApplet(attributes, parameters, '1.5');
    }

    /**
    * Automatically gets called when applet has loaded.
    */
    function qzReady() {
        // Setup our global qz object
        window["qz"] = document.getElementById('qz');
        var title = document.getElementById("title");
        if (qz) {
            try {
                title.innerHTML = title.innerHTML + " " + qz.getVersion();
                document.getElementById("content").style.background = "#F0F0F0";
            } catch(err) { // LiveConnect error, display a detailed meesage
                document.getElementById("content").style.background = "#F5A9A9";
                alert("ERROR:  \nThe applet did not load correctly.  Communication to the " + 
                    "applet has failed, likely caused by Java Security Settings.  \n\n" + 
                    "CAUSE:  \nJava 7 update 25 and higher block LiveConnect calls " + 
                    "once Oracle has marked that version as outdated, which " + 
                    "is likely the cause.  \n\nSOLUTION:  \n  1. Update Java to the latest " + 
                    "Java version \n          (or)\n  2. Lower the security " + 
                    "settings from the Java Control Panel.");
          }
      }
    }

    /**
    * Returns whether or not the applet is not ready to print.
    * Displays an alert if not ready.
    */
    function notReady() {
        // If applet is not loaded, display an error
        if (!isLoaded()) {
            return true;
        }
        // If a printer hasn't been selected, display a message.
        else if (!qz.getPrinter()) {
           /** CALL TO NEW FUNCTION **/
            initPrinter();
            return false;
        }
        return false;
    }

    /**
    * Returns is the applet is not loaded properly
    */
    function isLoaded() {
        if (!qz) {
            alert('Error:\n\n\tPrint plugin is NOT loaded!');
            return false;
        } else {
            try {
                if (!qz.isActive()) {
                    alert('Error:\n\n\tPrint plugin is loaded but NOT active!');
                    return false;
                }
            } catch (err) {
                alert('Error:\n\n\tPrint plugin is NOT loaded properly!');
                return false;
            }
        }
        return true;
    }

    /**
    * Automatically gets called when "qz.print()" is finished.
    */
    function qzDonePrinting() {
        // Alert error, if any
        if (qz.getException()) {
            alert('Error printing:\n\n\t' + qz.getException().getLocalizedMessage());
            qz.clearException();
            return; 
        }

        // Alert success message
        alert('Successfully sent print data to "' + qz.getPrinter() + '" queue.');
    }

    /***************************************************************************
    * Prototype function for finding the "default printer" on the system
    * Usage:
    *    qz.findPrinter();
    *    window['qzDoneFinding'] = function() { alert(qz.getPrinter()); };
    ***************************************************************************/
    function useDefaultPrinter() {
        if (isLoaded()) {
            // Searches for default printer
            qz.findPrinter();

            // Automatically gets called when "qz.findPrinter()" is finished.
            window['qzDoneFinding'] = function() {
                // Alert the printer name to user
                var printer = qz.getPrinter();
                myalert(printer !== null ? 'Default printer found: "' + printer + '"':
                    'Default printer ' + 'not found');

                // Remove reference to this function
                window['qzDoneFinding'] = null;
            };
        }
    }

    /***************************************************************************
    * Prototype function for finding the closest match to a printer name.
    * Usage:
    *    qz.findPrinter('zebra');
    *    window['qzDoneFinding'] = function() { alert(qz.getPrinter()); };
    ***************************************************************************/
    function findPrinter(name) {
        // Get printer name from input box
        var p = document.getElementById('printer');
        if (name) {
            p.value = name;
        }

        if (isLoaded()) {
            // Searches for locally installed printer with specified name
            qz.findPrinter(p.value);

            // Automatically gets called when "qz.findPrinter()" is finished.
            window['qzDoneFinding'] = function() {
                var p = document.getElementById('printer');
                var printer = qz.getPrinter();

                // Alert the printer name to user
                alert(printer !== null ? 'Printer found: "' + printer + 
                    '" after searching for "' + p.value + '"' : 'Printer "' + 
                    p.value + '" not found.');

                // Remove reference to this function
                window['qzDoneFinding'] = null;
            };
        }
    }

    /***************************************************************************
    * Prototype function for listing all printers attached to the system
    * Usage:
    *    qz.findPrinter('\{dummy_text\}');
    *    window['qzDoneFinding'] = function() { alert(qz.getPrinters()); };
    ***************************************************************************/
    function findPrinters() {
        if (isLoaded()) {
            // Searches for a locally installed printer with a bogus name
            qz.findPrinter('\{bogus_printer\}');

            // Automatically gets called when "qz.findPrinter()" is finished.
            window['qzDoneFinding'] = function() {
                // Get the CSV listing of attached printers
                var printers = qz.getPrinters().split(',');
                for (i in printers) {
                    myalert(printers[i] ? printers[i] : 'Unknown');      
                }

                // Remove reference to this function
                window['qzDoneFinding'] = null;
            };
        }
    }

    /***************************************************************************
    * Prototype function for printing raw EPL commands
    * Usage:
    *    qz.append('\nN\nA50,50,0,5,1,1,N,"Hello World!"\n');
    *    qz.print();
    ***************************************************************************/
    function print() {
        if (notReady()) { return; }

        // Send characters/raw commands to qz using "append"
        // This example is for EPL.  Please adapt to your printer language
        // Hint:  Carriage Return = \r, New Line = \n, Escape Double Quotes= \"
        qz.append('\nN\n');            
        qz.append('q609\n');
        qz.append('Q203,26\n');
        qz.append('B5,26,0,1A,3,7,152,B,"1234"\n');
        qz.append('A310,26,0,3,1,1,N,"SKU 00000 MFG 0000"\n');
        qz.append('A310,56,0,3,1,1,N,"QZ PRINT APPLET"\n');
        qz.append('A310,86,0,3,1,1,N,"TEST PRINT SUCCESSFUL"\n');
        qz.append('A310,116,0,3,1,1,N,"FROM SAMPLE.HTML"\n');
        qz.append('A310,146,0,3,1,1,N,"QZINDUSTRIES.COM"');

        // Append the rest of our commands
        qz.append('\nP1,1\n');

        // Tell the applet to print.
        qz.print();
     }

    /***************************************************************************
    * Prototype function for logging a PostScript printer's capabilites to the
    * java console to expose potentially  new applet features/enhancements. 
    * Warning, this has been known to trigger some PC firewalls
    * when it scans ports for certain printer capabilities.
    * Usage: (identical to appendImage(), but uses html2canvas for png rendering)
    *    qz.setLogPostScriptFeatures(true);
    *    qz.appendHTML("<h1>Hello world!</h1>");
    *    qz.printPS();
    ***************************************************************************/ 
    function logFeatures() {
        if (isLoaded()) {
            var logging = qz.getLogPostScriptFeatures();
            qz.setLogPostScriptFeatures(!logging);
            alert('Logging of PostScript printer capabilities to console set to "' + !logging + '"');
        }
    }

    /***************************************************************************
    ****************************************************************************
    * *                          HELPER FUNCTIONS                             **
    ****************************************************************************
    ***************************************************************************/

    function getPath() {
        var path = window.location.href;
        return path.substring(0, path.lastIndexOf("/")) + "/";
    }

    /**
    * Fixes some html formatting for printing. Only use on text, not on tags!
    * Very important!
    *   1.  HTML ignores white spaces, this fixes that
    *   2.  The right quotation mark breaks PostScript print formatting
    *   3.  The hyphen/dash autoflows and breaks formatting  
    */
    function fixHTML(html) {
        return html.replace(/ /g, "&nbsp;").replace(/’/g, "'").replace(/-/g,"&#8209;"); 
    }

    /**
    * Equivelant of VisualBasic CHR() function
    */
    function chr(i) {
        return String.fromCharCode(i);
    }

    /***************************************************************************
    * Prototype function for allowing the applet to run multiple instances.
    * IE and Firefox may benefit from this setting if using heavy AJAX to
    * rewrite the page.  Use with care;
    * Usage:
    *    qz.allowMultipleInstances(true);
    ***************************************************************************/ 
    function allowMultiple() {
      if (isLoaded()) {
        var multiple = qz.getAllowMultipleInstances();
        qz.allowMultipleInstances(!multiple);
        alert('Allowing of multiple applet instances set to "' + !multiple + '"');
      }
    }
</script>

    <input type="button" onClick="print()" />
    </body>
</html>

le code est basé sur "jzebra_installation/dist/échantillon.HTML."

2
répondu venergiac 2014-11-20 20:03:05

j'utilise QZ Tray pour imprimer des étiquettes à partir d'une page web à l'imprimante thermique Zebra.

Dans le dependencies/rsvp-3.1.0.min.js,dependencies/sha-256.min.js et qz-tray.js.

incluez ces fichiers JavaScript dans votre projet comme suit:

<script type="text/javascript" src="/lib/qz-tray/rsvp-3.1.0.min.js"></script>
<script type="text/javascript" src="/lib/qz-tray/sha-256.min.js"></script>
<script type="text/javascript" src="/lib/qz-tray/qz-tray.js"></script>

la façon la plus simple d'imprimer une étiquette sur une imprimante thermique zébrée est illustrée ci-dessous.

<script type="text/javascript">
qz.websocket.connect().then(function() {
   // Pass the printer name into the next Promise
   return qz.printers.find("zebra");
}).then(function(printer) {
   // Create a default config for the found printer
   var config = qz.configs.create(printer);

   // Raw ZPL
   var data = ['^XA^FO50,50^ADN,36,20^FDRAW ZPL EXAMPLE^FS^XZ'];

   return qz.print(config, data);
}).catch(function(e) { console.error(e); });
</script>

voir comment imprimer des étiquettes à partir d'une page web vers une imprimante thermique Zebra pour plus d'informations.

2
répondu Gyrocode.com 2018-02-28 06:23:57

essayez de créer un websocket qui contrôle l'impression côté client et envoyer des données avec ajax de la page à localhost.

/// websocket
using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;

namespace Server
{
    class Program
    {
        public static WebsocketServer ws;
        static void Main(string[] args)
        {
            ws = new Server.WebsocketServer();
            ws.LogMessage += Ws_LogMessage;
            ws.Start("http://localhost:2645/service/");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static void Ws_LogMessage(object sender, WebsocketServer.LogMessageEventArgs e)
        {
            Console.WriteLine(e.Message);
        }
    }

    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 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(""); ;

                                if (t != null)
                                {
                                    if (t.printer.Trim() == string.Empty)
                                    {
                                        var printers = "";
                                        foreach (var imp in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
                                        {
                                            printers += imp + "\n";
                                        }

                                        toBytes = Encoding.UTF8.GetBytes("No se Indicó la Impresora\nLas Impresoras disponibles son: " + printers);
                                        valid = false;
                                    }
                                    if (t.name.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.printer, t.code, t.name);
                                        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 string name { get; set; }
        public string code { get; set; }
        public string printer { get; set; } = "";
    }
}

brut d'Impression:

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.IO;

namespace print
{
    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.
            SendBytesToPrinter(szPrinterName, pBytes, dwCount, DocName);
            Marshal.FreeCoTaskMem(pBytes);
            return true;
        }
    }
}

page html:

<!DOCTYPE html>
<html>

<head>
</head>

<body ng-app="myapp">

    <div ng-controller="try as ctl">
        <input ng-model="ctl.ticket.nombre">

        <textarea ng-model="ctl.ticket.code"></textarea>

        <button ng-click="ctl.send()">Enviar</button>
    </div>


    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    <script>
        var ws = new WebSocket("ws://localhost:2645/service");
        ws.binaryType = "arraybuffer";
        ws.onopen = function () {
            console.log('connection is opened!!!');
        };

        ws.onmessage = function (evt) {
            console.log(arrayBufferToString(evt.data))

        };

        ws.onclose = function () {
            console.log("Connection is Closed...")
        };

        function arrayBufferToString(buffer) {
            var arr = new Uint8Array(buffer);
            var str = String.fromCharCode.apply(String, arr); 

           return  decodeURIComponent(escape(str));
        }
        var app = angular.module('myapp', []);
        app.controller('try', function () {
            this.ticket= {nombre:'', estado:''}

            this.send = () => {
                var toSend= JSON.stringify(this.ticket);
                ws.send(toSend);
            }
        });
    </script>
</body>

</html>

puis envoyer un code ZPL à partir de html (écrire ce code sur textarea);

^XA
^FO200,50^BY2^B3N,N,80,Y,N^FD0123456789^FS
^PQ1^XZ
0
répondu henoc salinas 2017-10-13 17:49:30