转载 条码打印

最近公司要做一个条码标签打印的软件,故特此研究了一下Zebra条码打印机,粗略了解了一下ZPL语言,Download了几个Demo,但始终觉得这些Demo不规范、不全面,问题很多,于是自己抽时间整理了一下。代码注释我写得比较清楚,无需太多解释,一看便知。如果要对元素格式进行修改,需要对zpl语言有所了解。

功能要点:

1.Java调用打印机

2.打印单个条码

3.打印中文字符

4.打印中文、英文、数字、条码混合标签

打印效果:




[java]  view plain  copy
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.io.UnsupportedEncodingException;  
  5.   
  6. import javax.print.Doc;  
  7. import javax.print.DocFlavor;  
  8. import javax.print.DocPrintJob;  
  9. import javax.print.PrintException;  
  10. import javax.print.PrintService;  
  11. import javax.print.PrintServiceLookup;  
  12. import javax.print.SimpleDoc;  
  13. import javax.print.attribute.standard.PrinterName;  
  14.   
  15. public class ZplPrinter {  
  16.     private String printerURI = null;//打印机完整路径  
  17.     private PrintService printService = null;//打印机服务  
  18.     private byte[] dotFont;  
  19.     private String begin = "^XA";   //标签格式以^XA开始  
  20.     private String end = "^XZ";     //标签格式以^XZ结束  
  21.     private String content = "";  
  22.   
  23.     public static void main(String[] args) {  
  24.         ZplPrinter p = new ZplPrinter("\\\\192.168.0.12\\ZDesigner 105SLPlus-300dpi ZPL");  
  25.         //1.打印单个条码  
  26.         String bar0 = "1234567890";//条码内容  
  27.         String bar0Zpl = "^FO110,110^BY6,3.0,280^BCN,,Y,N,N^FD${data}^FS";//条码样式模板  
  28.         p.setBarcode(bar0, bar0Zpl);  
  29.         String zpl = p.getZpl();  
  30.         System.out.println(zpl);  
  31.         boolean result1 = p.print(zpl);//打印  
  32.           
  33.         p.resetZpl();//注意要清除上次的打印信息  
  34.         //2.打印中、英、数字、条码混合  
  35.         //左边的条码  
  36.         String bar1 = "07";  
  37.         p.setChar(bar1, 1901306060);  
  38.         String bar1Zpl = "^FO100,200^BY8,3.0,240^BCR,,N,N,N^FD${data}^FS";//条码样式模板  
  39.         p.setBarcode(bar1,bar1Zpl);  
  40.         //下边的条码  
  41.         String bar2 = "00000999990018822969";//20位  
  42.         String bar2Paper = "^FO380,600^BY3,3.0,100^BCN,,Y,N,N^FD${data}^FS";//条码样式模板  
  43.         p.setBarcode(bar2,bar2Paper);  
  44.           
  45.         p.setText("国药控股湖南有限公司"380406060302224);  
  46.         p.setChar("CSS0BPKPPR"3801006060);  
  47.           
  48.         p.setText("09件",940806060302224);  
  49.         p.setText("补"1100806060302224);  
  50.           
  51.         p.setText("公司自配送 公路"3801808080303324);  
  52.         p.setChar("03231151",9401874040);  
  53.         p.setChar("2015-10-10",9402273030);  
  54.           
  55.         p.setText("湖南六谷大药房连锁有限公司"3802606060302224);  
  56.           
  57.         p.setText("长沙市开福区捞刀河镇中岭村258号"3803206060302222);  
  58.           
  59.         p.setText("多SKU"8004856060302224);  
  60.           
  61.         p.setText("库位:49"3804205656302224);  
  62.         p.setText("品类:感冒胶囊"3804855656302224);  
  63.           
  64.         p.setText("批号:"3805505656302224);  
  65.         p.setChar("78787878788"5005604040);  
  66.           
  67.         String zpl2 = p.getZpl();  
  68.         System.out.println(zpl2);  
  69.         boolean result2 = p.print(zpl2);  
  70.     }  
  71.   
  72.     /** 
  73.      * 构造方法 
  74.      * @param printerURI 打印机路径 
  75.      */  
  76.     public ZplPrinter(String printerURI){  
  77.         this.printerURI = printerURI;  
  78.         //加载字体  
  79.         File file = new File("C://ts24.lib");  
  80.         if(file.exists()){  
  81.             FileInputStream fis;  
  82.             try {  
  83.                 fis = new FileInputStream(file);  
  84.                 dotFont = new byte[fis.available()];  
  85.                 fis.read(dotFont);  
  86.                 fis.close();  
  87.             } catch (IOException e) {  
  88.                 e.printStackTrace();  
  89.             }  
  90.         }else{  
  91.             System.out.println("C://ts24.lib文件不存在");  
  92.         }  
  93.         //初始化打印机  
  94.         PrintService[] services = PrintServiceLookup.lookupPrintServices(null,null);  
  95.         if (services != null && services.length > 0) {  
  96.             for (PrintService service : services) {  
  97.                 if (printerURI.equals(service.getName())) {  
  98.                     printService = service;  
  99.                     break;  
  100.                 }  
  101.             }  
  102.         }  
  103.         if (printService == null) {  
  104.             System.out.println("没有找到打印机:["+printerURI+"]");  
  105.             //循环出所有的打印机  
  106.             if (services != null && services.length > 0) {  
  107.                 System.out.println("可用的打印机列表:");  
  108.                 for (PrintService service : services) {  
  109.                     System.out.println("["+service.getName()+"]");  
  110.                 }  
  111.             }  
  112.         }else{  
  113.             System.out.println("找到打印机:["+printerURI+"]");  
  114.             System.out.println("打印机名称:["+printService.getAttribute(PrinterName.class).getValue()+"]");  
  115.         }  
  116.     }  
  117.     /** 
  118.      * 设置条形码 
  119.      * @param barcode 条码字符 
  120.      * @param zpl 条码样式模板 
  121.      */  
  122.     public void setBarcode(String barcode,String zpl) {  
  123.         content += zpl.replace("${data}", barcode);  
  124.     }  
  125.   
  126.     /** 
  127.      * 中文字符、英文字符(包含数字)混合 
  128.      * @param str 中文、英文 
  129.      * @param x x坐标 
  130.      * @param y y坐标 
  131.      * @param eh 英文字体高度height 
  132.      * @param ew 英文字体宽度width 
  133.      * @param es 英文字体间距spacing 
  134.      * @param mx 中文x轴字体图形放大倍率。范围1-10,默认1 
  135.      * @param my 中文y轴字体图形放大倍率。范围1-10,默认1 
  136.      * @param ms 中文字体间距。24是个比较合适的值。 
  137.      */  
  138.     public void setText(String str, int x, int y, int eh, int ew, int es, int mx, int my, int ms) {  
  139.         byte[] ch = str2bytes(str);  
  140.         for (int off = 0; off < ch.length;) {  
  141.             if (((int) ch[off] & 0x00ff) >= 0xA0) {  
  142.                 int qcode = ch[off] & 0xff;  
  143.                 int wcode = ch[off + 1] & 0xff;  
  144.                 content += String.format("^FO%d,%d^XG0000%01X%01X,%d,%d^FS\n", x, y, qcode, wcode, mx, my);  
  145.                 begin += String.format("~DG0000%02X%02X,00072,003,\n", qcode, wcode);  
  146.                 qcode = (qcode + 128 - 32) & 0x00ff;  
  147.                 wcode = (wcode + 128 - 32) & 0x00ff;  
  148.                 int offset = ((int) qcode - 16) * 94 * 72 + ((int) wcode - 1) * 72;  
  149.                 for (int j = 0; j < 72; j += 3) {  
  150.                     qcode = (int) dotFont[j + offset] & 0x00ff;  
  151.                     wcode = (int) dotFont[j + offset + 1] & 0x00ff;  
  152.                     int qcode1 = (int) dotFont[j + offset + 2] & 0x00ff;  
  153.                     begin += String.format("%02X%02X%02X\n", qcode, wcode, qcode1);  
  154.                 }  
  155.                 x = x + ms * mx;  
  156.                 off = off + 2;  
  157.             } else if (((int) ch[off] & 0x00FF) < 0xA0) {  
  158.                 setChar(String.format("%c", ch[off]), x, y, eh, ew);  
  159.                 x = x + es;  
  160.                 off++;  
  161.             }  
  162.         }  
  163.     }  
  164.     /** 
  165.      * 英文字符串(包含数字) 
  166.      * @param str 英文字符串 
  167.      * @param x x坐标 
  168.      * @param y y坐标 
  169.      * @param h 高度 
  170.      * @param w 宽度 
  171.      */  
  172.     public void setChar(String str, int x, int y, int h, int w) {  
  173.         content += "^FO" + x + "," + y + "^A0," + h + "," + w + "^FD" + str + "^FS";  
  174.     }  
  175.     /** 
  176.      * 英文字符(包含数字)顺时针旋转90度 
  177.      * @param str 英文字符串 
  178.      * @param x x坐标 
  179.      * @param y y坐标 
  180.      * @param h 高度 
  181.      * @param w 宽度 
  182.      */  
  183.     public void setCharR(String str, int x, int y, int h, int w) {  
  184.         content += "^FO" + x + "," + y + "^A0R," + h + "," + w + "^FD" + str + "^FS";  
  185.     }  
  186.     /** 
  187.      * 获取完整的ZPL 
  188.      * @return 
  189.      */  
  190.     public String getZpl() {  
  191.         return begin + content + end;  
  192.     }  
  193.     /** 
  194.      * 重置ZPL指令,当需要打印多张纸的时候需要调用。 
  195.      */  
  196.     public void resetZpl() {  
  197.         begin = "^XA";  
  198.         end = "^XZ";  
  199.         content = "";  
  200.     }  
  201.     /** 
  202.      * 打印 
  203.      * @param zpl 完整的ZPL 
  204.      */  
  205.     public boolean print(String zpl){  
  206.         if(printService==null){  
  207.             System.out.println("打印出错:没有找到打印机:["+printerURI+"]");  
  208.             return false;  
  209.         }  
  210.         DocPrintJob job = printService.createPrintJob();  
  211.         byte[] by = zpl.getBytes();  
  212.         DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;  
  213.         Doc doc = new SimpleDoc(by, flavor, null);  
  214.         try {  
  215.             job.print(doc, null);  
  216.             System.out.println("已打印");  
  217.             return true;  
  218.         } catch (PrintException e) {  
  219.             e.printStackTrace();  
  220.             return false;  
  221.         }  
  222.     }  
  223.     /** 
  224.      * 字符串转byte[] 
  225.      * @param s 
  226.      * @return 
  227.      */  
  228.     private byte[] str2bytes(String s) {  
  229.         if (null == s || "".equals(s)) {  
  230.             return null;  
  231.         }  
  232.         byte[] abytes = null;  
  233.         try {  
  234.             abytes = s.getBytes("gb2312");  
  235.         } catch (UnsupportedEncodingException ex) {  
  236.             ex.printStackTrace();  
  237.         }  
  238.         return abytes;  
  239.     }  
  240. }  


# 欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值