java关于zpl打印黑白贴纸图片

参考:

(1)打印前的图片处理:https://www.doc88.com/p-9713794083891.html

(2)常用的zpl命令:https://www.cnblogs.com/LiGengMing/p/5646244.html

(3)zpl命令大全:https://blog.csdn.net/tianqin20140902/article/details/44200421/

(4)ZPLII命令大全:https://blog.csdn.net/flon/article/details/1510961?locationNum=6

(5)条形码支持字符范围及长度限制https://www.cnblogs.com/zhuiluoyu/p/5505133.html

 

我:

(1)zpl命令类:

/**
 * @date 2020-06-08
 * @author wuguixin 吴桂鑫
 * @qq 1393180819
 */
package utils.bt;

/**
 * zpl命令
 * https://www.cnblogs.com/LiGengMing/p/5646244.html
 * https://blog.csdn.net/tianqin20140902/article/details/44200421/
 * https://www.doc88.com/p-9713794083891.html
 * https://www.cnblogs.com/hikarusun/archive/2012/08/10/2631707.html
 * https://blog.csdn.net/flon/article/details/1510961?locationNum=6
 */
public interface ZPLCons
{
    // 父指令: 起始指令   子指令内容    终止指令
    interface PARENT{
        // 起始指令
        String KEYWORD_1 = "^XA";
        // 终止指令
        String KEYWORD_2 = "^XZ";
        interface VAR {
            //  指令内容
            String PARENT_COMMAND_CONTENT = "[PARENT_COMMAND_CONTENT]";
        }
        String COMMAND = KEYWORD_1
                + VAR.PARENT_COMMAND_CONTENT
                + KEYWORD_2;
    }

    // 位置指令: 本行开始相对于起始位置的坐标  指令内容  本行结束
    interface POSITION {
        // 本行开始相对于起始位置的坐标
        String KEYWORD_1 = "^FO";
        // 本行结束
        String KEYWORD_2 = "^FS";
        interface VAR {
            // 本行开始相对于起始位置的坐标x
            String FO_X = "[FO_X]";
            // 本行开始相对于起始位置的坐标y
            String FO_Y = "[FO_Y]";
            //  指令内容
            String POSITION_COMMAND_CONTENT = "[POSITION_COMMAND_CONTENT]";
        }
        String COMMAND = KEYWORD_1 + VAR.FO_X + "," + VAR.FO_Y
                + VAR.POSITION_COMMAND_CONTENT
                + KEYWORD_2;
    }

    // 首选项参数
    interface PREFERENCES{
        interface VAR {
            // 标签打印起始位置x
            String LH_X = "[LH_X]";
            // 标签打印起始位置y
            String LH_Y = "[LH_Y]";
            // 打印方向
            String ORIENTATION = "[ORIENTATION]";
            // 是否旋转(N否Y是)
            String ROTATE_FLAG = "[ROTATE_FLAG]";
        }
        String COMMAND = "^LH" + VAR.LH_X + "," + VAR.LH_Y
                + "^PO" + VAR.ORIENTATION
                + "^LR" + VAR.ROTATE_FLAG;
    }


    // 打印EAN-13 : ^BE 旋转角度,高度点数,是否条形码底下印字,是否条形码上面印字    打印的文字
    interface EAN13{
        // EAN-13
        String KEYWORD_1 = "^BE";
        interface VAR {
            // 高度点数
            String EAN13_HEIGHT = "[EAN13_HEIGHT]";
            // 打印的文字
            String EAN13_VAL = "[EAN13_VAL]";
        }
        String COMMAND = KEYWORD_1
                + "N,"
                + VAR.EAN13_HEIGHT + ","
                + "Y,N"
                + "^FD" + VAR.EAN13_VAL;
    }


    // 打印位图(8个像素为1个字节):压缩类型,传输字节总数,图形字节总数,图形每行字节总数,位图的16进制数据
    interface IMAGE{
        // 位图
        String KEYWORD_1 = "^GF";
        interface VAR {
            String IMAGE_TRANS_BYTES = "[IMAGE_TOTAL_BYTES]";
            String IMAGE_TOTAL_BYTES = "[IMAGE_TOTAL_BYTES]";
            String IMAGE_WIDTH_BYTES = "[IMAGE_WIDTH_BYTES]";
            String IMAGE_HEX_DATA = "[IMAGE_HEX_DATA]";
        }
        String COMMAND = KEYWORD_1
                + "A,"
                + VAR.IMAGE_TRANS_BYTES + ","
                + VAR.IMAGE_TOTAL_BYTES + ","
                + VAR.IMAGE_WIDTH_BYTES + ","
                + VAR.IMAGE_HEX_DATA;
    }

    // 字体声明
    interface FONT{
        // utf8编码    码表  字体声明
        String KEYWORD_1 = "^CW";
        interface VAR{
            // 字体标识:A-Z,0-9(打印机的任何字体,包括下载字体,EPROM中储存的,当然这些字体必须用^CW来定义为A-Z,0-9)
            String FONT_ID = "[FONT_ID]";
            // 字体fnt文件名称
            String FONT_FNT_FILE_NAME = "[FONT_FNT_FILE_NAME]";
        }
        String COMMAND = "^CI28" // 中文utf8编码
                + "^SEE:GB18030.DAT" // 中文码表
                + KEYWORD_1 + VAR.FONT_ID + "," + "E:" + VAR.FONT_FNT_FILE_NAME + ".FNT"; // 字体id与名称映射
    }

    // 文本打印:^Af,o,h,w:  ^A@o,h,w,n
    interface TEXT{
        String KEYWORD_1 = "^A";
        String KEYWORD_2 = "^FD";
        interface VAR{
            // 字体标识:A-Z,0-9(打印机的任何字体,包括下载字体,EPROM中储存的,当然这些字体必须用^CW来定义为A-Z,0-9)
            String FONT_ID = "[FONT_ID]";
            // 字体方向: N = 正常、 R = 顺时针旋转90度、 I = 顺时针旋转180度、B = 顺时针旋转270度
            String FONT_ORIENTATION = "[FONT_ORIENTATION]";
            // 字体宽度
            String FONT_WIDTH = "[FONT_WIDTH]";
            // 字符高度:曲线字体(10-1500点)、点阵字体(2-10)
            String FONT_HEIGHT = "[FONT_HEIGHT]";
            // 打印的文字
            String TEXT_VAL = "[TEXT_VAL]";
        }
        String COMMAND = KEYWORD_1
                + VAR.FONT_ID + ","
                + VAR.FONT_ORIENTATION + ","
                + VAR.FONT_HEIGHT + ","
                + VAR.FONT_WIDTH
                + KEYWORD_2 + VAR.TEXT_VAL;
    }
}

(2)图片处理类:

        <!-- 工具类包,如StringUtils.isBlank -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>

    
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>

        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>net.sf.barcode4j</groupId>
            <artifactId>barcode4j</artifactId>
            <version>2.1</version>
        </dependency>
/**
 * @date 2020-06-08
 * @author wuguixin 吴桂鑫
 * @qq 1393180819
 */
package utils.bt;


import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.apache.commons.lang3.StringUtils;
import org.krysalis.barcode4j.impl.upcean.EAN13Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.MimeTypes;
import sun.font.FontDesignMetrics;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Hashtable;
import java.util.List;

/**
 * @author wuguixin吴桂鑫
 * @qq 1393180819
 * @time 2011-07-20
 * @description 图片旋转、翻转、合并处理、二维码、商品条形码生成
 */
public class ImgUtils
{
    static int Up_Down_Reverse = 0;
    static int Left_Right_Reverse = 1;

    /**
     * 旋转图片为指定角度
     *
     * @param bufferedimage 目标图像
     * @param degree        旋转角度
     * @return
     */
    public static BufferedImage rotateImage(final BufferedImage bufferedimage, final int degr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Java中使用ZPL打印中文,首先需要确保打印机支持中文字符,并正确设置打印机的配置。 首先,确保在打印机上安装了支持中文的字库,例如TrueType字体。 然后,需要设置打印机的字符编码为UTF-8,以支持中文字符的打印。 接下来,我们可以在Java代码中使用ZPL指令来打印中文字符。例如,使用^CI命令设置打印机使用中文字符集,使用^FD命令在标签上打印中文文本。 以下是一个示例代码片段,展示了如何使用JavaZPL打印中文字符: ```java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class ZPLPrinter { public static void main(String[] args) { String ipAddress = "打印机IP地址"; int port = 9100; try { Socket socket = new Socket(ipAddress, port); OutputStream os = socket.getOutputStream(); // 设置打印机字符编码为UTF-8 os.write("^XA^CI28^XZ".getBytes("UTF-8")); // 打印中文文本 String chineseText = "你好,世界!"; os.write(("^XA^FO20,20^A0N,30,30^FD" + chineseText + "^FS^XZ").getBytes("UTF-8")); os.flush(); os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们首先创建一个与打印机的Socket连接。然后,通过输出流向打印机发送ZPL指令,其中`^XA^CI28^XZ`用于设置字符集为UTF-8,并使用`^FD`和`^FS`将中文文本添加到标签。 ### 回答2: Java ZPL 是一种用于打印标签的编程语言和格式,它通常用于商业和物流行业中。 要在 Java ZPL打印中文,我们需要确保打印机的设置和标签格式正确。首先,我们需要设置打印机支持中文字符集。这通常需要在打印机的控制面板或Web界面中进行设置。 接下来,我们需要创建一个包含中文字符的 ZPL 标签模板。我们可以使用 ZPL 命令 "^FB" 来指定文本块的宽度、高度和对齐方式。例如,"^FO" 表示文本块的起始位置,"^FD" 表示要打印的文本。 下面是一个简单的示例,演示如何在 Java ZPL打印中文: ``` String zplCode = "^XA^FO50,50^FB200,4,,C^A0N,40,40^FD你好世界^FS^XZ"; ``` 在上面的示例中,"^XA" 和 "^XZ" 表示 ZPL 标签文件的起始和结束。"^FO50,50" 指定了文本块的起始位置。"^FB200,4,,C" 表示文本块的宽度为200个点、高度为4行,并使用居中对齐方式。"^A0N,40,40" 指定了字体和大小。"^FD你好世界^FS" 表示要打印的中文文本是"你好世界"。 最后,我们可以使用 Java 中的打印机驱动程序或第三方库,将生成的 ZPL 代码发送给打印机进行打印。 ### 回答3: 在Java中使用ZPL(Zebra Programming Language)打印中文,需要进行一些特殊的处理。这是因为ZPL是专门用于打印标签的一种编程语言,而标签通常使用英文或ASCII字符,不直接支持中文字符的打印。 要在ZPL打印中文,需要将中文字符转换为对应的Unicode编码,并以^FH指令来告知打印机使用Unicode编码进行打印。例如,要打印中文字符"你好",可以将其转换为Unicode编码"\u4F60\u597D",然后将其插入到ZPL代码的相应位置。 同时需要注意,打印机必须支持Unicode编码才能正确打印中文字符。如果打印机不支持,则无法实现中文打印。 以下是一个简单的示例,演示如何在Java中使用ZPL打印中文: ```java import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import java.io.ByteArrayOutputStream; public class ZPLPrinter { public static void main(String[] args) { String zplCode = "^XA^CI28^FO50,50^A@N,50,50,E:SIMSUN.FNT^FD^FH\\^FS^XZ"; String chineseText = "你好"; String unicodeText = getUnicodeString(chineseText); zplCode = zplCode.replace("^FD", "^FD" + unicodeText); printZPL(zplCode); } public static String getUnicodeString(String chineseText) { StringBuilder unicodeText = new StringBuilder(); for (char c : chineseText.toCharArray()) { unicodeText.append("\\u").append(Integer.toHexString(c)); } return unicodeText.toString(); } public static void printZPL(String zplCode) { try { BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); ByteArrayOutputStream output = new ByteArrayOutputStream(); ImageIO.write(image, "png", output); byte[] imageData = output.toByteArray(); String zplCommand = "^XA^MNN^LL300^POI^PW600^FO20,30^GFA,"; zplCommand += imageData.length + "," + imageData.length + "," + imageData.length / 8 + ","; zplCommand += getHexString(imageData) + "^FS^XZ"; // 打印ZPL命令 // printer.write(zplCommand.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public static String getHexString(byte[] data) { StringBuilder hexString = new StringBuilder(); for (byte b : data) { String hex = Integer.toHexString(0xFF & b); if (hex.length() == 1) { hexString.append('0'); } hexString.append(hex); } return hexString.toString(); } } ``` 上述代码通过使用ZPL指令^A@N可以设置字体为SIMSUN.FNT,并通过^FD^FH\\^FS指令告知打印机使用Unicode编码。然后将Unicode编码的中文插入到ZPL代码中的相应位置。最后,使用打印机相关API发送ZPL命令给打印机,从而实现中文字符的打印。 请注意以上示例中的zplCommand的内容需要根据实际情况进行修改,包括打印机的相关设置和连接方式等。此外,该示例只是简单演示了通过ZPL打印中文的一个思路,具体的实现可能会因打印机型号和相关驱动的差异而有所不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值