Просмотр исходного кода

后端生成ZPL指令,前端打印到zebra

sunyj 9 лет назад
Родитель
Сommit
6c13a89d8a

+ 1 - 0
src/main/java/com/uas/report/WebAppConfiguration.java

@@ -54,6 +54,7 @@ public class WebAppConfiguration extends WebMvcConfigurerAdapter {
 		registry.addViewController("/fileUpload").setViewName("fileUpload");
 		registry.addViewController("/preview").setViewName("preview");
 		registry.addViewController("/files").setViewName("files");
+		registry.addViewController("/zebra").setViewName("zebra");
 		super.addViewControllers(registry);
 	}
 

+ 39 - 0
src/main/java/com/uas/report/controller/ZebraPrintController.java

@@ -0,0 +1,39 @@
+package com.uas.report.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.uas.report.service.ZebraPrintService;
+
+@Controller
+@RequestMapping("/zebra")
+public class ZebraPrintController {
+
+	@Autowired
+	private ZebraPrintService zebraPrintService;
+
+	@RequestMapping("/generateZPL")
+	@ResponseBody
+	public List<String> generateZPL(String userName, String reportName, String whereCondition,
+			HttpServletRequest request, HttpServletResponse response) {
+		List<String> list = new ArrayList<>();
+		list.add(zebraPrintService.generateZPL(userName, reportName, whereCondition));
+		list.add(
+				"^XA^LH220,0^FO0,0^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FD4493890000170413000000^FS^FO0,80^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FDYY01001632-103^FS^XZ");
+		return list;
+	}
+
+	@RequestMapping("/noZPL")
+	@ResponseBody
+	public List<String> noZPL() {
+		return null;
+	}
+}

+ 23 - 0
src/main/java/com/uas/report/service/ZebraPrintService.java

@@ -0,0 +1,23 @@
+package com.uas.report.service;
+
+/**
+ * 斑马打印
+ * 
+ * @author sunyj
+ * @since 2017年5月12日 上午11:34:05
+ */
+public interface ZebraPrintService {
+
+	/**
+	 * 生成斑马打印机的ZPL指令
+	 * 
+	 * @param userName
+	 *            不为null;当前账套用户名
+	 * @param reportName
+	 *            不为null;需要导出的报表的名称,不带任何后缀(如导出采购单,即为"Purchase")
+	 * @param whereCondition
+	 *            可为null;where之后的条件(包括where)
+	 * @return ZPL指令
+	 */
+	public String generateZPL(String userName, String reportName, String whereCondition);
+}

+ 27 - 0
src/main/java/com/uas/report/service/impl/ZebraPrintServiceImpl.java

@@ -0,0 +1,27 @@
+package com.uas.report.service.impl;
+
+import org.springframework.stereotype.Service;
+
+import com.uas.report.service.ZebraPrintService;
+import com.uas.report.util.Fnthex;
+import com.uas.report.util.ReportConstants;
+
+/**
+ * 斑马打印
+ * 
+ * @author sunyj
+ * @since 2017年5月12日 上午11:39:46
+ */
+@Service
+public class ZebraPrintServiceImpl implements ZebraPrintService {
+
+	@Override
+	public String generateZPL(String userName, String reportName, String whereCondition) {
+		// TODO Auto-generated method stub
+		String fontHex = Fnthex.getFontHex("Øαā~Ⅱぁ☺PCB@④☆﹩㊣¥-APOS A8_PW-V1.0拼-两层-ENIG-1.2mm", 0, 55, 16,
+				ReportConstants.MICROSOFT_YAHEI_UI_FONT_NAME);
+		return "^XA^LH220,0^FO0,0^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FD4493890000170413000000^FS" + fontHex
+				+ "^FO0,80^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FDYY01001632-103^FS^XZ";
+	}
+
+}

+ 215 - 0
src/main/java/com/uas/report/util/Fnthex.java

@@ -0,0 +1,215 @@
+package com.uas.report.util;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferInt;
+
+public class Fnthex {  
+    
+    public static BufferedImage source = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);  
+    public static Graphics2D gs = source.createGraphics();  
+      
+    //  public static String getFontZpl(String content, int x, int y, int size, String fontName) {  
+    //      return String.format("^FO%d,%d^A1N,%d,%d^FD%s^FS", x, y, size, size, content);  
+    //  }  
+      
+    public static String getFontHexWithWidth(String content, int x, int y, int width,  
+            int maxHeight, String fontName) {  
+        if (content == null || "".equals(content))  
+            return "";  
+        Font f = null;  
+        width = (width + 7) / 8 * 8;  
+        int size = width / content.length();  
+        int retryFlag = 1;  
+        if (size > maxHeight) {  
+            size = maxHeight;  
+            if ("宋体".equals(fontName)) {  
+                f = new Font("simsun", Font.PLAIN, size);  
+            } else if ("黑体".equals(fontName)) {  
+                f = new Font("simhei", Font.BOLD, size);  
+            } else {  
+                f = new Font("simsun", Font.PLAIN, size);  
+            }  
+        } else {  
+            while (true) {  
+                if ("宋体".equals(fontName)) {  
+                    f = new Font("simsun", Font.PLAIN, size);  
+                } else if ("黑体".equals(fontName)) {  
+                    f = new Font("simhei", Font.BOLD, size);  
+                } else {  
+                    f = new Font("simsun", Font.PLAIN, size);  
+                }  
+                gs.setFont(f);  
+                FontMetrics fontMetrics = gs.getFontMetrics();  
+                Rectangle2D stringBounds = fontMetrics.getStringBounds(content, gs);  
+                int nw = (int) stringBounds.getWidth();  
+                  
+                if (nw > width) {  
+                    size--;  
+                    if (retryFlag == 1) {  
+                        break;  
+                    }  
+                    retryFlag = 0;  
+                      
+                } else {  
+                    if (size >= maxHeight)  
+                        break;  
+                    size++;  
+                    retryFlag = 1;  
+                }  
+            }  
+        }  
+        int height = size;  
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);  
+        Graphics2D g2 = image.createGraphics();  
+        g2.setFont(f);  
+        g2.setColor(Color.BLACK);  
+        g2.drawString(content, 1, (int) (height * 0.88));  
+          
+        g2.dispose();  
+          
+        StringBuilder zpl = new StringBuilder("^FO").append(x).append(",").append(y)  
+                .append(getImage(image)).append("^FS");  
+          
+        return zpl.toString();  
+          
+    }  
+      
+    public static String getFontHex(String content, int x, int y, int size, String fontName) {  
+        if (content == null || "".equals(content))  
+            return "";  
+        Font f = null;  
+        if (ReportConstants.MICROSOFT_YAHEI_UI_FONT_NAME.equals(fontName)) {  
+            f = new Font(ReportConstants.MICROSOFT_YAHEI_UI_FONT_NAME, Font.PLAIN, size);  
+        } else{
+            f = new Font("simsun", Font.PLAIN, size);  
+        }  
+        gs.setFont(f);  
+        FontMetrics fontMetrics = gs.getFontMetrics();  
+        Rectangle2D stringBounds = fontMetrics.getStringBounds(content, gs);  
+        int width = (int) stringBounds.getWidth();  
+        int height = size;  
+        width = (width + 7) / 8 * 8;  
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);  
+        Graphics2D g2 = image.createGraphics();  
+        g2.setFont(f);  
+        g2.setColor(Color.BLACK);  
+        g2.drawString(content, 1, (int) (height * 0.88));  
+          
+        g2.dispose();  
+          
+        StringBuilder zpl = new StringBuilder("^FO").append(x).append(",").append(y)  
+                .append(getImage(image)).append("^FS");  
+          
+        return zpl.toString();  
+          
+    }  
+      
+    private static final char[] HEX = "0123456789ABCDEF".toCharArray();  
+      
+    public static String printImage(BufferedImage image, int x, int y) {  
+        if (image.getWidth() % 8 != 0) {  
+            BufferedImage i = new BufferedImage(((image.getWidth() + 7) / 8) * 8,  
+                    image.getHeight(), BufferedImage.TYPE_INT_ARGB);  
+            Graphics2D g2 = i.createGraphics();  
+            g2.drawImage(image, null, 0, 0);  
+            g2.dispose();  
+            image = i;  
+        }  
+        StringBuilder zpl = new StringBuilder("^FO").append(x).append(",").append(y)  
+                .append(getImage(image)).append("^FS");  
+        return zpl.toString();  
+    }  
+      
+    private static String getImage(BufferedImage i) {  
+        int w = i.getWidth();  
+        int h = i.getHeight();  
+        boolean black[] = getBlackPixels(i, w, h);  
+        int hex[] = getHexValues(black);  
+          
+        String data = ints2Hex(hex);  
+          
+        int bytes = data.length() / 2;  
+        int perRow = bytes / h;  
+          
+        return "^GFA," + bytes + "," + bytes + "," + perRow + "," + data;  
+          
+    }  
+      
+  
+    private static String flipRows(String hex, int height) {  
+        String flipped = "";  
+        int width = hex.length() / height;  
+          
+        for (int i = 0; i < height; i++) {  
+            flipped += new StringBuilder(hex.substring(i * width, (i + 1) * width)).reverse()  
+                    .toString();  
+        }  
+        return flipped;  
+    }  
+      
+    /** 
+     * Returns an array of ones or zeros. boolean is used instead of int for memory considerations. 
+     *  
+     * @param o 
+     * @return 
+     */  
+    private static boolean[] getBlackPixels(BufferedImage bi, int w, int h) {  
+        int[] rgbPixels = ((DataBufferInt) bi.getRaster().getDataBuffer()).getData();  
+        int i = 0;  
+        boolean[] pixels = new boolean[rgbPixels.length];  
+        for (int rgbpixel : rgbPixels) {  
+            pixels[i++] = isBlack(rgbpixel);  
+        }  
+          
+        return pixels;  
+    }  
+      
+    private static boolean isBlack(int rgbPixel) {  
+        int a = (rgbPixel & 0xFF000000) >>> 24;  
+        if (a < 127) {  
+            return false; // assume pixels that are less opaque than the luma threshold should be considered to be white  
+        }  
+        int r = (rgbPixel & 0xFF0000) >>> 16;  
+        int g = (rgbPixel & 0xFF00) >>> 8;  
+        int b = rgbPixel & 0xFF;  
+        int luma = ((r * 299) + (g * 587) + (b * 114)) / 1000; //luma formula  
+        return luma < 127;  
+    }  
+      
+    private static int[] getHexValues(boolean[] black) {  
+        int[] hex = new int[(int) (black.length / 8)];  
+        // Convert every eight zero's to a full byte, in decimal  
+        for (int i = 0; i < hex.length; i++) {  
+            for (int k = 0; k < 8; k++) {  
+                hex[i] += (black[8 * i + k] ? 1 : 0) << 7 - k;  
+            }  
+        }  
+        return hex;  
+    }  
+      
+    public static String getHexString(byte[] b) throws Exception {  
+        String result = "";  
+        for (int i = 0; i < b.length; i++) {  
+            result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);  
+        }  
+        return result;  
+    }  
+      
+    private static String ints2Hex(int[] ints) {  
+        char[] hexChars = new char[ints.length * 2];  
+        for (int i = 0; i < ints.length; ++i) {  
+            hexChars[i * 2] = HEX[(ints[i] & 0xF0) >> 4];  
+            hexChars[i * 2 + 1] = HEX[ints[i] & 0x0F];  
+        }  
+        return new String(hexChars);  
+    }  
+      
+//    public static void main(String[] args) {  
+//        System.out.println(getFontHex("你好", 10, 50, 80, "黑体"));  
+//    }  
+}  

+ 65 - 62
src/main/webapp/WEB-INF/views/zebra.html

@@ -1,68 +1,71 @@
+<!DOCTYPE html>
 <html>
-<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
 <head>
-<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">
-<link href="bootstrap/css/bootstrap-theme.min.css" rel="stylesheet">
-<script type="text/javascript" src="js/jquery-1.11.1.min.js"></script>
-<script type="text/javascript" src="js/BrowserPrint-1.0.4.min.js"></script>
-<script type="text/javascript" src="js/DevDemo.js"></script>
-
-<script type="text/javascript">
-$(document).ready(setup_web_print);
-</script>
+<meta charset="UTF-8">
 </head>
-<body style="background-color:#D8D8D8; font-size:24px;">
+<body style="background-color: #D8D8D8; font-size: 24px;">
 	<div class="navbar navbar-inverse " role="navigation">
-    <div class="container">
-      <div class="navbar-header">
-        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
-          <span class="sr-only">Toggle navigation</span>
-          <span class="icon-bar"></span>
-          <span class="icon-bar"></span>
-          <span class="icon-bar"></span>
-        </button>
-        <a class="navbar-brand" href="#"><p style="font-size: 150%;">Zebra Browser Print Demo</p></a>
-        <script type="text/javascript">
-var OSName="Unknown OS";
-if (navigator.appVersion.indexOf("Win")!=-1) OSName="Windows";
-//{
-//OSName="Windows";
-//document.write('<a href="ZebraWebPrint.exe" class="navbar-brand" href="#">Download the '+OSName+' App</a>');
-//}
-if (navigator.appVersion.indexOf("Mac")!=-1) OSName="MacOS";
-if (navigator.appVersion.indexOf("X11")!=-1) OSName="UNIX";
-if (navigator.appVersion.indexOf("Linux")!=-1) OSName="Linux";
-
-        </script>
-			
-      </div><!-- /navbar-header -->
-    </div><!-- /container -->
-  </div><!-- /navigation -->
-  <div class="container" style="width:500px">
-    <div id="main">
-      <div id="printer_data_loading" style="display:none"><span id="loading_message">Loading Printer Details...</span><br/>
-        <div class="progress" style="width:100%">
-          <div class="progress-bar progress-bar-striped active"  role="progressbar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="width: 100%">
-          </div>
-        </div>
-      </div> <!-- /printer_data_loading -->
-      <div id="printer_details" style="display:none">
-        <span id="selected_printer">No data</span> 
-        <button type="button" class="btn btn-success" onclick="changePrinter()">Change</button>
-      </div><br /> <!-- /printer_details -->
-      <div id="printer_select" style="display:none">
-        Zebra Printer Options<br />
-        Printer: <select id="printers"></select>
-      </div> <!-- /printer_select -->
-      <div id="print_form" style="display:none">
-        Enter Name: <input type="text" id="entered_name"></input>
-        <br /><br />
-        <button type="button" class="btn btn-lg btn-primary" onclick="sendData();" value="Print">Print Label</button>
-      </div> <!-- /print_form -->
-    </div> <!-- /main -->
-    <div id="error_div" style="width:500px; display:none"><div id="error_message"></div>
-      <button type="button" class="btn btn-lg btn-success" onclick="trySetupAgain();">Try Again</button>
-    </div><!-- /error_div -->
-	</div><!-- /container -->
+		<div class="container">
+			<div class="navbar-header">
+				<button type="button" class="navbar-toggle collapsed"
+					data-toggle="collapse" data-target=".navbar-collapse">
+					<span class="sr-only">Toggle navigation</span> <span
+						class="icon-bar"></span> <span class="icon-bar"></span> <span
+						class="icon-bar"></span>
+				</button>
+				<a class="navbar-brand" href="#"><p style="font-size: 150%;">Zebra
+						Browser Print</p></a>
+			</div>
+			<!-- /navbar-header -->
+		</div>
+		<!-- /container -->
+	</div>
+	<!-- /navigation -->
+	<div class="container" style="width: 500px">
+		<div id="main">
+			<div id="printer_data_loading" style="display: none">
+				<span id="loading_message">Loading Printer Details...</span><br />
+				<div class="progress" style="width: 100%">
+					<div class="progress-bar progress-bar-striped active"
+						role="progressbar" aria-valuenow="100" aria-valuemin="0"
+						aria-valuemax="100" style="width: 100%"></div>
+				</div>
+			</div>
+			<!-- /printer_data_loading -->
+			<div id="printer_details" style="display: none">
+				<span id="selected_printer">No data</span>
+				<button type="button" class="btn btn-success"
+					onclick="changePrinter()">Change</button>
+			</div>
+			<br />
+			<!-- /printer_details -->
+			<div id="printer_select" style="display: none">
+				Zebra Printer Options<br /> Printer: <select id="printers"></select>
+			</div>
+			<!-- /printer_select -->
+			<div id="print_form" style="display: none">
+				Enter Name: <input type="text" id="entered_name"></input> <br /> <br />
+				<button type="button" class="btn btn-lg btn-primary"
+					onclick="sendData();" value="Print">Print Label</button>
+			</div>
+			<!-- /print_form -->
+		</div>
+		<!-- /main -->
+		<div id="error_div" style="width: 500px; display: none">
+			<div id="error_message"></div>
+			<button type="button" class="btn btn-lg btn-success"
+				onclick="trySetupAgain();">Try Again</button>
+		</div>
+		<!-- /error_div -->
+	</div>
+	<!-- /container -->
 </body>
+<link href="resources/lib/bootstrap/css/bootstrap.min.css"
+	rel="stylesheet">
+<link href="resources/lib/bootstrap/css/bootstrap-theme.min.css"
+	rel="stylesheet">
+<script type="text/javascript" src="resources/lib/jquery/jquery.min.js"></script>
+<script type="text/javascript"
+	src="resources/js/zebra/BrowserPrint-1.0.4.min.js"></script>
+<script type="text/javascript" src="resources/js/zebra/app.js"></script>
 </html>

+ 0 - 208
src/main/webapp/resources/js/zebra/DevDemo.js

@@ -1,208 +0,0 @@
-var available_printers = null;
-var selected_category = null;
-var default_printer = null;
-var selected_printer = null;
-var format_start = "^XA^LL200^FO80,50^A0N36,36^FD";
-var format_end = "^FS^XZ";
-var default_mode = true;
-
-function setup_web_print()
-{
-	$('#printer_select').on('change', onPrinterSelected);
-	showLoading("Loading Printer Information...");
-	default_mode = true;
-	selected_printer = null;
-	available_printers = null;
-	selected_category = null;
-	default_printer = null;
-	
-	BrowserPrint.getDefaultDevice('printer', function(printer)
-	{
-		default_printer = printer
-		if((printer != null) && (printer.connection != undefined))
-		{
-			selected_printer = printer;
-			var printer_details = $('#printer_details');
-			var selected_printer_div = $('#selected_printer');
-			
-			selected_printer_div.text("Using Default Printer: " + printer.name);
-			hideLoading();
-			printer_details.show();
-			$('#print_form').show();
-
-		}
-		BrowserPrint.getLocalDevices(function(printers)
-			{
-				available_printers = printers;
-				var sel = document.getElementById("printers");
-				var printers_available = false;
-				sel.innerHTML = "";
-				if (printers != undefined)
-				{
-					for(var i = 0; i < printers.length; i++)
-					{
-						if (printers[i].connection == 'usb')
-						{
-							var opt = document.createElement("option");
-							opt.innerHTML = printers[i].connection + ": " + printers[i].uid;
-							opt.value = printers[i].uid;
-							sel.appendChild(opt);
-							printers_available = true;
-						}
-					}
-				}
-				
-				if(!printers_available)
-				{
-					showErrorMessage("No Zebra Printers could be found!");
-					hideLoading();
-					$('#print_form').hide();
-					return;
-				}
-				else if(selected_printer == null)
-				{
-					default_mode = false;
-					changePrinter();
-					$('#print_form').show();
-					hideLoading();
-				}
-			}, undefined, 'printer');
-	}, 
-	function(error_response)
-	{
-		showBrowserPrintNotFound();
-	});
-};
-function showBrowserPrintNotFound()
-{
-	showErrorMessage("An error occured while attempting to connect to your Zebra Printer. You may not have Zebra Browser Print installed, or it may not be running. Install Zebra Browser Print, or start the Zebra Browser Print Service, and try again.");
-
-};
-function sendData()
-{
-	showLoading("Printing...");
-	checkPrinterStatus( function (text){
-		if (text == "Ready to Print")
-		{
-			selected_printer.send(format_start + $('#entered_name').val() + format_end, printComplete, printerError);
-		}
-		else
-		{
-			printerError(text);
-		}
-	});
-};
-function checkPrinterStatus(finishedFunction)
-{
-	selected_printer.sendThenRead("~HQES", 
-				function(text){
-						var that = this;
-						var statuses = new Array();
-						var ok = false;
-						var is_error = text.charAt(70);
-						var media = text.charAt(88);
-						var head = text.charAt(87);
-						var pause = text.charAt(84);
-						// check each flag that prevents printing
-						if (is_error == '0')
-						{
-							ok = true;
-							statuses.push("Ready to Print");
-						}
-						if (media == '1')
-							statuses.push("Paper out");
-						if (media == '2')
-							statuses.push("Ribbon Out");
-						if (media == '4')
-							statuses.push("Media Door Open");
-						if (media == '8')
-							statuses.push("Cutter Fault");
-						if (head == '1')
-							statuses.push("Printhead Overheating");
-						if (head == '2')
-							statuses.push("Motor Overheating");
-						if (head == '4')
-							statuses.push("Printhead Fault");
-						if (head == '8')
-							statuses.push("Incorrect Printhead");
-						if (pause == '1')
-							statuses.push("Printer Paused");
-						if ((!ok) && (statuses.Count == 0))
-							statuses.push("Error: Unknown Error");
-						finishedFunction(statuses.join());
-			}, printerError);
-};
-function hidePrintForm()
-{
-	$('#print_form').hide();
-};
-function showPrintForm()
-{
-	$('#print_form').show();
-};
-function showLoading(text)
-{
-	$('#loading_message').text(text);
-	$('#printer_data_loading').show();
-	hidePrintForm();
-	$('#printer_details').hide();
-	$('#printer_select').hide();
-};
-function printComplete()
-{
-	hideLoading();
-	alert ("Printing complete");
-}
-function hideLoading()
-{
-	$('#printer_data_loading').hide();
-	if(default_mode == true)
-	{
-		showPrintForm();
-		$('#printer_details').show();
-	}
-	else
-	{
-		$('#printer_select').show();
-		showPrintForm();
-	}
-};
-function changePrinter()
-{
-	default_mode = false;
-	selected_printer = null;
-	$('#printer_details').hide();
-	if(available_printers == null)
-	{
-		showLoading("Finding Printers...");
-		$('#print_form').hide();
-		setTimeout(changePrinter, 200);
-		return;
-	}
-	$('#printer_select').show();
-	onPrinterSelected();
-	
-}
-function onPrinterSelected()
-{
-	selected_printer = available_printers[$('#printers')[0].selectedIndex];
-}
-function showErrorMessage(text)
-{
-	$('#main').hide();
-	$('#error_div').show();
-	$('#error_message').html(text);
-}
-function printerError(text)
-{
-	showErrorMessage("An error occurred while printing. Please try again." + text);
-}
-function trySetupAgain()
-{
-	$('#main').show();
-	$('#error_div').hide();
-	setup_web_print();
-	//hideLoading();
-}
-
-

+ 193 - 0
src/main/webapp/resources/js/zebra/app.js

@@ -0,0 +1,193 @@
+var available_printers = null;
+var selected_category = null;
+var default_printer = null;
+var selected_printer = null;
+var format_start = "^XA^LL200^FO80,50^A0N36,36^FD";
+var format_end = "^FS^XZ";
+var zpl = "^XA^LH220,0^FO0,0^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FD4493890000170413000000^FS^FO0,55^A0,16^FD-10拼-两层-ENIG-联迪代工供应商^FS^FO0,80^A0,16^BY1,2.5,16^BCN,30,Y,N,N^FDYY01001632-103^FS^XZ";
+var default_mode = true;
+
+$(document).ready(setup_web_print);
+
+function setup_web_print() {
+	$('#printer_select').on('change', onPrinterSelected);
+	showLoading("Loading Printer Information...");
+	default_mode = true;
+	selected_printer = null;
+	available_printers = null;
+	selected_category = null;
+	default_printer = null;
+
+	BrowserPrint.getDefaultDevice('printer',
+			function(printer) {
+				default_printer = printer
+				if ((printer != null) && (printer.connection != undefined)) {
+					selected_printer = printer;
+					var printer_details = $('#printer_details');
+					var selected_printer_div = $('#selected_printer');
+
+					selected_printer_div.text("Using Default Printer: "
+							+ printer.name);
+					hideLoading();
+					printer_details.show();
+					$('#print_form').show();
+
+				}
+				BrowserPrint.getLocalDevices(function(printers) {
+					available_printers = printers;
+					var sel = document.getElementById("printers");
+					var printers_available = false;
+					sel.innerHTML = "";
+					if (printers != undefined) {
+						for (var i = 0; i < printers.length; i++) {
+							if (printers[i].connection == 'usb') {
+								var opt = document.createElement("option");
+								opt.innerHTML = printers[i].connection + ": "
+										+ printers[i].uid;
+								opt.value = printers[i].uid;
+								sel.appendChild(opt);
+								printers_available = true;
+							}
+						}
+					}
+
+					if (!printers_available) {
+						showErrorMessage("No Zebra Printers could be found!");
+						hideLoading();
+						$('#print_form').hide();
+						return;
+					} else if (selected_printer == null) {
+						default_mode = false;
+						changePrinter();
+						$('#print_form').show();
+						hideLoading();
+					}
+				}, undefined, 'printer');
+			}, function(error_response) {
+				showBrowserPrintNotFound();
+			});
+};
+function showBrowserPrintNotFound() {
+	showErrorMessage("An error occured while attempting to connect to your Zebra Printer. You may not have Zebra Browser Print installed, or it may not be running. Install Zebra Browser Print, or start the Zebra Browser Print Service, and try again.");
+
+};
+function sendData() {
+	showLoading("Printing...");
+	checkPrinterStatus(function(text) {
+		if (text == "Ready to Print") {
+			// selected_printer.send(format_start + $('#entered_name').val() +
+			// format_end, printComplete, printerError);
+			var generateZPLUrl = "zebra/generateZPL";
+			$.ajax({
+				type : "POST",
+				url : generateZPLUrl,
+				success : function(data) {
+					console.log(data);
+					selected_printer.send(data, printComplete, printerError);
+				},
+				error : function(XMLHttpRequest) {
+					console.log(XMLHttpRequest);
+					printerError(JSON.stringify(XMLHttpRequest));
+				}
+			});
+		} else {
+			printerError(text);
+		}
+	});
+};
+function checkPrinterStatus(finishedFunction) {
+	selected_printer.sendThenRead("~HQES", function(text) {
+		var that = this;
+		var statuses = new Array();
+		var ok = false;
+		var is_error = text.charAt(70);
+		var media = text.charAt(88);
+		var head = text.charAt(87);
+		var pause = text.charAt(84);
+		// check each flag that prevents printing
+		if (is_error == '0') {
+			ok = true;
+			statuses.push("Ready to Print");
+		}
+		if (media == '1')
+			statuses.push("Paper out");
+		if (media == '2')
+			statuses.push("Ribbon Out");
+		if (media == '4')
+			statuses.push("Media Door Open");
+		if (media == '8')
+			statuses.push("Cutter Fault");
+		if (head == '1')
+			statuses.push("Printhead Overheating");
+		if (head == '2')
+			statuses.push("Motor Overheating");
+		if (head == '4')
+			statuses.push("Printhead Fault");
+		if (head == '8')
+			statuses.push("Incorrect Printhead");
+		if (pause == '1')
+			statuses.push("Printer Paused");
+		if ((!ok) && (statuses.Count == 0))
+			statuses.push("Error: Unknown Error");
+		finishedFunction(statuses.join());
+	}, printerError);
+};
+function hidePrintForm() {
+	$('#print_form').hide();
+};
+function showPrintForm() {
+	$('#print_form').show();
+};
+function showLoading(text) {
+	$('#loading_message').text(text);
+	$('#printer_data_loading').show();
+	hidePrintForm();
+	$('#printer_details').hide();
+	$('#printer_select').hide();
+};
+function printComplete() {
+	hideLoading();
+	alert("Printing complete");
+}
+function hideLoading() {
+	$('#printer_data_loading').hide();
+	if (default_mode == true) {
+		showPrintForm();
+		$('#printer_details').show();
+	} else {
+		$('#printer_select').show();
+		showPrintForm();
+	}
+};
+function changePrinter() {
+	default_mode = false;
+	selected_printer = null;
+	$('#printer_details').hide();
+	if (available_printers == null) {
+		showLoading("Finding Printers...");
+		$('#print_form').hide();
+		setTimeout(changePrinter, 200);
+		return;
+	}
+	$('#printer_select').show();
+	onPrinterSelected();
+
+}
+function onPrinterSelected() {
+	selected_printer = available_printers[$('#printers')[0].selectedIndex];
+}
+function showErrorMessage(text) {
+	$('#main').hide();
+	$('#error_div').show();
+	$('#error_message').html(text);
+}
+function printerError(text) {
+	showErrorMessage("An error occurred while printing. Please try again."
+			+ text);
+}
+function trySetupAgain() {
+	$('#main').show();
+	$('#error_div').hide();
+	setup_web_print();
+	// hideLoading();
+}