3

ゼブラ プリンター (LP2824) でラベルに印刷したい upc 番号を含む mysql データベースがあります。これらの番号をラベル プリンターに直接送信できるようにしたいと考えています。ラベル プリンターは、ユーザーにプロンプ​​トが表示されることなく、デフォルトのプリンターではありません。

私が知る限り、これを実現するにはある種の ActiveX コントロールが必要なため、IE が唯一の選択肢です。meadroid.com で ScriptX を使用した直接印刷の例を見つけましたが、ライセンス料を支払うつもりはありません。また、VBScript を使用して、ユーザーにプロンプ​​トを表示せずにページを既定のプリンターに送信する例も見つけました。それに関する私の問題は、IE にあるデフォルトのヘッダーとフッターを削除する方法がわからず、使用するプリンターを選択できないことです。

私の質問は:

MeadCo の ScriptX に似た Javascript を介してライセンスなしで使用できる ActiveX コントロールはありますか、それとも VBScript アプローチの方が優れているでしょうか。その場合、ヘッダーとフッターを削除して、ラベル プリンターに印刷するデフォルトで設定されていませんか?一連のコマンドを直接プリンターに送信できる機能が理想的です。

これが私がこれまでに持っているテストコードです:

<head>
<script language='VBScript'>
Sub Print()
       OLECMDID_PRINT = 6
       OLECMDEXECOPT_DONTPROMPTUSER = 2
       OLECMDEXECOPT_PROMPTUSER = 1
       call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
End Sub
document.write "<object ID='WB' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>"
</script>

</head>

<body>
Helo!!!
<a href="javascript:window.print();">Print</a>

</body>
4

1 に答える 1

9

商品を保管棚に置く前に、入荷した商品のラベルを印刷する必要があったときに、Web ベースの ERP システムでまさにこの問題が発生しました。最初の問題は、ラベル プリンター (Zebra TLP-2844) 用に構成した指定のラベル サイズに IE で印刷できないことでした。IE は常にデフォルトのプリンターの A4 フォーマットを使用していました。「通常の方法」で印刷するには、Windows ベースのアプリケーション (プリンター設定をより詳細に制御できる場合) では 1 回のクリックしか必要としないこの単純なタスクのためだけに、多くの余分なクリックと設定を行う必要がありました。

私は多くの調査を行い、プリンター設定を詳細に制御できる ActiveX コントロールをいくつか見つけましたが、最終的には通常の印刷方法では不必要なクリック数が発生するため、顧客はそれを非常にシンプルでスーパーなものにしたいと考えていました。速い。

以前、ラベル プリンターを使用してアプリケーションを開発した経験があるので、使用できるプリンターの内部プリンター言語を知っていました。Zebra プリンタでは、EPL/ZPL と呼ばれます。これは、パラレル ポート、シリアル ポート、USB、または 10/100 イーサネットなど、プリンタが提供する任意のインターフェイスを介して使用できる単純なテキスト ベースのプロトコルです。以前にシリアル ポート インターフェイスを使用したことがありますが、このプロジェクトでは、インターネット経由で、ファイアウォールを介して、顧客のオフィスのローカル ネットワークに接続された Zebra プリンタに印刷できる必要がありました。いくつかの調査の後、これは実際には非常に簡単であることが判明し、顧客にとって本当に優れたソリューションになりました.

基本的な EPL 言語には限界がありますが、多くの場合、テキストやバーコードなどを含む非常に単純な印刷物が必要です。5 つのサイズの固定幅の標準フォントに制限されています。フォントの幅と高さを元のサイズの倍数に設定することができます。写真や特定のレイアウト、フォント、サイズなどを含むより高度な印刷が必要な場合は、特別なラベル デザイン アプリケーションでテンプレートを作成することで実行できます。テンプレートには、テンプレートを呼び出すときに使用できる変数を含めることができます。

私の小さな例を完全に理解し、詳細については、EPL Programmers マニュアルをダウンロードすることをお勧めします。コマンドを受け入れることができるようにプリンターを構成する必要がある場合もあります。手順はマニュアルに記載されているはずです。

以下に、ASP.NET 2.0 (C#) の簡単な例を示します。最初にテスト用のコンソール アプリケーションを作成したので、コメント アウトしたエラー処理がいくつかあります。この例は、完全に機能する顧客ソリューションに基づいていますが、例をより理解しやすくするために一部を除外して書き直しました。基本的な機能をテストし、返された文字列は問題ないようですが、現時点では Zebra プリンターにアクセスできないため、印刷をテストしていません。そのため、予期しないバグに注意してください。:)しかし、それは大丈夫です。

幸運を!

資力:

Zebra - リソース ライブラリ

注: EPL Programmers Manual をダウンロードするには、登録が必要です。

コード例:

<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Text" %>
<%@ Import Namespace = "System.Net.Sockets" %>
<%@ Import Namespace = "System.IO" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script language="C#" runat="server">
    public String strPrintOutput;

    void Page_Load(Object sender,EventArgs e)
    {
        // Build output string - Example - Printer Settings
        //strPrintOutput = BuildString1();

        // Build output string - Example - Print Label with Barcode and some text (Prints two labels)
        strPrintOutput = BuildString2("123456", "2010-01-02", "1234567890", "123", "Harddrive", "D31", "123456", "2");

        // Print output to HTML-page
        txtPrintout.Text = strPrintOutput;

        // Send output to Zebra Printer
        // xxx.xxx.xxx.xxx = The IP of the Zebra printer
        // 9100 = The default printer port, but that could be changed on the printer
        // For external access (e.g. through the internet) you need to use the IP/domain name of the router/firewall and also open a port in the firewall and forward the traffic to the internal IP and port set on the printer
        // Note that for external access appropriate security measures should be added in some way.
        Connect("xxx.xxx.xxx.xxx", 9100, strPrintOutput);
    }

  public void Connect(String ip, Int32 port, String strMessage)
  {
    try
    {
      // Convert String to Byte Array with encoding Windows-1252
      //Byte[] data = System.Text.Encoding.ASCII.GetBytes(strMessage);
      Byte[] data = System.Text.Encoding.GetEncoding(1252).GetBytes(strMessage);

      // Create connection to printer
      TcpClient printer = new TcpClient(ip, port);

      // Get stream object of printer
      NetworkStream strm = printer.GetStream();

      // Write message to stream
      strm.Write(data, 0, data.Length);

      // Status Message
      //Console.WriteLine("Sent: {0}", strMessage);

      // Close stream
      strm.Close();

      //Close connection to printer
      printer.Close();

    } // end try

    catch (ArgumentNullException e)
    {
        //Console.WriteLine("ArgumentNullException: {0}", e);
    }

    catch (SocketException e)
    {
        //Console.WriteLine("SocketException: {0}", e);
    }

    //Console.WriteLine("\n Press Enter to continue...");
    //Console.Read();
  }

  /*
   * \n = LF (Line Feed)
   * \r = CR (Carriage Return)
   * \r\n = CrLf
   * Printer ignores CR when sent
   * CR cannot be used in place of LF
  */
  public String BuildString1()
  {
    StringBuilder sb = new StringBuilder();

    //Clears out printer buffer
    sb.Append("\n");

        //Print the current printer configuration
    sb.Append("U\n");

    return sb.ToString();
  }

  public String BuildString2(String strBarCode, String strDate, String strArticleNumber, String strPurchaseOrderNumber, String strArticleName, String strLocation, String strOrderNumber, String strNoOfLabels)
  {
    StringBuilder sb = new StringBuilder();

    //Clears out printer buffer
    sb.Append("\n");

    //Clears out the image buffer
    sb.Append("N\n");

    //Set 8-bit, CodePage Windows 1252 (Latin 1), KDU Sweden (Printer with display)
    sb.Append("I8,A,046\n");

        // Create Print Objects
    sb.Append("B35,5,0,3C,3,6,60,N,\"" + strBarCode + "\"\n");
    sb.Append("A35,75,0,3,1,1,N,\"Article No:\"\n");
    sb.Append("A35,100,0,3,1,1,N,\"Article Name:\"\n");
    sb.Append("A35,125,0,3,1,1,N,\"Location:\"\n");
    sb.Append("A35,150,0,3,1,1,N,\"Order:\"\n");

    sb.Append("A205,75,0,3,1,1,N,\"" + strArticleNumber + "\"\n");
    sb.Append("A205,100,0,3,1,1,N,\"" + strArticleName + "\"\n");
    sb.Append("A205,125,0,3,1,1,N,\"" + strLocation + "\"\n");
    sb.Append("A205,150,0,3,1,1,N,\"" + strOrderNumber + "\"\n");

    sb.Append("A432,49,0,3,1,1,N,\"" + strDate + "\"\n");
    sb.Append("A530,75,0,3,1,1,N,\"" + strPurchaseOrderNumber + "\"\n");
    sb.Append("P" + strNoOfLabels + "\nN\n\n");

    return sb.ToString();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Print to Zebra Label Printer</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:Panel runat="server">
        <asp:TextBox id="txtPrintout" TextMode="MultiLine" runat="server" BackColor="LightBlue" Width="100%" Height="800px"></asp:TextBox>
      </asp:Panel>
    </form>
</body>
</html>
于 2010-01-03T03:14:56.270 に答える