B/S WEB端條碼打印系統 斑馬條碼打印解決方案


簡介:

B/S應用系統的打印一直以來都是一個難題,以前常規的思路是通過在瀏覽器中安裝ActiveX插件以獲得直接驅動打印機的能力。
隨着瀏覽器的發展,越來越多的瀏覽器廠商禁止安裝ActiveX,以避免因ActiveX組件導致的各種安全問題。
本打印系統是web客戶端打印,不需要在瀏覽器安裝任何插件,使用socket通信,跨網段,雲打印(不限外網,不只是局域網打印哦,外網也可以),打印過程不會有彈窗,基於asp.net mvc,層次結構清楚,可在源碼基礎上進行擴展。
可同時打印多張標簽,完美解決中文打印問題(有些打印機沒有中文字庫),方便快捷修改打印字體和大小(中文宋體 ,楷體,黑體,日文,韓文)。
本系統適用於工業商業活動中,web端的條碼的生成及打印。

關鍵詞:

斑馬,條碼打印,zpl中文打印,客戶端打印,bs打印,web打印,asp.net,mvc,C#

提綱:

1.打印效果
2.項目結構
3.關鍵代碼
4.總結

1.打印效果

直接上圖:
條碼效果.jpg
條碼效果.jpg

2.項目結構

標准的MVC結構
有條碼打印和zpl命令打印示例
image.png

3.關鍵代碼

客戶端socket通信.png

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

客戶端Windows服務監聽socket通信.png

主要代碼:

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

客戶端安裝打印服務:
客戶端安裝windows打印服務.png
當zpl命令傳送到打印機時,查看打印機正在做什么,此時可以看到打印機里有打印命令,這時斑馬打印機應該已經打印出了標簽。
zpl命令已經傳送到打印機.png

4.總結

項目源碼及開發請聯系qq:1596917093

源碼結構非常簡單,可嵌入到客戶的系統中,該項目可以勝任簡單的條碼生成及打印,復雜功能可以在此基礎上擴展。本項目也算是提供了一套完整解決思路。
由於個人水平有限,難免會出現紕漏,歡迎指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM