记录一次java生成条形码并调用打印机打印

生成条形码需要ja坐标:

        <!--生成条形码-->
        <dependency>
            <groupId>net.sf.barcode4j</groupId>
            <artifactId>barcode4j-light</artifactId>
            <version>2.0</version>
        </dependency>

调用打印机java使用自身带有的print就可以做到

我们先生成条形码:generateFile方法传入需要条形码包含的信息和生成的路径就可以

package com.hongseng.app.config.barcode;

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;

import java.awt.image.BufferedImage;
import java.io.*;

/**
 *
 * @program: fire
 * @description:
 * @author: fbl
 * @create: 2021-08-11 10:24
 **/
public class BarcodeUtil {
    /**
     * 生成文件s
     *
     * @param msg
     * @param path
     * @return
     */
    public static File generateFile(String msg, String path) {
        File file = new File(path);
        try {
            generate(msg, new FileOutputStream(file));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
        return file;
    }

    /**
     * 生成字节
     *
     * @param msg
     * @return
     */
    public static byte[] generate(String msg) {
        ByteArrayOutputStream ous = new ByteArrayOutputStream();
        generate(msg, ous);
        return ous.toByteArray();
    }

    /**
     * 生成到流
     *
     * @param msg
     * @param ous
     */
    public static void generate(String msg, OutputStream ous) {
        if (msg == null || msg.equals("") || ous == null) {
            return;
        }
        Code39Bean bean = new Code39Bean();
        // 精细度
        final int dpi = 150;
        // module宽度
        final double moduleWidth = UnitConv.in2mm(1.0f / dpi);

        // 配置对象
        bean.setModuleWidth(moduleWidth);
        bean.setWideFactor(3);
        bean.doQuietZone(false);

        String format = "image/png";
        try {
            // 输出到流
            BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
                    BufferedImage.TYPE_BYTE_BINARY, false, 0);
            // 生成条形码
            bean.generateBarcode(canvas, msg);
            // 结束绘制
            canvas.finish();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在指定路径生产条形码之后,将路径作为参数调用接口打印

第一个参数是路径,其余四个参数是纸张和图片的尺寸

package com.hongseng.app.config.barcode;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.print.*;
import java.io.IOException;
import java.net.URL;

import static java.awt.print.Printable.PAGE_EXISTS;

/**
 * @program: fire
 * @description:
 * @author: fbl
 * @create: 2021-08-11 10:03
 **/
public  class PrintDemo {
    public static void qrCodePrint(String path, int pageWidth, int pageHeight, int showWidth, int showHeight) {
        // 通俗理解就是书、文档
        Book book = new Book();
        // 设置成竖打
        PageFormat pf = new PageFormat();
        pf.setOrientation(PageFormat.PORTRAIT);
        // 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
        Paper p = new Paper();
        //纸张大小
        p.setSize(pageWidth, pageHeight);
        p.setImageableArea(0, 0, pageWidth, pageHeight);
        pf.setPaper(p);
        // 把 PageFormat 和 Printable 添加到书中,组成一个页面
        book.append((graphics, pageFormat, pageIndex) -> {
            try {
                URL url = new URL(path);//也可以通过file构建一个本地图片File对象传递给ImageIO.read()方法
                Image image = ImageIO.read(url);
                //将图片绘制到graphics对象中(为什么把需要打印的内容drawImage就可以实现打印自己取看值传递一引用传递的区别)
                graphics.drawImage(image, 0, 0, showWidth, showHeight, null);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return PAGE_EXISTS;//返回0(PAGE_EXISTS)则执行打印,返回1(NO_SUCH_PAGE)则不执行打印
        }, pf);
        // 获取打印服务对象
        PrinterJob job = PrinterJob.getPrinterJob();
        // 设置打印类
        job.setPageable(book);
        try {
            //可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印
            job.print();
        } catch (PrinterException e) {
            e.printStackTrace();
        }
    }
}

我的service层将两个工具类协同调用

package com.hongseng.app.service.barcode;

import com.hongseng.app.config.barcode.BarcodeUtil;
import com.hongseng.app.config.barcode.PrintDemo;
import model.dto.barcode.BarCodeDto;
import model.dto.barcode.PicturePrintDto;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import result.Result;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.UUID;

/**
 * @program: fire_control
 * @description:
 * @author: fbl
 * @create: 2021-04-01 09:55
 **/
@Service
public class BarCodeService {

    @Value("${spring.servlet.multipart.location}")
    private String picturePath;

    @Value("${server.port}")
    private String port;

    public void prodCode(BarCodeDto barCodeDto) {
        String codeName = UUID.randomUUID().toString().replaceAll("-", "") + ".png";
        String path = picturePath + codeName;
        // 生成条形码图片
        BarcodeUtil.generateFile(barCodeDto.getId() + "", path);

        InetAddress localHost = null;
        try {
            localHost = Inet4Address.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        String ip = localHost.getHostAddress();
        // 上传图片
        String finalPath =  "http://" + ip + ":" + port + "/file/" + codeName;

        // 打印图片
        // 打印
        PrintDemo.qrCodePrint(finalPath, barCodeDto.getPageWidth(), barCodeDto.getPageHeight(), barCodeDto.getShowWidth(), barCodeDto.getShowHeight());
    }
 
}


BarCodeDto 类参数:

package model.dto.barcode;

import lombok.Data;

import javax.validation.constraints.NotNull;

/**
 * @program: temperature-statistics
 * @description:
 * @author: fbl
 * @create: 2021-08-12 08:19
 **/
@Data
public class BarCodeDto {
    @NotNull
    private Integer id;

    @NotNull
    private Integer pageWidth;

    @NotNull
    private Integer pageHeight;

    @NotNull
    private Integer showWidth;

    @NotNull
    private Integer showHeight;
}

controller层调用就不写了

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java的开源库ZXing来批量生成条形码,并使用Java打印API来自定义打印机打印这些条形码。 下面是一个简单的示例代码: ```java import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.oned.Code128Writer; import com.google.zxing.qrcode.QRCodeWriter; public class BarcodeGenerator { private static final int WIDTH = 300; private static final int HEIGHT = 100; private static final String FORMAT = "png"; public static void main(String[] args) throws IOException, WriterException { String[] barcodes = {"1234567890", "0987654321", "5555555555"}; for (String barcode : barcodes) { BufferedImage image = generateBarcode(barcode); printBarcode(image); } } private static BufferedImage generateBarcode(String barcodeText) throws WriterException { Code128Writer writer = new Code128Writer(); BitMatrix bitMatrix = writer.encode(barcodeText, BarcodeFormat.CODE_128, WIDTH, HEIGHT); return MatrixToImageWriter.toBufferedImage(bitMatrix); } private static void printBarcode(BufferedImage image) throws IOException { // Replace with your own printer name String printerName = "MyPrinterName"; // Create a PrinterJob PrinterJob printerJob = PrinterJob.getPrinterJob(); printerJob.setPrintService(findPrintService(printerName)); // Set the page format PageFormat pageFormat = printerJob.defaultPage(); Paper paper = pageFormat.getPaper(); paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); pageFormat.setPaper(paper); printerJob.setPrintable((graphics, pageFormat, pageIndex) -> { if (pageIndex == 0) { Graphics2D g2d = (Graphics2D) graphics; g2d.drawImage(image, 0, 0, null); return Printable.PAGE_EXISTS; } else { return Printable.NO_SUCH_PAGE; } }, pageFormat); // Print the image printerJob.print(); } private static PrintService findPrintService(String printerName) { PrintService[] printServices = PrinterJob.lookupPrintServices(); for (PrintService printService : printServices) { if (printService.getName().equals(printerName)) { return printService; } } return null; } } ``` 在此例中,我们使用Code128Writer生成Code 128条形码,将其转换为BufferedImage格式,然后使用Java打印API打印条形码。请注意,您需要将示例代码中的打印机名称更改为您自己的打印机名称,以便正确打印条形码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值