簡(jiǎn)介:
B/S應(yīng)用系統(tǒng)的打印一直以來(lái)都是一個(gè)難題,以前常規(guī)的思路是通過(guò)在瀏覽器中安裝ActiveX插件以獲得直接驅(qū)動(dòng)打印機(jī)的能力。
隨著瀏覽器的發(fā)展,越來(lái)越多的瀏覽器廠商禁止安裝ActiveX,以避免因ActiveX組件導(dǎo)致的各種安全問(wèn)題。
本打印系統(tǒng)是web客戶端打印,不需要在瀏覽器安裝任何插件,使用socket通信,跨網(wǎng)段,云打印(不限外網(wǎng),不只是局域網(wǎng)打印哦,外網(wǎng)也可以),打印過(guò)程不會(huì)有彈窗,基于asp.net mvc,層次結(jié)構(gòu)清楚,可在源碼基礎(chǔ)上進(jìn)行擴(kuò)展。
可同時(shí)打印多張標(biāo)簽,完美解決中文打印問(wèn)題(有些打印機(jī)沒有中文字庫(kù)),方便快捷修改打印字體和大?。ㄖ形乃误w ,楷體,黑體,日文,韓文)。
本系統(tǒng)適用于工業(yè)商業(yè)活動(dòng)中,web端的條碼的生成及打印。
關(guān)鍵詞:
斑馬,條碼打印,zpl中文打印,客戶端打印,bs打印,web打印,asp.net,mvc,C#
提綱:
1.打印效果
2.項(xiàng)目結(jié)構(gòu)
3.關(guān)鍵代碼
4.總結(jié)
1.打印效果
直接上圖:


2.項(xiàng)目結(jié)構(gòu)
標(biāo)準(zhǔn)的MVC結(jié)構(gòu)
有條碼打印和zpl命令打印示例

3.關(guān)鍵代碼

<script type="text/javascript">
var ws = null;
var commands = "";
$(function () {
if ("WebSocket" in window) {
ws = new WebSocket("ws://localhost:45000");//打印服務(wù)的端口,打印前請(qǐng)開啟打印服務(wù)
//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("已關(guān)閉") > 0:
var bb = received_msg;
break;
case received_msg.indexOf("已打印") > 0:
var cc = received_msg;
//SavePrintData();dosomething
break;
default:
alert("打印服務(wù)未開啟或打印機(jī)通訊中斷", -1);
break;
}
};
ws.onclose = function () {
alert("打印服務(wù)已關(guān)閉,請(qǐng)開啟打印服務(wù)并重新打開該頁(yè)面", -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) {
//獲取到最終的打印命令,通過(guò)socket傳給window服務(wù)(專門的打印服務(wù),提供源碼,可修改,可自定義)
ws.send(commands);
}
else {
alert("未連接打印服務(wù)")
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");//監(jiān)聽本地 45000端口
server.Start(socket =>
{
socket.OnOpen = () =>
{
socket.Send("socket通訊已連接");
};
socket.OnClose = () =>
{
socket.Send("socket通訊已關(guān)閉");
socket.Close();
};
socket.OnMessage = message =>
{
if (message.Contains("print_"))//打印命令前加了前綴
{
string zpl = message.Replace("print_", "");
Log("ZPL", zpl);//在D盤會(huì)生成打印日志
Print(zpl);//打印方法(該系統(tǒng)使用的是usb打印通訊,如果是網(wǎng)口打印機(jī),操作會(huì)更簡(jiǎn)單)
socket.Send("命令已打印");//打印完成,給客戶端發(fā)信息
}
};
});
}
catch (Exception ex)
{
Log("開始異常", ex.Message);
}
}
private static PrintDocument fPrintDocument = new PrintDocument();
//獲取本機(jī)zpl打印機(jī)名稱
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("打印錯(cuò)誤異常信息", ex.Message);
}
}
客戶端安裝打印服務(wù):

當(dāng)zpl命令傳送到打印機(jī)時(shí),查看打印機(jī)正在做什么,此時(shí)可以看到打印機(jī)里有打印命令,這時(shí)斑馬打印機(jī)應(yīng)該已經(jīng)打印出了標(biāo)簽。

4.總結(jié)
項(xiàng)目源碼及開發(fā)請(qǐng)聯(lián)系qq:1596917093
項(xiàng)目源碼:(解壓密碼為 上面的QQ號(hào))
https://download.csdn.net/download/maxwell315/11143646
源碼結(jié)構(gòu)非常簡(jiǎn)單,可嵌入到客戶的系統(tǒng)中,該項(xiàng)目可以勝任簡(jiǎn)單的條碼生成及打印,復(fù)雜功能可以在此基礎(chǔ)上擴(kuò)展。本項(xiàng)目也算是提供了一套完整解決思路。
由于個(gè)人水平有限,難免會(huì)出現(xiàn)紕漏,歡迎指正