精华内容
下载资源
问答
  • Java调用Zebra打印机,采用ZPL指令。支持打印中文,不需要ts24.lib文件,支持打印二维码。
  • 一、应用背景•日常生活中经常能够见到如下场景:•机动车不礼让斑马线上的行人;•行人无视交通信号灯而任性的与机动车抢道;•中国式过马路;•低头族过马路;•儿童在斑马线上玩耍;•残障人士通过斑马线;•等等...

    一、应用背景

    •日常生活中经常能够见到如下场景:

    •机动车不礼让斑马线上的行人;

    •行人无视交通信号灯而任性的与机动车抢道;

    •中国式过马路;

    •低头族过马路;

    •儿童在斑马线上玩耍;

    •残障人士通过斑马线;

    •等等。

    •斑马线是城市道路的生命线,很多人员伤亡都发生在人行横道,特别是夜间或者雨雪天气,

    •车辆很难看清人行横道,尤其是非灯控制路口和道路中间的人行横道。

    •同时,目前仍有一部分司机还没形成停车让行的安全意识,再加上使用智能手机的“低头族”

    •在行人中普遍存在,导致过马路的时候安全隐患大大增加。

    •上述原因导致的交通事故也是屡见不鲜,成为困扰广大机动车驾驶员、行人及交通主管部门的难题。而传统方案又很难从根本上解决这个问题。

    二、系统原理

    •对于当前出现的上述问题,人员监测识别摄像机可对处于通行状态的行人及机动车给出通行提醒,从而避免可能发生的交通事故。

    •对行人:

    •摄像机嵌入AI人体识别算法,检测判定斑马线区域是否有行人通行。当路口有行人通过时,系统设备自动监测识别是人体,会自动判定斑马线区域有行人通行,同时输出开关量信号到斑马线两边道钉灯,道钉灯会亮起闪烁灯,并连续闪烁提示过往车辆减速礼让行人,对斑马线上的行人及过往车辆进行双向警示。当行人安全通过斑马线后,警示灯自动熄灭。从而极大程度提高了夜间斑马线的可视度,增强了提示和警示功能。

    •对机动车:

    •车辆行进过程中,当行进方向人行道出现行人后,控制车道上道钉灯闪烁,提醒车辆减速。

    019fd36e037d9de98347a888e93ef681.png

    三、系统优势

    •科缔欧行人监测识别预警系统

    •采用深度学习算法,嵌入AI人体识别算法;

    •算法运行在摄像机端;

    •算法可识别位于斑马线上的行人;

    •识别速度约0.5s;

    •输出可以通过接口传递给管理系统,也可以直接输出开关量。

    ff6b16f60573de8f24ec60fe44329bf3.png

    展开全文
  • 斑马打印机java开发

    2020-05-25 17:50:18
    斑马打印机java开发,包括例子和jar包,java SDk最新版,斑马打印机java API开发,eclipse
  • Java开发斑马打印机打印标签,支持中文打印,导入即可运行
  • Java zebra斑马打印机使用范例,使用此类库实现的打印,有源代码,包括了类库文件,面向斑马打印机。
  • JAVA调用斑马打印机打印

    热门讨论 2015-04-15 16:31:25
    将打印指令放到txt文档中,读取文档中的指令,发送到斑马打印机中,实现打印。此代码已经非常精简,项目需要用到ts24.lib,资源中也付带这个文件,并且附带一个C.txt文档的指令作为实验用。C.txt和ts24.lib请放在代码...
  • Java使用Zpl命令调用斑马打印机,简单明了,运行可用,
  • JAVA代码中,获取斑马打印机的连接 ConnectionCardPanel connectionPanel = new ConnectionCardPanel(); Connection printerConnection = null; //判断传入的端口,如果端口为 0 表示是USB连接,使用USB方式...

    JAVA代码中,获取斑马打印机的连接

     		ConnectionCardPanel connectionPanel = new ConnectionCardPanel();
            Connection printerConnection = null;
                //判断传入的端口,如果端口为 0 表示是USB连接,使用USB方式获取连接
                if(port==0 || port.toString().equals("0")){
                    DiscoveredPrinterDriver[] printerConnections = UsbDiscoverer.getZebraDriverPrinters();
                    System.out.println("printerConnections 共有:" + printerConnections.length + "个打印机");
                    for (DiscoveredPrinterDriver driver : printerConnections){
                        System.out.println("设备有:"+driver.printerName);
                    }
                    //默认获取第一个打印机
                    printerConnection = printerConnections[0].getConnection();
                }else{
                    //使用IP和端口连接
                    printerConnection = connectionPanel.getConnection(ip,port);
                }
    

    打开打印机连接

     			log.info("打开打印机连接");
                printerConnection.open();
                log.info("获取打印机实例");
                ZebraPrinter zebraPrinter = ZebraPrinterFactory.getInstance(printerConnection);
                log.info("获取实例完成");
    

    打印机当前状态

    					PrinterStatus printerStatus = zebraPrinter.getCurrentStatus();
                        //判断打印机目前是否能进行正常打印,如果不正常,循环睡眠至可打印为止
                        log.info("是否打印就绪:" + printerStatus.isReadyToPrint);
                        log.info("打印机缓存区是否已满:" + printerStatus.isReceiveBufferFull);
                        log.info("当前缓存区数量:" + printerStatus.numberOfFormatsInReceiveBuffer);
                        log.info("是否暂停:" + printerStatus.isPaused);
                        while (!printerStatus.isReadyToPrint || printerStatus.isReceiveBufferFull) {
                            log.info("打印机暂时无法正常打印,暂停打印中...." + LocalDateTime.now().toString());
                            Thread.sleep(2000);
                        }
    

    1、打印机 printerStatus.isReadyToPrint 正常打印机暂停时也为 false,在无法正常打印时为false,准备就绪是为true
    2、printerStatus.isReceiveBufferFull 正常情况下为fasle,条件有限,无法测试至缓存区满(测试时使用BASE64转换发送打印,大概为300KB*40张左右的标签时,打印机会被堵塞,无法传输image)。
    3、printerStatus.numberOfFormatsInReceiveBuffer 暂时未正确获取到数据,测试时永远为 0,但实际上打印机已经发生堵塞时返回值也是0
    4、printerStatus.isPaused 打印机是否暂停。
    5、还有一些其它状态,比如打印机激光头是否过热、碳带是否异常等,可查看源码。

    BASE64转换成斑马识别图像并打印

    						log.info("解析二维码图片base64");
                            InputStream inputStream = BaseToInputStream(qrCode);
                            ZebraImageI image = ZebraImageFactory.getImage(inputStream);
                            log.info("开始打印二维码图片");
                            zebraPrinter.printImage(image, 0, 20, data.getWidth(), data.getHeight(), false);
                            log.info("打印完成:" + i);
    	
    	----**BASE64转义**
    	public static InputStream BaseToInputStream(String base64string) {
            BASE64Decoder decoder = new BASE64Decoder();
            ByteArrayInputStream stream = null;
            byte[] bytes1 = new byte[0];
            try {
                bytes1 = decoder.decodeBuffer(base64string);
            } catch (IOException e) {
                e.printStackTrace();
            }
            stream = new ByteArrayInputStream(bytes1);
            return stream;
        }
    

    注意点:

    1、使用IP和端口打印时为网络打印机,打印机正常连接情况下可直接打印。
    2、使用USB连接的话,需要确认当前执行运行程序的电脑上必须安装好斑马打印机的驱动,并且可正常连接。
    3、USB连接时,需要使用第三方DDL库。
    4、目前不知道怎么获取打印后的状态,无法判断是否正常打印OTZ。

    附件下载

    DDL及SDK下载
    提取码: 3ypg

    展开全文
  • 以前有人传过1.5下的调用方法,但是现在有的项目是在1.4下的,该方法就是解决这个问题的
  • 斑马打印java版.zip

    2021-06-28 16:21:37
    斑马打印机开发使用的sdk,支持文字、图片、条形码、二维码等打印,支持本地、usb或tcp连接方式,调用 ZebraPrinterFactory
  • java标签打印-斑马打印机

    千次阅读 2020-03-16 21:03:07
    文章目录java实现标签打印-斑马打印机背景初步设计zpl指令驱动打印zpl指令转pdf打印 java实现标签打印-斑马打印机 背景 之前项目中有一个功能-批量打印资产标签,用户在设备资产界面勾选资产,选择打印样式,然后...

    java实现标签打印-斑马打印机

    背景

    之前项目中有一个功能-批量打印资产标签,用户在设备资产界面勾选资产,选择打印样式,然后打印到标签纸上。花了两个星期后终于把这个功能上线了,头皮屑都掉了不知道多少

    在这里插入图片描述

    初步设计

    这里就说一下初步设计的思路。因需求可以总结为两种情况,一种是打印资产信息加条形码(资产编码生成),另外一种是资产信息加二维码(资产编码生成),一开始的设计简单可以分为三张表:模板、字段以及模板和字段的关联关系表。前端利用html按照业务提供的标签纸参数大小,把两种情况的样子画好定为样式一、样式二,类似如图
    在这里插入图片描述

    然后新建模板,选择样式保存,然后在模板里面添加字段,字段详情里面可以设置数据来源字段或者来源sql,最后可以点击图片中的名称、编号等位置弹出弹框,在弹框中绑定字段。后端处理时利用图片中位置所绑定的字段设置的数据来源字段或者来源sql去得到实际的数据替换html中对应位置的数据,二维码或者条形码是用实际数据(实际场景都是资产编码这种)的base64编码去替换html中的img的src。
    这样就得到实际的资产信息标签的html了

    然后把转换后的html生成pdf导出

    这些花了大概一周时间,pdf也导出了
    (html转pdf可以看我另一篇博客:
    https://blog.csdn.net/hunan961/article/details/104901519
    中间踩过的坑都有记录)

    后面去了客户现场,才看到了标签打印机,之前一直都是云开发。
    然后打印机通过usb连上笔记本,下载驱动,点开之前生成过的pdf,右击打印

    …打印出来的完全对不上,整个标签出来了半个外边的框框,其他东西都没有了,而且还横跨了两张标签纸。

    然后开始调试,调试代码中纸张长宽,打印区域长宽,打印方向,打印机首选项中大小边距方向等。调了一天也没调出来,调到最后打印队列里面显示已打印,但是实际上啥也没有了。

    这时我是猜测pdf是太大了,超过范围就打不出东西,于是我拿标签纸和模板里的样式对比了一下,真的大了好多,于是我把实际的长宽给了前端,前端反馈按照这个长宽样式画不出来,内容塞不下。。。后面我在代码里面尝试设置缩放也没弄出来
    (生成的pdf大小都有一百多K,后面用第二种方式生成的pdf最多只有十几K)

    着急的我第二天晚上在网上看到了斑马打印机的指令语言zpl,于是去看了zpl指令文档和一些类似的用zpl打印标签的博客

    后一天运行写好的demo,利用驱动打印稍微调一调,就出来了像点样子的标签了。

    这时候,我的思路就是使用zpl指令,把两种样式都定义好(后面用户调成了四种),实际场景中直接用资产信息去替换指令中对应的位置就好了。

    这时候我又找到了另一个神器–ZebraDesigner 2
    下载
    用这个直接画好后可以直接打印,也可以生成zpl指令文档,完美,接下来就是在服务中完成代码了。

    部分需要的依赖

    在这里插入图片描述

    zpl指令驱动打印

    打印类:

    package org.hzero.report.infra.util;
    
    import javax.print.*;
    import javax.print.attribute.standard.PrinterName;
    import java.awt.*;
    import java.io.UnsupportedEncodingException;
    
    /**
     * 斑马打印机打印类-ZPL语音
     */
    public class ZplPrinter {
        private PrintService printService = null;//打印机服务
        private String content = "";
    
        /*private String begin_1 = "\u0010CT~~CD,~CC^~CT~\n" +
                "^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3~SD28^JUS^LRN^CI0^XZ\n" +
                "^XA\n" +
                "^MMT\n" +
                "^PW160\n" +
                "^LL0280\n" +
                "^LS0\n"; // 开始(个)*/
    
        private static final String begin = "\u0010CT~~CD,~CC^~CT~" +
                "^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3~SD28^JUS^LRN^CI0^XZ" +
                "^XA" +
                "^MMT" +
                "^PW695" +
                "^LL0280" +
                "^LS0"; //开始(排)
    
    //    private String logo_1 = "^FO64,0^GFA,01152,01152,00012,:Z64:\n" +
    //            "eJztUjtOAzEQHcdYKRKxKbBERSiRaCgRi2D3Bou07nOMVMiIi6zEJaKsxHKUHINqzfy8QEWZBsu2np6eZ97MGOB//bVMaCZs+/2EQwhVximlwyQPoc3yYRjeFXvkg+L1CEWKGqb9zlB2cjgMBvfCmxGv+afyAM5JArsDWLyII4fSUAtfoJcUnyXtU8AnkngR+7c9lMLXZNNzBWsg+wUb8obKcsw/YAER5sxj5Im/RzcHsB/KmwYM87eId2A75fEIv+VYhjtEFXl6InrK2gnfYnThtzCCjSB69GMmfd+jWPXUzhy/SCnraQDV5OdxiCb79z/4C7TK/BnZ0TjnAHdAmYXH7bhXp6y30jfews+oLLqp/4amfiJziQkntpR5YZ8bCkUrlvh/bgRX9H907hscQNwIXhkf6kowGrp+FUgpnVNMVpaKqTUrxXDJG9SpqzKexasMf/3nY68vBLVZLg==:36A9\n";
    
        private static final String logo_1 = "^FO192,170^GFA,01536,01536,00012,:Z64:" +
                "eJztUjFOw0AQnLMTCoQciliiQrzANQWKzwV9Cm+fF/ACinsKT/FTTlSI4pTSBbJZ7+5Z+QEUWfmi0WhvbjK7wLX+uLbkV3yLjwzdEX3GhXxaG76RLzzwORk+HvkYPn0DdybTUe83ikvMcyjtVUdETvENmpQQBO/ZD3U+y7dziILvgZq8PvAEHOQX8mQPc8pWXoDnzO/l42KFxgw5L83KD9JfKe+I+dr4abrgOZ+t2A/sf8TOdNi/8kVAkVKQfo7G84XcH9GGnfKcZ732jzB97l+8a/+w/K1Vf/EifoqIalj9SPrCu4jyDDzatBxl/0xOUbSUJ6/5jCh5AO/C9xwndcq/oflM4UswgTy9Kt9iDihHwXXH8lvNvxm4t9K51MvcbYN25+XSoPNlCWd8kfQIz1xNisFptj+GOU7KC3eYpikaZpvrgrJ9dqS17A9yNSmu+HKfr/XP6xchOF9e:F887" +
                "^FO512,170^GFA,02048,02048,00016,:Z64:" +
                "eJztk0FOAzEMRX8aIhCtKIuOxBFYskQqEsMNBmm85xgsI3XJJVhyhFFn06PMEbqsVDTBCTR2uuIAY7WVvl5tf8cJMMUUqKjU9zOvpatNo/VV+kjccgWt3wCjCpiXGqZWevMFPKjyjl5jjVMsbBixEL1yRO2F6Dv0fTcT3bB/ckX7MFoxwK2JlAEmh/T7Z4fdNZAJo/U9MCjOLZB5rNypAbizKThS/qNwRwxb4fZ4OON8/quTvoENYcCTcMPzC78G5v1W8isY/kOR7zFKfsX7Q5Fv42w6P3rPfJmOR/dP3rP/uccahf+0/cwvPZY74D3zGq7V8+/4AHzqkTnvR85vwDKMZp95w+sjJ/vp0H9s7WfWrSFDldzQbzvyFEPWFNtXddZ9zF174fF+qhfwzO4RRMfSTvF59/vNnBm1oi1vL+xF83aI9AM6cnilI1eSx+cHoCLef635/vtCn7/fKab4V/wA4xhbmA==:B3EC" +
                "^FO352,170^GFA,01152,01152,00012,:Z64:" +
                "eJztUjFOxDAQHAeOO0WUFBQcUJ5S8QAKHsL9gZICiEnJK1JG+wpT0FNQXqR7wpVXEIXxrh3dA6DDsqPRaLw7GS/wv/50leInfObuMixadBkf67a14I184YYnJNy2PAm/fwHnqUwjnV8YPnHjiJPUtRCRwvAp1v3GGV7RjzQ+l69HZw2ugUq8NaDHJ/1CW3ZITql8BB4yv9INxAr3yVDhVWy8V/2F8YWQr4x3w/cBz3zKiOeg/x0uUx36N37G3femZzSeF7I+oDZ96ZlnlfVuB0z66N30Pv7WVD96UT+zgKWf/Gj6yh8FzLfArfItCsn+t3BD0FrGi9d82HXOB9gr3zFOaSy3DdYfvftULBAvb8a/uJGudoqrhuVLy3/9Su3S3qWK754m6IpuUBsuWaJI/GxjR3lylRh2TLPeG45xSh6452EYQsK0OQ0o7Y8Jxt+SjDk/YcKH8/wL6wd4H3r/:A9FE" +
                "^FO0,170^GFA,01536,01536,00012,:Z64:" +
                "eJztUjFOw0AQnDMkjixKCgoClJErHkDBQ8gfKCkAHy55hUtrX2EKegrKWMoTUqbAMnO7d1Z+gJCyurNGo7nd8dwBx/oXVYif8Lm7TzBr0CZ8qstqwRPpwC13F3HTcEf88Q1cxDa1tH5heO7GEfM4NRORzPAZ1v3GGV7Rj9Q+ta9GZwNugFK8DaDHZ/1CR7aITql8Ah4Tv9IFhA4P0VDmVWy8V/2l8ZmQL413w88Bz3yKgHPQ/w5XsQ/9Gz/j6nvTMxrPA0nfoTJ94ZlnmfRuB0z64N30PvzW1D94UT+zDks/+dH0lT/pkG+BO+UbZJL8b+GGTnsZL17z4dScF7BXvmWcUltuG6w/e/elWCBe3o1/dSNd7RSXNdsXlv/6jdql3UsZ7j2+oGu6QWW4YIss8rONbeXJlWLYMc1qbzjEKenBvQzD0EVMm9MDpf0xwvBbkjDfTzfhw/d8rD+rX2f5ev8=:D9E6";
    
        private static final String logo_2 = "^FO512,192^GFA,01152,01152,00012,:Z64:" +
                "eJztkUFKBDEQRX86E2agRUeYgOBGT6BLwU164T4DU3uP4BEis/Aa4zlmM0fppUcYbOg2oauq+waCWKvHS6iq/AB/rFZJ0dBOuYJVXsAEvQ7cCV9HrIXv+3I0VkO7hfB7911Je3hyzBZ22DO7PLiZxiak2VgefFH8aeTNzK+Kb0dem21AHPnGDAmv4onU43hMj+zzPtP9U63eBDP53Fx9ltrnCXiTfTYzXwMH8T4a9pdYfsmeHo4k0BrP3Z7f5fKeL+yXqa8+xDcRnr39POCW8ynP9ZwbzkAvTDD6kV2yZ/VbH4WvhqEVdkRB2OZ8hEtuWg/txC7gv36nfgDK2jZc:047B" +
                "^FO348,192^GFA,00768,00768,00008,:Z64:" +
                "eJzdkTFuwzAMRb8sCw6KwM4QrU2QOSg6dquHevcg7j1BzuCpvUZvkhzFYydn9ZT0k/IJOhXV8vAEipS+gL+zDhlBeuMKa+MGwbgHBmXXolV+zroFx/oNWVTX7xVZQtKWXKO5aYMtG5bWrkaxtHPkM92T/eJ7dQ5oQwfHAe/VDc5cknkxTbjQsXiFJ/OAMjuLzdt8HiPcRfv3ix9RDOqiJXjB7kvnJcSkDzziOjV63yASyUc/P+zIyGIh648BJ42n0zOAH+FnfX9C0MD8hGZUlzexfF7vd8srilh+Ne+f80056POQGX/xV/9l/QBSVjIV:871E" +
                "^FO160,192^GFA,01152,01152,00012,:Z64:" +
                "eJztkDFOw0AQRf/aCUQEYUfyNgjhlClTIkCKj7DFzl0oENqSY3CElCulSI7iY6RKGGBm7BNQIH719GzPjD/wl/M+oKfOeIm1cYfGOKFQdB5OuWh7fvSTCc/RQbN2/7EUrh2FILzG5qgLAnysbe0DZqO1E+ED+2tZO/aJ/Y14+AZT4dQecWGegvn5Lpfq3cjfYfANavP3gHmPYX6ZcKn38EXmscWVefr65Ds93pLeGUBBC92W+/ysPXiKUfil6levwpF7Vv94C5eF+Xed9lklVL3wlAvt1GdsknpaEDTn88mYKBo/7bIx92ZcDK/zRfjP7+UT49su6w==:8176" +
                "^FO0,192^GFA,00768,00768,00008,:Z64:" +
                "eJzVkbFuwjAQhn8npCCoSCrFC0IkIyNj1VZKHsGD7106IOSRx+ARGC0xwKPkMZhC7y7hCbq0Xj59lu/s+w38vXUcYKlV1tgpW5TKgERgLIwwqTreAiZ8Xgpm1fVUMwtDzjF3aO7SwMH6Qtu9Yza2mzBv7K/c7umBfckOWyJjhuqOF3Vy6otLTMXN6GsMXqJQ3wDqFkN9GjCV/nyDOs6Yq5McQYdDkPscyMmA5/Qav+S9lrxnfufdds/0PK/4xwomSjyl1AB5QN4xMx5Q5s8jGskjozfSvB6PXknklZ+XOObrlEk/5u5//3X/bv0AQ3wu6w==:13E8";
    
        private static final String end = "^PQ1,0,1,Y^XZ";
    
        private static final String BAR = "^BY2,3,37^FT${h},258^BCB,,Y,N" +
                "^FD>;${code}^FS";
    
        private static final String QR = "^FT${h1},100^BQN,2,4" +
                "^FH\\^FDLA,${code}^FS" +
                "^FT${h2},102^A0B,17,16^FH\\^FD${code}^FS";
    
        private static final String NUM = "${code}";
        private static final String H = "${h}";
        private static final String H1 = "${h1}";
        private static final String H2 = "${h2}";
    
        public static void main(String[] args) {
    //        ZplPrinter p = new ZplPrinter("\\\\192.168.0.12\\ZDesigner 105SLPlus-300dpi ZPL");
            ZplPrinter p = new ZplPrinter("ZDesigner ZT210-200dpi ZPL");
            //1.打印单个条码
            String bar0 = "7150000036";//条码内容
    //        String bar0Zpl = "^FO110,110^BY6,3.0,280^BCN,,Y,N,N^FD${data}^FS";//条码样式模板
    //        p.setCharB("name", 20, 60, 30, 30);
    //        p.setText("型号", 40, 60, 30, 30, 5, 1, 1, 24);
            p.setBegin();
            p.setText2Img("中中中中中中中中中1", 20, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中1", 48, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中1", 76, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中2", 194, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中2", 222, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中2", 250, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中3", 368, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中3", 396, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中3", 424, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中4", 542, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中4", 570, 0, 22, Font.PLAIN);
            p.setText2Img("中中中中中中中中中4", 598, 0, 22, Font.PLAIN);
            p.setLogo(1);
            p.setEnd();
    //        p.setChinese("型号",50,60,30,30);
    //        String bar0Zpl = "^FO102,0^BY2,3.0,40^BCB,,Y,N,N^FD${data}^FS";//条码样式模板
    //        p.setBarcode(bar0, bar0Zpl);
            String zpl = p.getZpl();
            System.out.println(zpl);
            boolean result1 = p.print(zpl, 1);//打印
            if (result1) {
                return;
            }
    
            p.resetZpl();//注意要清除上次的打印信息
        }
    
        /**
         * add LOGO
         *
         * @param i 样式
         */
        public void setLogo(int i) {
            if (i == 1) {
                content = content + logo_1;
            } else if (i == 2){
                content = content + logo_2;
            }
        }
    
        /**
         * setEnd
         */
        public void setEnd() {
            content = content + end;
        }
    
        /**
         * setBegin
         */
        public void setBegin() {
            content = content + begin;
        }
    
        public void setText2Img(String str, int x, int y, int size, int style) {
            content += Font2ZplGF.getFontHex(bSubstring(str, 17), x, y, size, style);
        }
    
        /**
         * 构造方法
         *
         * @param printerURI 打印机路径
         */
        public ZplPrinter(String printerURI) {
            if (printerURI != null) {
                //打印机完整路径
                //初始化打印机
                PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
                if (services != null && services.length > 0) {
                    for (PrintService service : services) {
                        if (printerURI.equals(service.getName())) {
                            printService = service;
                            break;
                        }
                    }
                }
                if (printService == null) {
                    //循环出所有的打印机
                    if (services != null && services.length > 0) {
                        System.out.println("可用的打印机列表:");
                        for (PrintService service : services) {
                            System.out.println("[" + service.getName() + "]");
                        }
                    }
                    throw new RuntimeException("没有找到打印机:[" + printerURI + "]");
                } else {
                    System.out.println("找到打印机:[" + printerURI + "]");
                    System.out.println("打印机名称:[" + printService.getAttribute(PrinterName.class).getValue() + "]");
                }
            }
        }
    
        /**
         * 获取完整的ZPL
         *
         * @return
         */
        public String getZpl() {
            return content;
        }
    
        /**
         * 重置ZPL指令,当需要打印多张纸的时候需要调用。
         */
        public void resetZpl() {
            content = "";
        }
    
        /**
         * 打印
         *
         * @param zpl      完整的ZPL
         * @param quantity
         */
        public boolean print(String zpl, Integer quantity) {
            if (printService == null) {
                return false;
            }
            byte[] by = zpl.getBytes();
            // 直连打印
            DocPrintJob job = printService.createPrintJob();
            DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
            Doc doc = new SimpleDoc(by, flavor, null);
            try {
                job.print(doc, null);
                System.out.println("已打印\n" + zpl);
                return true;
            } catch (PrintException e) {
                e.printStackTrace();
                return false;
            }
            // 复杂打印
            /*PrinterJob job = PrinterJob.getPrinterJob();
            PDDocument document = null;
            try {
                document = PDDocument.load(by);
                job.setPrintService(printService);
                // 设置纸张属性
                Paper paper = new Paper();
                double paperHigh = 250.56;
                double paperWidth = 100.8;
                Double marginLeft = 0.0;
                Double marginRight = 0.0;
                Double marginTop = 0.0;
                Double marginBottom = 0.0;
                // 设置纸张宽高 以1/72英寸为单位 纸张宽250mm 则paperWidth为 25cm/2.54*72
                paper.setSize(paperWidth, paperHigh);
                // 设置可成像区域
                paper.setImageableArea(marginLeft, marginTop, paperWidth - (marginLeft + marginRight), paperHigh - (marginTop + marginBottom));
    
                // 设置纸张及缩放
                PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
                // 设置多页打印
                Book book = new Book();
                PageFormat pageFormat = new PageFormat();
                // 设置打印方向 横向
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
                // 设置纸张
                pageFormat.setPaper(paper);
                book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
                job.setPageable(book);
                // 设置打印份数
                job.setCopies(quantity);
                // 添加打印属性
                HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
                // 设置单双页
                pars.add(Sides.DUPLEX);
                job.print(pars);
                return true;
            } catch (Exception e) {
                return false;
            } finally {
                if (document != null) {
                    try {
                        document.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }*/
        }
    
        /**
         * 条形码
         *
         * @param assetNum
         * @param h
         */
        public void setBar(String assetNum, int h) {
            if (assetNum.length() == 13) {
                assetNum = assetNum.replace(String.valueOf(assetNum.charAt(12)), ">6" + assetNum.charAt(12));
            }
            content = content + BAR.replace(NUM, assetNum).replace(H, String.valueOf(h));
        }
    
        /**
         * 按字节截取
         *
         * @param s
         * @param length
         * @return
         * @throws Exception
         */
        public static String bSubstring(String s, int length) {
            if (s == null) {
                return "";
            }
            try {
                byte[] bytes = s.getBytes("Unicode");
                int n = 0; // 表示当前的字节数
                int i = 2; // 要截取的字节数,从第3个字节开始
                for (; i < bytes.length && n < length; i++) {
                    // 奇数位置,如3、5、7等,为UCS2编码中两个字节的第二个字节
                    if (i % 2 == 1) {
                        n++; // 在UCS2第二个字节时n加1
                    } else {
                        // 当UCS2编码的第一个字节不等于0时,该UCS2字符为汉字,一个汉字算两个字节
                        if (bytes[i] != 0) {
                            n++;
                        }
                    }
                }
                // 如果i为奇数时,处理成偶数
                if (i % 2 == 1) {
                    // 该UCS2字符是汉字时,去掉这个截一半的汉字
                    if (bytes[i - 1] != 0) {
                        i = i - 1;
                    }
                        // 该UCS2字符是字母或数字,则保留该字符
                    else {
                        i = i + 1;
                    }
                }
                String newStr = new String(bytes, 0, i, "Unicode");
                StringBuilder newS = new StringBuilder(newStr);
                if (getWordCount(newStr) < 17) {
                    for (int j = 0; j < 17 - getWordCount(newStr); j++) {
                        newS.append(" ");
                    }
                }
                return newS.toString();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return "";
        }
    
        /**
         * 二维码
         *
         * @param assetNum
         * @param x5
         * @param x6
         */
        public void setQr(String assetNum, int x5, int x6) {
            content = content + QR.replace(NUM, assetNum).replace(H1, String.valueOf(x5)).replace(H2, String.valueOf(x6)).replace(NUM, assetNum);
        }
    
        /**
         * 获取字符串的字节长度
         *
         * @param s
         * @return
         */
        public static int getWordCount(String s) {
            int length = 0;
            for (int i = 0; i < s.length(); i++) {
                int ascii = Character.codePointAt(s, i);
                if (ascii >= 0 && ascii <= 255) {
                    length++;
                } else {
                    length += 2;
                }
    
            }
            return length;
        }
    }
    

    汉字转zpl图片类:

    package org.hzero.report.infra.util;
    
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    
    import java.awt.*;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferInt;
    import java.io.*;
    
    /**
     * 汉字转zpl图片
     */
    public class Font2ZplGF {
    
        private static BufferedImage source = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
        private static Graphics2D gs = source.createGraphics();
        private static Font f;
    
        static {
            Resource resource = new ClassPathResource("font/SIMHEI.TTF");
            try {
                f = Font.createFont(Font.TRUETYPE_FONT, resource.getInputStream());
            } catch (FontFormatException | IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        public static String getFontHex(String content, int x, int y, int size, int style) {
            if (content == null || "".equals(content)) {
                return "";
            }
            if (f == null) {
                f = getSelfDefinedFont("font/SIMHEI.TTF", style, size);
            } else {
                f = f.deriveFont(style, size);
            }
    //        f = new Font("simhei", Font.BOLD, size);
    
            gs.setFont(f);
            FontMetrics fontMetrics = gs.getFontMetrics();
            Rectangle2D stringBounds = fontMetrics.getStringBounds(content, gs);
            int width = (int) stringBounds.getWidth();
            width = (width + 7) / 8 * 8;
            int height = width;
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    //        image = modifyImageRatio(image,270);
    
            Graphics2D g2 = image.createGraphics();
    
            g2.setFont(f);
            g2.setColor(Color.BLACK);
            // 图片旋转
            g2.rotate(Math.toRadians(270), width / 2, height / 2);
            g2.drawString(content, 1, (int) (size * 0.88));
            g2.dispose();
    
            StringBuilder zpl = new StringBuilder("^FO").append(x).append(",").append(y)
                    .append(getImage(image)).append("^FS");
    
            return zpl.toString();
    
        }
    
        /**
         * 自定义字体
         * @param filepath 字体文件路径
         * @param style 样式
         * @param size 大小
         * @return
         */
        private static Font getSelfDefinedFont(String filepath, int style, float size){
    
            Font font = null;
            try{
                Resource resource = new ClassPathResource(filepath);
                font = Font.createFont(Font.TRUETYPE_FONT, resource.getInputStream());
                font = font.deriveFont(style, size);
            } catch (FontFormatException | IOException e){
                throw new RuntimeException(e);
            }
            return font;
        }
    
        private static final char[] HEX = "0123456789ABCDEF".toCharArray();
    
        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;
    
        }
    
    
        /**
         * Returns an array of ones or zeros. boolean is used instead of int for memory considerations.
         *
         * @param bi
         * @param w
         * @param h
         * @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;
        }
    
        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);
        }
    }
    

    这中间主要的问题就是汉字问题

    因为打印机中没有你设置的字体,所以打印出来的标签汉字不会显示,这里也看了网上蛮多方法都没有用,最后只好采取了汉字转图片打印图片的方式

    zpl指令转pdf打印

    本地驱动打印很ok,但是服务器不支持这种方式,新的问题来了。由于这种斑马打印机不能联网,根据实际需求也不会给打印机装上很贵的网卡。

    所以只有一条路了,回到当初,导出pdf,客户自己本机打印pdf

    zpl指令怎么转成pdf呢?

    还好网上的资源给力:
    http://labelary.com/service.html

    这里提供了接口供zpl指令转成pdf,只需通过http调用就好了,经测试ok

    package org.hzero.report.infra.util;
    
    
    import com.alibaba.fastjson.JSONObject;
    
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * zpl指令转pdf
     */
    public class Zpl2Pdf {
        /*public static void main(String[] args) {
        
            String zpl = "CT~~CD,~CC^~CT~^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR3,3~SD28^JUS^LRN^CI0^XZ^XA^MMT^PW695^LL0280^LS0^FO352,160^GFA,01152,01152,00012,:Z64:eJztj7FtwzAQRT9pGRJYqUjgxgZdCq5TptAIatJnBBWC1RggRxFcETdFVsgmLl0IUOTk7qQNUiS/enwk/5HAf34nxwW3b/VKLxs1MuUIK7g5lCbKwiUIZz7UUlRYGqSoNOHeav0piW/xUj6pr1Do2Ffsdax68/DZyvODTPQjcvGO1GPXN+pBSc+Xu1F9AfXwWPVAez7W3kY4eY95XzwG9TeExrMfQIP41oRO/nW011QxX/xnc2GuXERiPj/Pd5hP310/8RH5jdnNYyNz3iHUzJZA4s00TZAQkXLfd8pWjz8u4K/kCwjBNFw=:F8AD^FO544,160^GFA,00768,00768,00008,:Z64:eJztkbFtwzAQRT/p0AoEB1CTLkBUGtwhAEdw4y6BV3Dh0gY4CkvhptAIaoJUKryBAri1Zd6XMoHbHAh8PH7e8XgE/mOOOMnr9g+5YYBK1QLPqqtDWNL3yapUp6tRrb1ETQhuPLdMl5TZtPjuAjmhZrkBe5YjO+Vq5nzBEocBb8qe/ISvPpBLifTdOJBrm+jvzeSv2WCBI6b8Errl8DKzjcpFWFz0SCah35prq/3EUlJS3v38Drnf5KOy6T7huszNWnOA4waFvs/npfwRcdL3lykXzPF+KW6cl0jD+fV9x3mJJOpuDFTbTHM2m4d/7oG4AwAhQRY=:C6CC^FO192,160^GFA,00768,00768,00008,:Z64:eJzlkTFqAzEQRf8oGyuocrFkUxjSBlcpU65v4Ca4tI/ggGFL6ygqlzmFr2AI5BoOBFyFzfwdN2kDqfwZ+DwN+oxGwNUpXPx1eUE/qCAt/Q7I9LcjpmNfeQQszu81PauSBc0w8evKgAniKjpnBlS4yXJgnHON+Isf5MM56MhT6XawAZ6gigK8YDXIlpwT+VkOtyAHA6uZnGBl/X7kGjvIhvnJ+3hcMj8h9My/Rzw7z9UmQCPDOhqHrCEZx8UWDecvhQmQzxZ7vrcfC/LFMs0ZaNof1yd6Ui302HWt70vHfcrw7XtOxb1q//Jb/6wfQRs9bQ==:060F^FO0,192^GFA,01152,01152,00012,:Z64:eJztjzFOAzEQRb83axFppTXFbkMRpYxygihIsEdwYV8HuUQUHCFyiahSRpti9yiUOQJCaIMRM+McASSmen4z+jMG/mhdZyxe44XOjSUK4Q6KUT0/YuSHdqlFMWaIS+JSe8tBcwyfG4lvHfsNbvq5+AalrF2glrXZx+SLC88HjfUOs0A+3cM+VMcX8cpbmccwiS/hZL7GKudAct5MyPmqg+Z7VMweVvwJD8GQt2g79gfcH/hfVnnXsK8+pjviRtuG/bYK6Ilb/Z31U+YJeCfW6Rz2V3uYSKxcWkw8m8J5JIb3nhG3x1649U64Op+EkceBNf7rl9UXFGw0lw==:0DFA^FT412,135^BQN,2,4^FH\\^FDLA,7150000036^FS^FT574,127^BQN,2,4^FH\\^FDLA,7150000036^FS^FT522,124^A0B,14,14^FH\\^FD1234567891123^FS^FT234,136^BQN,2,4^FH\\^FDLA,7150000036^FS^FT685,117^A0B,14,14^FH\\^FD1234567891123^FS^FT54,133^BQN,2,4^FH\\^FDLA,7150000036^FS^FT350,128^A0B,14,14^FH\\^FD1234567891123^FS^FT173,126^A0B,14,14^FH\\^FD1234567891123^FS^PQ1,0,1,Y^XZ";
    
            String url = "http://api.labelary.com/v1/printers/8dpmm/labels/3.42x1.37/0/";
            for (int i = 0; i < 2; i++) {
                getPdf(url,zpl);
                url = "http://api.labelary.com/v1/printers/8dpmm/labels/3.42x1.37/1/";
            }
    
        }*/
    
        /**
         * zpl指令转List<InputStream>,, List<InputStream>合并生成新的PDF可参考另一篇博客
         * @param url 
         * @param zpls
         * @return
         */
        public static List<InputStream> bitchGetPdf(String url, List<String> zpls) {
            return bitchSend(url,zpls);
        }
    
        private static List<InputStream> bitchSend(String url0, List<String> zpls) {
            List<InputStream> inputStreamList = new ArrayList<>(zpls.size());
            zpls.forEach(zpl -> inputStreamList.add(send(url0,zpl)));
            return inputStreamList;
        }
    
        /**
         * zpl指令转InputStream
         * @param url
         * @param zpl
         * @return
         */
        public static InputStream getPdf(String url, String zpl) {
            return send(url,zpl);
            /*try {
                // 获取http客户端
                CloseableHttpClient client = HttpClients.createDefault();
                // get method
                HttpPost httpPost = new HttpPost(url);
    
    //            URIBuilder uriBuilder = new URIBuilder(url);
                // 第一种添加参数的形式
    //            uriBuilder.addParameter("name", "root");
    //            uriBuilder.addParameter("password", "123456");
                // 第二种添加参数的形式
                List<NameValuePair> list = new LinkedList<>();
                BasicNameValuePair param1 = new BasicNameValuePair("mode", "raw");
                BasicNameValuePair param2 = new BasicNameValuePair("raw", zpl);
                list.add(param1);
                list.add(param2);
    
                httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));
    //            uriBuilder.setParameters(list);
                // 通过httpget方式来实现我们的get请求
    //            HttpPost httpPost = new HttpPost(uriBuilder.build());
    
                // 传输的类型
                httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
    //            httpPost.addHeader("Content-Length", String.valueOf(zpl.length()));
                httpPost.addHeader("Accept", "application/pdf");
                // 通过client调用execute方法,得到我们的执行结果就是一个response,所有的数据都封装在response里面了
    
                CloseableHttpResponse response = client.execute(httpPost);
    
                // HttpEntity
                // 是一个中间的桥梁,在httpClient里面,是连接我们的请求与响应的一个中间桥梁,所有的请求参数都是通过HttpEntity携带过去的
                // 所有的响应的数据,也全部都是封装在HttpEntity里面
                if (response.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = response.getEntity();
                    return entity.getContent();
                } else {
                    throw new RuntimeException(response.getStatusLine().toString());
                }
            } catch (IOException ex) {
                ex.printStackTrace();
                throw new CommonException(ex);
            }*/
        }
    
        private static InputStream send(String url0, String param) {
            URL url;
            HttpURLConnection connection;
            try {
                //创建连接
                url = new URL(url0);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestMethod("POST");
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
                connection.setRequestProperty("Connection", "Keep-Alive");
                connection.setRequestProperty("Accept","application/pdf");
                connection.setConnectTimeout(30000);
                connection.setReadTimeout(30000);
                //POST请求
                DataOutputStream out = new DataOutputStream(connection.getOutputStream());
                JSONObject body = new JSONObject();
                body.put("mode", "raw");
                body.put("raw", param);
    
                out.write(body.toString().getBytes("UTF-8"));
                out.flush();
                out.close();
                return connection.getInputStream();
                //读取响应
                /*BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String lines;
                StringBuffer sb = new StringBuffer("");
                while ((lines = reader.readLine()) != null) {
                    lines = new String(lines.getBytes(), "utf-8");
                    sb.append(lines);
                }
                System.out.println(sb);
                reader.close();*/
            } catch (IOException e) {
                throw new RuntimeException("网络超时,请重试:" + e.toString());
            }
        }
    
        public static String convertStreamToString(InputStream is) {
            StringBuilder sb1 = new StringBuilder();
            byte[] bytes = new byte[4096];
            int size = 0;
    
            try {
                while ((size = is.read(bytes)) > 0) {
                    String str = new String(bytes, 0, size, "UTF-8");
                    sb1.append(str);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sb1.toString();
        }
    
        private static byte[] byteMergerAll(byte[]... values) {
            int length_byte = 0;
            for (byte[] value : values) {
                length_byte += value.length;
            }
            byte[] all_byte = new byte[length_byte];
            int countLength = 0;
            for (byte[] b : values) {
                System.arraycopy(b, 0, all_byte, countLength, b.length);
                countLength += b.length;
            }
            return all_byte;
        }
    
    }
    
    

    本来想着提高效率通过list的并行流去http请求,但是没想到会报429,于是又改回了正常的循环。

    最后,由于我这边是根据4个资产生成一个完成的zpl指令,然后得到一个pdf,实际场景中可能会选择许多资产,这样就会生成许多PDF,存在一个pdf合并问题。

    这里可以参考我的另外一边博客:
    https://blog.csdn.net/hunan961/article/details/104903890

    最后导出来的pdf非常完美,打印的效果也非常棒。

    操作效果可以看我提供给用户的操作文档:
    http://note.youdao.com/noteshare?id=9a49420d5b614409eea821a36ae6e064&sub=D8B629F5AD634DC0A4C6A964549A38CD

    展开全文
  • 这是斑马打印机PC端的demo,java语言开发,里面包括所用的相关文件。
  • 本人从网上找了几天,公司主要打印票据,在点击保存后,自动打印出单据,我用的java直接调用斑马打印机进行打印,并且不需要出现选择打印机界面。很好用!
  • 二维码的参数说明: QR Code的尺寸和数据信息、ECC校验、起始模式及最小单元尺寸都是有关系的,但假如选 择Auto起始模式时,在等同条件下,在一定的数据范围内,QR Code的尺寸是一样的。 ...

    二维码的参数说明:

    QR Code的尺寸和数据信息、ECC校验、起始模式及最小单元尺寸都是有关系的,但假如选

     

    择Auto起始模式时,在等同条件下,在一定的数据范围内,QR Code的尺寸是一样的。

     

    ^BQa,b,c,d,e

     

    a:旋转参数,对QR Code无效;

     

    b:QR code模式,1或2;(默认值:2(增强) 推荐  其他值:1(原创))

     

    c:最小单元放大倍数,1-10可选;

     

    d:校验等级,H Q M L

     

    e:字符模式,N数字,A字符,B字节,Kanji

    打印条形码参数说明:

    ^FO50,260^BY1,2^BCN,100,Y,N^FDSMJH2000544610^FS  

    ^FO{0},{1}^BY{2},{3}^BCN,{4},N,N^FD{5}^FS

              0起点X坐标 

             1起点Y坐标 

             2基本单元宽度 1-10       

             3宽窄比 2.0-3.0 增量0.1

             4条码高度

             5条码内容

     

    打印图形参数说明:

    ^FO50,50^GB300,200,2^FS

    ^FO{0},{1}^GB{3},{4},{2}^FS

    1. 0起点X坐标  
    2. 1起点Y坐标       
    3. 2边框宽度
    4. 3图形宽度,0表示打印一条竖线       
    5. 4矩形高度,0表示打印一条横线      

     

     

    打印英文参数说明:

    ^FO50,50^A0N,32,25^FDZEBRA^FS 

    ^FO{1},{2}^A" + Font + "{3},{4},{5}^FD{0}^FS

    1起点X坐标

    2起点Y坐标

    Font 字体

    3旋转角度

    N = normal正常的),

    R = rotated 90 degrees (clockwise)(顺时针旋转90°)

    I = inverted 180 degrees顺时针旋转180°

    B = read from bottom up, 270 degrees从底部往上旋转270°  

    4字体高度

    5字体宽度

    0打印文本

    展开全文
  • 斑马打印机开发使用的sdk,支持文字、图片、条形码、二维码等打印,支持本地、usb或tcp连接方式,调用 ZebraPrinterFactory
  • java开发的制作工作证和调用斑马ZXP Series 3C证卡打印机服务。分为两个文件,一个用来生成工作证的正反面,一个是将这个正反面用于打印制卡
  • 最近开发java程序调用斑马制卡机的功能,基本思路如下:1.利用java生成一个上岗证图片的正面和反面,2.java调用打印SDK打印彩色上岗证。 本次文章内容只涉及生成图片和打印两块功能,不涉及部署那一块。现在直接贴...
  • Is anyone know how to convert a image(such as *.bmp files) to HEX string in java,so the HEX string can used in the ^DG command(one of command in zpl).thanks!解决方案It's not easy. You have to convert ...
  • java实现ZEBRA斑马打印机 FNTHEX32.dll 打印图片和文字

    千次阅读 热门讨论 2014-10-30 14:37:52
    斑马打印中文的原理是使用FNTHEX32将中文转换成图片,再转换成
  • java调用斑马GK888t打印机(ZPL指令)

    千次阅读 2016-12-05 13:45:00
    在项目中使用斑马打印机遇到了如下问题: 在实际打印信息前,需要修改打印机驱动设置,主要是设置打印颜色深度,默认值一般会打印的比较浅。通常情况下,在设置的颜色深度后,打印机能够很好的工作。但是如果我将...
  • Java中JTbale使用3—表格的斑马线效果

    千次阅读 2011-11-12 20:39:38
    在表格中有时候我们需要添加斑马线效果,为了使阅读更加方便。今天我就分享一下斑马线效果的源代码,这里只使用了两种颜色,读者可以多设置几种。 import java.awt.Color; import java.awt.Component; import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,609
精华内容 643
关键字:

java斑马

java 订阅