2012-06-10 47 views
27

Staramy się drukować kody kreskowe ze strony internetowej na naszej drukarce Zebra.Drukowanie kodów kreskowych ze strony internetowej na drukarce Zebra

Zastanawiam się, czy istnieje sposób na wydrukowanie ich przy użyciu własnej czcionki drukarki, np. Przy użyciu czcionek internetowych lub gdybym znał nazwę czcionki?

Próbowałem użyć generatorów kodu kreskowego php, które zasadniczo generują obrazy zawierające kod kreskowy. W rzeczywistości próbowałem tego podejścia już od kilku dni, bez powodzenia.

Problem polega na tym, że je wydrukuję, którego nie można odczytać przez skanery. Próbowałem zmienić rozdzielczość obrazu, aby dopasować ją do rozdzielczości drukarki (203dpi), próbowałem także odtwarzać z rozmiarem i formatami obrazu, ale kody kreskowe po wydrukowaniu nadal nie mogą być skanowane.

Czy ktoś ma z tym doświadczenie?

drukarki: Zebra TLP 2844

kreskowe wymagane na stronie:

  • 01 Code39 poziomej (scanable tylko jeśli drukowane w bardzo określonym rozmiarze i przeglądarki)
  • 01 Code128 pionowej (wciąż nie mogę zmusić go do pracy, druk jest zawsze bardzo rozmyte i nie zostaną zeskanowane)

===========

Zrobiłem mały postęp, dowiedziałem się, że ta drukarka obsługuje język EPL2, więc próbuję użyć jej do wydrukowania kodów kreskowych.

Najpierw musiałem włączyć tryb przejściowy, zrobiłem to w Opcje drukarki> Konfiguracja zaawansowana> Różne.

Teraz jestem w stanie drukować kody kreskowe nienagannie pomocą wbudowanego czcionki drukarki: D poleceniem:

ZPL: B10,10,0,1,2,2,60, N” TEKST-GO-TUTAJ " : ZPL

Ale mogę go wydrukować tylko z Notatnika, nadal nie mogę wydrukować tego z przeglądarki ... To prawdopodobnie problem z zastąpieniem LF przez CR + LF ..

Jak przezwyciężyć ten problem?

===========

Etykieta Próbuję wydrukować faktycznie ma trochę tekstu przed kodem kreskowym, z niektórych tabel HTML formatowania go ładnie. Dlatego najpierw muszę to wydrukować, a na środku muszę umieścić fajną etykietę, a następnie dodać trochę tekstu.

Więc nie mogę użyć czystego EPL2, aby wydrukować całość, zastanawiam się, czy mogę użyć niektórych z html + EPL2 + html, aby osiągnąć mój cel, czy jest to niedozwolone ?? =/

+0

Wygląda na to, że masz kilka obiecujących odpowiedzi poniżej. Po prostu chcę dodać, że nie można łączyć formatowania HTML z ZPL. Konieczne będzie pełne formatowanie etykiet za pomocą ZPL. Jest mnóstwo opcji na pola i tekst i rzeczy, więc jest to wykonalne. – EdHayes3

Odpowiedz

18

Używasz na kilka przeszkód:

1) W przypadku drukowania za pomocą sterownika drukarki zainstalowanego systemu operacyjnego, sterownik drukarki próbuje przejąć te dane, które są wysyłane do niego i (re) Rasteryzuj lub skaluj go dla urządzenia wyjściowego (drukarka Zebra).Ponieważ drukarka ma stosunkowo niską rozdzielczość na poziomie 203 dpi, nie wymaga ona zbyt dużo skalowania, jakie musi wykonać sterownik drukarki, aby utracić integralność jakości kodu kreskowego. Dlatego kody kreskowe generowane za pomocą bezpośrednich komend ZPL są bardziej niezawodne.

2) Ze względu na bezpieczeństwo, które przeglądarki internetowe celowo zapewniają, nie zezwalając na dostęp do komputera klienckiego, nie można bezpośrednio komunikować się z drukarką podłączoną do klienta. To piaskownica pomaga chronić użytkowników przed złośliwym oprogramowaniem, dzięki czemu nikczemne strony internetowe nie mogą robić takich rzeczy, jak zapisywanie plików na komputerze klienta lub wysyłanie wyników bezpośrednio do urządzeń takich jak drukarki. Nie możesz więc bezpośrednio wysyłać poleceń ZPL przez przeglądarkę do drukarki podłączonej do klienta.

Istnieje jednak sposób na robienie tego, co opisujesz. Konieczne kroki są zazwyczaj przydatne tylko wtedy, gdy masz pewną kontrolę nad komputerem klienckim uzyskującym dostęp do witryny, która próbuje drukować na drukarkach Zebra. Na przykład będą one używane tylko przez maszyny w sieci firmowej lub przez klientów, którzy chcą zainstalować małą aplikację, którą trzeba napisać. Aby to zrobić, musisz przejrzeć następujące kroki:

A) Musisz utworzyć własny niestandardowy typ MIME. Jest to po prostu dowolna nazwa, której chcesz użyć, która nie będzie kolidować z żadnym registered MIME types.

B) Następnie zdefiniujesz rozszerzenie pliku, które zostanie odwzorowane na Twój niestandardowy typ MIME. Aby to zrobić, zwykle musisz skonfigurować swój serwer WWW (kroki do tego zależą od tego, z jakiego serwera WWW korzystasz), aby umożliwić nowy typ MIME, który chcesz zdefiniować i jakiego rozszerzenia pliku używasz dla tego typu plików.

C) Następnie w aplikacji internetowej, gdy chcesz wyprowadzić dane ZPL, zapisz je do pliku przy użyciu rozszerzenia nazwy pliku, które jest odwzorowane na nowy typ MIME. Następnie, gdy plik zostanie wygenerowany, możesz podać mu link HTML lub przekierować przeglądarkę klienta do pliku. Możesz przetestować, czy plik działa poprawnie w tym momencie, ręcznie kopiując plik utworzony bezpośrednio do portu drukarki surowej.

D) Następnie należy napisać małą aplikację, którą można zainstalować na kliencie. Po zainstalowaniu aplikacji musisz zarejestrować ją jako prawidłową aplikację pobierającą dla niestandardowego typu MIME. Jeśli przeglądarka wykryje, że jest zainstalowana aplikacja dla pliku określonego typu MIME, po prostu zapisuje plik w tymczasowym katalogu na komputerze klienta, a następnie próbuje uruchomić aplikację o tym samym zarejestrowanym typie MIME z plikiem tymczasowym jako parametr do aplikacji. Dzięki temu aplikacja odczytuje teraz plik, który przeglądarka przesłała do niego, a następnie próbuje zrzucić go bezpośrednio do drukarki.

To jest przegląd tego, co należy zrobić, aby osiągnąć to, co opisujesz. Niektóre z określonych kroków będą zależeć od typu serwera WWW, z którego korzystasz, oraz od systemu operacyjnego, w którym znajdują się komputery Twoich klientów. Ale to jest przegląd wysokiego poziomu, który pozwoli ci osiągnąć to, co próbujesz.

+0

Co z trybem przekazywania, który można włączyć w opcjach drukarki? Zgodnie z instrukcją firmy Zebra należy mieć dostęp do przejazdu z dowolnej aplikacji systemu Windows, o ile tryb jest włączony w ustawieniach, które jest. – user1447134

+0

Nawet jeśli zainstalowany sterownik drukarki na to zezwolił, nadal jesteś ograniczony przez to, co przeglądarka pozwoli ci zrobić w # 1 mojej odpowiedzi powyżej. Jeśli to zadziała, użytkownik końcowy nadal będzie miał okno dialogowe drukowania, na które musi odpowiedzieć i wybrać odpowiednią drukarkę. Nie jest to zły interes, ale potencjalnie wciąż może być podatny na błędy ze względu na dodatkowe czynności, które musi wykonać użytkownik końcowy. – dmarietta

+0

Musieliśmy to zrobić, aby raz wydrukować kody kreskowe. To koszmar, w zamian odpowiednia aplikacja, większość drukarek ma do tego interfejsy API, niektóre mają apis internetowy, ale nie zawsze są dobrze obsługiwane. – nycynik

3

Opracowuję coś podobnego tutaj. Muszę wydrukować na LP2844 z mojego webappa. Problem polega na tym, że moja aplikacja internetowa znajduje się na zdalnym serwerze w chmurze (Amazon EC2), a drukarka znajduje się w magazynie magazynu.

Moje rozwiązanie: Aplikacja internetowa generuje EPL2 code dla etykiety z kodami kreskowymi, a następnie publikuje PubNub message. Napisałem mały program C#, który działa na komputerze, do którego podłączona jest drukarka. Program odbiera komunikat, a następnie wysyła kod do drukarki.

+0

Czy chciałbyś udostępnić źródło swojego rozwiązania?Rozglądam się za rozwijaniem tego samego (i rozwijaniem również klienta Mac) i chciałbym otworzyć go, jeśli to możliwe. –

+0

Przepraszam, porzuciłem ten projekt i nie popełniłem tego spokojnego kodu. –

2

Można również wysyłać polecenia ZPL w pliku tekstowym (można spakować wiele etykiet w jednym pliku) i mieć użytkownika otwartego i wydrukować plik za pomocą notatnika systemu Windows. Jedynym zastrzeżeniem jest to, że muszą usunąć domyślny nagłówek i stopkę (Plik -> Ustawienia strony).

To trochę szkolenie użytkowników, ale może być akceptowalne, jeśli nie masz kontroli nad komputerami klienta.

7

Jeśli rozważasz ładowanie apletu Java, qz-print (wcześniej jzebra) może zrobić dokładnie to, co opisujesz i działa dobrze z LP2844 wspomnianym w komentarzach.

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

+2

Po prostu, aby inni ludzie wiedzieli ... aplet Java nie jest już obsługiwany przez chrome .. – batwadi

+0

@batwadi thanks. Edytowane. – tresf

2

Śledziłem pomysł zaproponowany przez "Tres Finocchiaro" na mój wniosek na podstawie:

  1. ASP.NET 4.0
  2. IIS
  3. Chrome IExplorer, Firefox
  4. Zebra TLP 2844
  5. Protokół EPLo

Niestety, niektóre poprawki wymagają poprawek do pracy ze względu na problemy z aktualną przeglądarką.

Instalacja jzebra

Downlod jzebdra iz katalogu dist skopiować do katalogu (np mydir.):

  • internetowej
    • mydir
      • js
        • ..
        • deployJava.js
      • lib
        • ..
      • QZ-print.jar
      • QZ-print_jnlp.jnlp

stworzyć swój print.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> 

Podany kod bazuje na "jzebra_installation/dist/sample.html".

+2

Najnowsza wersja wtyczki, o której wspominasz, omija całe problemy z "wtyczką Java" (NPAPI, itp.) I działa jako aplikacja komputerowa https://github.com/qzind/tray/. Zatrudnia także .NET 'PageMethods' dla lepszej ASYNC podczas nowego procesu podpisania mandatu. – tresf

4

Co zrobiliśmy dla naszej aplikacji internetowej:

1) Ściągnij darmową aplikację pliku drukowanego http://www.lerup.com/printfile/

„pliku drukowanego to darmowy program narzędziowy MS Windows, który pozwoli na szybkie i łatwe drukowanie plików.Program rozpoznaje zwykły tekst, PostScript, Encapsulated PostScript (EPS) i formaty binarne. Za pomocą tego programu można zaoszczędzić dużo pracy, a przez to również oszczędność cennych zasobów naturalnych.”

Po pierwszym uruchomieniu pliku drukowanego, przejdź do zaawansowanych opcji i umożliwić«wyślij do drukarki bezpośrednio».

2) Konfiguracja drukarka Zebra w oknach jako drukarki Generic text.

2) Generowanie pliku file.prt w aplikacji internetowej, która jest po prostu plik EPL tekst zwykły.

3) Dwukrotne kliknięcie na pobrany plik natychmiast wydrukuj kod paskowy Działa jak czar. Możesz nawet ustawić PrintFile tak, aby nie było widać gui.

0

spróbuj utworzyć websocket, który kontroluje wydruk po stronie klienta i wysyła dane z ajaxem ze strony do 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; } = ""; 
    } 
} 

surowy druku:

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; 
     } 
    } 
} 

strona 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> 

następnie wysłać kod html z ZPL (piszę to na kodzie textarea);

^XA 
^FO200,50^BY2^B3N,N,80,Y,N^FD^FS 
^PQ1^XZ 
0

Używam QZ Tray do drukowania etykiet ze strony WWW do drukarki termicznej Zebra.

W folderze demo/js z QZ tacy istnieją trzy pliki JavaScript, które są wymagane do komunikowania się z QZ aplikacji Tray - dependencies/rsvp-3.1.0.min.js, dependencies/sha-256.min.js i qz-tray.js.

Dołącz te pliki JavaScript w projekcie następująco:

<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> 

Najprostszym sposobem, aby wydrukować etykietę na drukarce termicznej Zebra jest pokazany poniżej.

<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> 

Aby uzyskać więcej informacji, zobacz How to print labels from a web page to Zebra thermal printer.

Powiązane problemy