java 实现二维码打印并设计标题

本文介绍了如何在JavaSpringBoot项目中使用Hutool库的QrCodeUtil生成二维码,并处理图片与文字的布局问题,包括图片宽度、高度和文字间距的设定。作者提到了可能存在的汉字显示不全问题以及解决方法。
摘要由CSDN通过智能技术生成

概要

小编最近业务需求牵扯到自动打印小票,小编一开始的思路前端处理打印功能奈何前端调用浏览器几乎都需要预览这一步,重点为何是几乎应为有些插件可以实现自动打印用能的可是但是需要“超能力”。于是只能专攻后端路线了,这里小编先给各位看官抽出java生成二维码一部分代码后续自动打印等功能后续一一解析。本文代码jar引入后可直接使用根据自身业务进行调整即可
环境:jdk8,maven
框架:SpringBoot
引用jar:

<!-- zxing生成二维码 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.3.3</version>
        </dependency>

成果描述:
在这里插入图片描述

源码

import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @ClassName 合成二维码工具类
 * @Description TODO
 * @Author wang yan
 * @Date 2023/8/30 9:35
 */
public class QrCoder {
    /**
     * 图片的宽度
     */
    private static final int IMAGE_WIDTH = 350;
    /**
     * 图片的高度
     */
    private static final int IMAGE_HEIGHT = 350;
    /**
     * 二维码的宽度
     */
    private static final int QR_CODE_WIDTH = 150;
    /**
     * 二维码的高
     */
    private static final int QR_CODE_HEIGHT = 150;
	/**
	* 文件格式
	*/
    private static final String FORMAT_NAME = "JPG";

    /**
     * @param imgLogo logo图片
     * @param title   头部标题
     * @param content 内容 <br/>
     * @param footer  底部文字
     */
    public static BufferedImage createQrCode(String imgLogo, String title, String content, String footer) {
        // 头部文字区域高度
        int titleHeight = 40;
        // 创建主模板图片
        BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D main = image.createGraphics();
        // 设置图片的背景色
        main.setColor(Color.white); //白色
        main.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
        // 动态高度
        int height = 0;
        //============页面头部 文字============
        Graphics2D titleRight = image.createGraphics();
        // 设置字体颜色
        titleRight.setColor(Color.black);
        Font titleFont = new Font("宋体", Font.BOLD, 25);
        titleRight.setFont(titleFont);
	    titleRight.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        // 居中 x开始的位置:(图片宽度-字体大小*字的个数)/2
        int x = (IMAGE_WIDTH - (titleFont.getSize() * title.length())) / 2;
        titleRight.drawString(title, x, (titleHeight) / 2 + 10);
        height += titleHeight;

        //==========中间文字部分======
        Graphics2D centerWord = image.createGraphics();
        // 设置字体颜色,先设置颜色,再填充内容
        centerWord.setColor(Color.black);
        Font wordFont = new Font("宋体", Font.PLAIN, 15);
        centerWord.setFont(wordFont);
        centerWord.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        String[] info = content.split("-");
        for (String s : info) {
            // x开始的位置:(图片宽度-字体大小*字的个数)/2
            int strWidth = centerWord.getFontMetrics().stringWidth(s);
            // 总长度减去文字长度的一半  (居中显示)
            int startX = (IMAGE_WIDTH - strWidth) / 2;
            height += 20;
            centerWord.drawString(s, startX, height);
        }

        //=====插入二维码图片======
        Graphics codePic = image.getGraphics();
        BufferedImage codeImg;
        QrConfig config = new QrConfig();
        config.setWidth(QR_CODE_WIDTH);
        config.setHeight(QR_CODE_HEIGHT);
        if (StrUtil.isNotBlank(imgLogo)) {
            config.setImg(imgLogo);
        }
        codeImg = QrCodeUtil.generate(content, config);
        // 绘制二维码
        codePic.drawImage(codeImg, (IMAGE_WIDTH - QR_CODE_WIDTH) / 2, height, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
        codePic.dispose();

        //=====底部文字===
        Graphics2D typeLeft = image.createGraphics();
        // 设置字体颜色
        typeLeft.setColor(Color.black);
        // 设置字体
        Font footerFont = new Font("宋体", Font.PLAIN, 10);
        typeLeft.setFont(footerFont);
        typeLeft.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        // x开始的位置:(图片宽度-字体大小*字的个数)/2
        int startX = (IMAGE_WIDTH - (footerFont.getSize() * footer.length())) / 2;
        height += QR_CODE_HEIGHT;
        typeLeft.drawString(footer, startX, height);
        return image;
    }
    /**
     * @param imgLogo logo图片
     * @param title   头部标题 多个以-隔开自动换行
     * @param middle  文字中间描述
     * @param content 内容
     * @param footer  底部文字
     */
    public static BufferedImage createQrCode(String imgLogo, String title,String middle, String content, String footer) {
        int titleHeight = 50;
        // 创建主模板图片
        BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D main = image.createGraphics();
        // 设置图片的背景色
        main.setColor(Color.white); 
        main.fillRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
        // 动态高度
        int height = 0;
        //=========页面头部 文字=====
        Graphics2D titleRight = image.createGraphics();
        // 设置字体颜色
        titleRight.setColor(Color.black);
        Font titleFont = new Font("宋体", Font.BOLD, 14);
        titleRight.setFont(titleFont);
        titleRight.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        // 居中 x开始的位置:(图片宽度-字体大小*字的个数)/2
        int x = (IMAGE_WIDTH - (titleFont.getSize() * title.length())) / 2;
        titleRight.drawString(title, x, (titleHeight) / 2 + 10);
        height += titleHeight;

        //======中间文字部分=====
        Graphics2D centerWord = image.createGraphics();
        // 设置字体颜色,先设置颜色,再填充内容
        centerWord.setColor(Color.black);
        Font wordFont = new Font("宋体", Font.PLAIN, 12);
        centerWord.setFont(wordFont);
        centerWord.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        String[] info = middle.split("-");
        for (String s : info) {
            // x开始的位置:(图片宽度-字体大小*字的个数)/2
            int strWidth = centerWord.getFontMetrics().stringWidth(s);
            // 总长度减去文字长度的一半  (居中显示)
            int startX = (IMAGE_WIDTH - strWidth) / 2;
            height += 20;
            centerWord.drawString(s, startX, height);
        }

        //====插入二维码图片======
        Graphics codePic = image.getGraphics();
        BufferedImage codeImg;
        QrConfig config = new QrConfig();
        config.setWidth(QR_CODE_WIDTH);
        config.setHeight(QR_CODE_HEIGHT);
        if (StrUtil.isNotBlank(imgLogo)) {
            config.setImg(imgLogo);
        }
        codeImg = QrCodeUtil.generate(content, config);
        // 绘制二维码
        codePic.drawImage(codeImg, (IMAGE_WIDTH - QR_CODE_WIDTH) / 2, height, QR_CODE_WIDTH, QR_CODE_HEIGHT, null);
        codePic.dispose();

        //=====底部描述=====
        if (StrUtil.isNotBlank(footer)){
            Graphics2D typeLeft = image.createGraphics();
            // 设置字体颜色
            typeLeft.setColor(Color.black);
            Font footerFont = new Font("宋体", Font.PLAIN, 10);
            typeLeft.setFont(footerFont);
            typeLeft.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
            // x开始的位置:(图片宽度-字体大小*字的个数)/2
            int startX = (IMAGE_WIDTH - (footerFont.getSize() * footer.length())) / 2;
            height += QR_CODE_HEIGHT;
            typeLeft.drawString(footer, startX, height);
        }
        return image;
    }


    // 生成图片文件
    public static void createImage(BufferedImage image, String fileLocation) {
        if (image != null) {
            try {
                ImageIO.write(image, "png", new File(fileLocation));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

以上就是生成二维码的基础配置代码了,根据个人需求进行调整

调用

public static void main(String[] args) throws IOException, PrinterException {
 String content = "A00180901000001";
        BufferedImage bufferedImage = createQrCode(null, "计量打印","车牌号:A86fg-运单号"+ content +"-发货单位:上海码头" + "-2023/08/30", content, null);
        createImage(bufferedImage, "D:/test6.png");

}

小结

创建spring项目引入相关jar包对mave没有特殊要求 jdk8,以上就是实现整体流程,有点让小编琢磨不透的是 二维码图片渲染与文字接触部分可能会存在汉字展示不全问题,所以小编这里二维码与文字接触部以时间隔开了;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值