簡介:
B/S應用系統的打印一直以來都是一個難題,以前常規的思路是通過在瀏覽器中安裝ActiveX插件以獲得直接驅動打印機的能力。
隨着瀏覽器的發展,越來越多的瀏覽器廠商禁止安裝ActiveX,以避免因ActiveX組件導致的各種安全問題。
本打印系統是web客戶端打印,不需要在瀏覽器安裝任何插件,使用socket通信,跨網段,雲打印(不限外網,不只是局域網打印哦,外網也可以),打印過程不會有彈窗,基於asp.net mvc,層次結構清楚,可在源碼基礎上進行擴展。
可同時打印多張標簽,完美解決中文打印問題(有些打印機沒有中文字庫),方便快捷修改打印字體和大小(中文宋體 ,楷體,黑體,日文,韓文)。
本系統適用於工業商業活動中,web端的條碼的生成及打印。
關鍵詞:
斑馬,條碼打印,zpl中文打印,客戶端打印,bs打印,web打印,asp.net,mvc,C#
提綱:
1.打印效果
2.項目結構
3.關鍵代碼
4.總結
1.打印效果
直接上圖:
2.項目結構
標准的MVC結構
有條碼打印和zpl命令打印示例
3.關鍵代碼
<script type="text/javascript">
var ws = null;
var commands = "";
$(function () {
if ("WebSocket" in window) {
ws = new WebSocket("ws://localhost:45000");//打印服務的端口,打印前請開啟打印服務
//open web socket
ws.onopen = function () {
// Web Socket is connected, send data using send()
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
switch (true) {
case received_msg.indexOf("已連接") > 0:
var aa = received_msg;
break;
case received_msg.indexOf("已關閉") > 0:
var bb = received_msg;
break;
case received_msg.indexOf("已打印") > 0:
var cc = received_msg;
//SavePrintData();dosomething
break;
default:
alert("打印服務未開啟或打印機通訊中斷", -1);
break;
}
};
ws.onclose = function () {
alert("打印服務已關閉,請開啟打印服務並重新打開該頁面", -1);
ws.close();
ws = null;
return;
};
}
else {
//不支持WebSocket
alert("瀏覽器不支持WebSocket通訊", -1);
return;
}
})
$("#printZPL").click(function () {
commands = $("#commands").val();
if (commands.length != 0) {
commands = "print_" + commands;
if (ws != null) {
//獲取到最終的打印命令,通過socket傳給window服務(專門的打印服務,提供源碼,可修改,可自定義)
ws.send(commands);
}
else {
alert("未連接打印服務")
return;
}
}
else {
alert("未輸入打印命令")
return;
}
})
</script>
主要代碼:
protected override void OnStart(string[] args)
{
try
{
printerName = DefaultPrinter();
//Fleck .net socket框架
var server = new WebSocketServer("ws://0.0.0.0:45000");//監聽本地 45000端口
server.Start(socket =>
{
socket.OnOpen = () =>
{
socket.Send("socket通訊已連接");
};
socket.OnClose = () =>
{
socket.Send("socket通訊已關閉");
socket.Close();
};
socket.OnMessage = message =>
{
if (message.Contains("print_"))//打印命令前加了前綴
{
string zpl = message.Replace("print_", "");
Log("ZPL", zpl);//在D盤會生成打印日志
Print(zpl);//打印方法(該系統使用的是usb打印通訊,如果是網口打印機,操作會更簡單)
socket.Send("命令已打印");//打印完成,給客戶端發信息
}
};
});
}
catch (Exception ex)
{
Log("開始異常", ex.Message);
}
}
private static PrintDocument fPrintDocument = new PrintDocument();
//獲取本機zpl打印機名稱
public static String DefaultPrinter()
{
string name = "";
foreach (string installedPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
if (installedPrinter.Contains("ZPL"))
{
name = installedPrinter;
break;
}
}
return name;
}
private void Print(string zpl)
{
try
{
RawPrinterHelper zpHelper = new RawPrinterHelper();
var result = zpHelper.SendStringToPrinter(printerName, zpl);
}
catch (Exception ex)
{
Log("打印錯誤異常信息", ex.Message);
}
}
客戶端安裝打印服務:
當zpl命令傳送到打印機時,查看打印機正在做什么,此時可以看到打印機里有打印命令,這時斑馬打印機應該已經打印出了標簽。
4.總結
項目源碼及開發請聯系qq:1596917093
源碼結構非常簡單,可嵌入到客戶的系統中,該項目可以勝任簡單的條碼生成及打印,復雜功能可以在此基礎上擴展。本項目也算是提供了一套完整解決思路。
由於個人水平有限,難免會出現紕漏,歡迎指正