使用java 转换zpl标签

76 阅读1分钟

斑马公司的打印机需要用到zpl语言,但是,zpl在线转换🔗 Labelary ZPL Image Converter是有次数限制的,根本满足不了大量的需求,现在搞一个本地的转换器

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;

public class ZplImageConverter {

    public static void main(String[] args) throws IOException {
        String imageUrl = "https://example.com/image.png"; // 改成你的图片地址
        BufferedImage image = ImageIO.read(new URL(imageUrl));

        // 1. 转为黑白图像
        BufferedImage monochrome = convertToBlackWhite(image);

        // 2. 转为 ZPL
        String zpl = convertToZpl(monochrome);
        System.out.println(zpl);
    }

    // 将图像转换为黑白(单色)图像
    public static BufferedImage convertToBlackWhite(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();
        BufferedImage bwImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
        Graphics2D g2d = bwImage.createGraphics();
        g2d.drawImage(image, 0, 0, null);
        g2d.dispose();
        return bwImage;
    }

    // 将黑白图像转换为 ZPL 格式
    public static String convertToZpl(BufferedImage image) {
        int width = image.getWidth();
        int height = image.getHeight();

        int bytesPerRow = (int) Math.ceil(width / 8.0);
        int totalBytes = bytesPerRow * height;

        StringBuilder sb = new StringBuilder();
        sb.append("^XA\n");
        sb.append("^FO0,0^GFA,")
          .append(totalBytes).append(",")
          .append(totalBytes).append(",")
          .append(bytesPerRow).append(",\n");

        for (int y = 0; y < height; y++) {
            StringBuilder row = new StringBuilder();
            int bitBuffer = 0;
            int bitCount = 0;
            for (int x = 0; x < width; x++) {
                int color = image.getRGB(x, y);
                boolean isBlack = (color & 0xFFFFFF) == 0x000000;

                bitBuffer = (bitBuffer << 1) | (isBlack ? 1 : 0);
                bitCount++;

                if (bitCount == 8 || x == width - 1) {
                    row.append(String.format("%02X", bitBuffer << (8 - bitCount)));
                    bitBuffer = 0;
                    bitCount = 0;
                }
            }
            sb.append(row).append("\n");
        }

        sb.append("^FS\n^XZ");
        return sb.toString();
    }
}