2012-06-10 38 views
27

ウェブページからバーコードをZebraプリンタに印刷しようとしています。ウェブページからZebraプリンタにバーコードを印刷

おそらくウェブフォントを使用してプリンタの独自のフォントを使用して印刷する方法があるのでしょうか、または使用するフォント名が分かっているのでしょうか?

私は、基本的にバーコードを含む画像を生成するphpバーコードジェネレータを使用しようとしています。私は実際に成功していないこの数日間、このアプローチを実際に試みてきました。

問題は、スキャナで読み取れない場合があります。画像の解像度をプリンタの解像度(203dpi)に合わせて変更しようとしましたが、画像のサイズとフォーマットで再生しようとしましたが、印刷後のバーコードはスキャンできません。

だから誰もこの経験がありますか?

プリンタ:ゼブラTLP 2844

ページごとに必要なバーコード:水平

  • 01 Code39の(非常に特定のサイズと、ブラウザで印刷した場合にのみスキャン可能)
  • 01 Code128の垂直(まだできませんそれが仕事に取り掛かる、印刷は常に非常にぼやけて、スキャンされません)

===========

私は少し進歩しました。私はこのプリンタがEPL2言語をサポートしていることを知ったので、バーコードを印刷するために使っています。

まず、パススルーモードを有効にする必要がありました。プリンタオプション>詳細設定>その他で行いました。 Dを、このコマンドを使用して::

は今、私は完璧にプリンタの内蔵フォントを使用してバーコードを印刷することができるよ

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

メモ帳から印刷することはできますが、まだブラウザから印刷することはできません.LFがCR + LFに置き換えられていると考えられます。

この問題を解決するにはどうすればよいですか?

===========

私は実際に印刷しようとしているラベルはきれいにそれをフォーマットする一部のHTMLテーブルで、バーコードの前のテキストのビットを持っています。だから私はこれを最初に印刷する必要があります、そして、真ん中にはすてきなラベルをつけて、さらにテキストを追加する必要があります。

純粋なEPL2を使用して全体を印刷することはできません。目標を達成するためにhtml + EPL2 + htmlの両方を使用できるかどうか、それは許可されていませんか? =/

+0

下記の有望な回答があるようです。 HTML書式とZPLを組み合わせることはできません。 ZPLでラベルの書式設定全体を行う必要があります。ボックスやテキストやものにはたくさんのオプションがあるので、実行可能です。 – EdHayes3

答えて

18

あなたは、いくつかの障害物に実行されている:OSは、プリンタドライバをインストールして使用すると、印刷すると、プリンタドライバは、それに送信されたデータを取得し、(再)ラスタライズしようとしている

1)または出力デバイス(Zebraプリンタ)用にスケールします。プリンタは203dpiで比較的低い解像度であるため、印刷ドライバがバーコードの品質においていくらかの完全性を失うために必要とするスケーリングのためにそれほど多くの時間を要しません。このため、ダイレクトZPLコマンドを使用して生成されたバーコードは、多くの場合、という信頼性があります。

2)Webブラウザがクライアントコンピュータへのアクセスを許可しないことによって意図的に提供するセキュリティのため、クライアントに接続されたプリンタと直接通信することはできません。このサンドボックスは、不正なWebサイトがクライアントマシンにファイルを書き込んだり、プリンタなどのデバイスに直接出力を送信したりすることができないように、マルウェアからユーザーを保護するのに役立ちます。したがって、ZPLコマンドをブラウザ経由でクライアントに接続されたプリンタに直接送信することはできません。

しかし、あなたが説明することを行う方法があります。必要な手順は、通常、Zebraプリンタに印刷しようとしているサイトにアクセスしているクライアントコンピュータをある程度制御できる場合にのみ役立ちます。たとえば、これは、会社のネットワーク上のマシン、または作成する必要がある小さなアプリケーションをインストールしたいクライアントによってのみ使用されます。これを行うには、次の手順を参照する必要があります。

A)独自のカスタムMIMEタイプを作成する必要があります。これは、基本的には、使用したい任意の名前で、registered MIME typesと衝突することはありません。

B)次に、カスタムMIMEタイプにマップするファイル拡張子を定義します。これを行うには、定義する新しいMIMEタイプと、これらのタイプのファイルに使用されるファイル拡張子を許可するために、Webサーバー(使用するWebサーバーによって異なります)を構成する必要があります。

C)次に、Webアプリケーションで、ZPLデータを出力する場合は、新しいMIMEタイプにマップされたファイル名拡張子を使用してファイルに書き込みます。その後、ファイルが生成されたら、HTMLリンクを提供するか、クライアントブラウザをファイルにリダイレクトすることができます。この時点で、作成したファイルを手動で元のプリンタポ​​ートに手動でコピーすることで、ファイルが正しく動作しているかどうかをテストできます。

D)次に、クライアントにインストールできる小さなアプリケーションを作成する必要があります。アプリケーションがインストールされると、カスタムMIMEタイプの有効なアプリケーションとして自身を登録する必要があります。ブラウザが、指定されたMIMEタイプのファイルにインストールされたアプリケーションが存在することを検出すると、そのファイルをクライアントマシンの一時ディレクトリに書き込んだ後、一時ファイルを持つ同じ登録MIMEタイプのアプリケーションを起動しようとします。アプリケーションへのパラメータ。したがって、あなたのアプリケーションは、ブラウザが渡したファイルを読み込み、それを直接プリンタにダンプしようとします。

これは、あなたが説明していることを達成するために必要なことの概要です。具体的な手順のいくつかは、使用しているWebサーバーの種類とクライアントマシンのOSによって異なります。しかし、これはあなたが試みていることを達成するための高レベルの概要です。

+0

プリンタオプションで有効にできるパススルーモードはどうですか? Zebraのマニュアルによると、モードが有効になっている限り、Windowsアプリケーションからパススルーにアクセスできるはずです。 – user1447134

+0

インストールされたプリントドライバがそれを許可したとしても、ブラウザは上記の1つの応答であなたができるようにすることによって依然として制約を受けます。それでも問題がなければ、エンドユーザーは依然として応答する必要のある印刷ダイアログを受け取り、正しいプリンタを選択します。悪いトレードオフではありませんが、エンドユーザーが行う必要のある余分な手順が原因で、少しでもエラーが発生する可能性があります。 – dmarietta

+0

バーコードを一度印刷するには、これを行う必要がありました。その悪夢、右のアプリケーション代わりに、ほとんどのプリンタにはAPIがあり、一部にはWeb APIがありますが、必ずしも十分にサポートされているとは限りません。 – nycynik

3

私はここで同様のものを開発しています。 webappからLP2844で印刷する必要があります。問題は、私のwebappがクラウド(Amazon EC2)のリモートサーバーにあり、プリンタが倉庫のデスクに入ることです。

私の解決策: webappは、バーコードでラベルのEPL2 codeを生成してからPubNub messageを発行します。 プリンタが接続されているコンピュータで動作する小さなC#プログラムを書きました。プログラムはメッセージを受信し、コードをプリンタに送信します。

+0

ソリューションのソースを共有してもよろしいですか?私は同じことを考えています(そしてMacクライアントも開発しています)。可能であれば、ソースをオープンしたいと思います。 –

+0

申し訳ありませんが、私はそのプロジェクトを中止し、コードの平和を約束しませんでした。 –

2

また、ZPLコマンドをテキストファイル(複数のラベルを1つのファイルにまとめることができます)を送信して、Windowsのメモ帳からファイルを開いて印刷させることもできます。唯一の注意点は、デフォルトのヘッダーとフッター(ファイル→ページ設定)を削除する必要があることです。

ユーザートレーニングは少しですが、クライアントマシンを制御できない場合は許容される可能性があります。

7

Javaアプレットを読み込むことを検討したい場合は、qz-print(以前のjzebra)は、あなたが記述しているものを正確に行い、コメントに記載されているLP2844でうまく動作します。

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

+2

Javaアプレットはクロムによってサポートされなくなりました.. – batwadi

+0

@batwadiありがとう。編集されました。 – tresf

2

私はに基づいて自分のアプリケーション上で "トレスFinocchiaro" が提案したアイデアを踏襲:

  1. ASP.NET 4.0
  2. クロム、IEXPLORER、Firefoxの
  3. をIISゼブラTLP 2844
  4. EPLプロトコル

残念ながら、jzebraは、現在のブラウザのセキュリティの問題のために、中心的に作業するためにいくつかの改善が必要です。

jzebra

Downlodのjzebdraをインストールし、distのディレクトリから、私は(例えばmydir。)ディレクトリにコピーします。

  • ウェブ
    • mydirの
      • JS
        • ..
        • deployJava.js
          • libに
        • ..
      • QZ-print.jar
      • QZ-print_jnlp.jnlp

はあなたの作成します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> 

提供されるコードは、 "jzebra_installation/dist/sample.html"に基づいています。私たちは、当社のウェブアプリのためにした何

+2

あなたが言及しているプラ​​グインの最新バージョンは、「Java Plugin」の問題(NPAPIなど)全体を迂回し、デスクトップアプリケーションとして動作します。https://github.com/qzind/tray/新しい委任署名プロセスの間、より良いASYNCのために.NETの 'PageMethods'も採用しています。 – tresf

4

1)http://www.lerup.com/printfile/

無料PRINTFILEアプリをダウンロード「PRINTFILEは、迅速かつ簡単にファイルを印刷することができますフリーウェアMS、Windowsのユーティリティプログラムです。このプログラムは、プレーンテキスト、PostScript、Encapsulated PostScript(EPS)およびバイナリ形式を認識します。このプログラムを使用すると、あなたの紙を節約し、それによっても、貴重な天然資源を節約することができます。」

を最初に、PRINTFILEを実行する高度なオプションに移動して、有効にすると 『』直接プリンタに送信します。

2)のセットアップ汎用テキストプリンタなどのWindowsでのZebraプリンタ。

2)単なるテキストEPLファイルでウェブアプリでfile.prtファイルを生成します。

3)をダブルクリックダウンロードしたファイルになります瞬時に魔法のように動作します。あなたはGUIが表示されないようにPrintFileを設定することもできます。

0

クライアント側で印刷を制御し、ページからajaxを使用してローカルホストにデータを送信するwebsocketを作成してみてください。

/// 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; } = ""; 
    } 
} 

生の印刷:

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

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> 

その後、HTMLからZPLコードを送信(テキストエリアコードで記述してください)。

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

私はゼブラサーマルプリンタにWebページからラベルを印刷するQZ Trayを使用しています。 dependencies/rsvp-3.1.0.min.jsdependencies/sha-256.min.jsqz-tray.js - QZトレイのdemo/jsフォルダに

はQZトレイアプリケーションと通信するために必要な3つのJavaScriptファイルがあります。次のように

は、プロジェクト内のこれらのJavaScriptファイルをインクルード:

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

ゼブラサーマルプリンターにラベルを印刷するための最も簡単な方法を以下に示します。

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

詳細については、How to print labels from a web page to Zebra thermal printerを参照してください。

関連する問題