参考:
(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