商品を保管棚に置く前に、入荷した商品のラベルを印刷する必要があったときに、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>