二维码带背景导出数据

主要使用 hutool 的二维码工具类及图片工具类,实现给二维码添加背景图,增加自定义文字的效果。

并实现了二维码的展示与打包下载。

Controller层

@GetMapping("testOutput")
@ApiOperation(value = "测试输出单张图片")
public void testOutput(HttpServletResponse response)
{
	//背景图地址,resources 目录下
	String fileSource = "static/img/bg.png";
	//二维码配置
	QrConfig config = new QrConfig(300, 300);
	//二维码内容
	String content = "我是二维码内容";
	ByteArrayInputStream input = cultureEnrollService.getQrCodeUrl(fileSource, config, content,0, 170,
			"文本一", 24, 0, -280,
			"文本二", 24, 0, 350);
	try {
		response.setContentType("image/png");
		response.setCharacterEncoding("utf-8");
		// 下载文件
//            response.setHeader("Content-disposition", "attachment;filename*=utf-8''img.png");
		ServletOutputStream out = response.getOutputStream();
		byte[] buffer = new byte[1024];
		int r = 0;
		while ((r = input.read(buffer)) != -1) {
			out.write(buffer, 0, r);
		}
		out.flush();
	} catch (IOException e) {
		throw new RuntimeException(e);
	}
}

@GetMapping("testOutput2")
@ApiOperation(value = "测试输出压缩文件")
public void testOutput2(HttpServletResponse response)
{
	try {
		cultureEnrollService.batchDownload(response);
	} catch (IllegalAccessException e) {
		throw new RuntimeException(e);
	} catch (IOException e) {
		throw new RuntimeException(e);
	}
}

Service 层

/**
     * 两个图片合并(加文字) 文件格式
     *
     * @param sourceUrl    底部背景图
     * @param qrContent    二维码内容
     * @param qrX          二维码横坐标
     * @param qrY          二维码纵坐标
     * @param name1  文字1(一般为标题)
     * @param fontSize1 文字1大小
     * @param fontX1    文字1的横坐标
     * @param fontY1    文字1的纵坐标
	 * @param name2  文字2(一般为标题)
     * @param fontSize2 文字2大小
     * @param fontX2    文字2的横坐标
     * @param fontY2    文字2的纵坐标
     * @return
     */
    @Override
    public ByteArrayInputStream getQrCodeUrl(String sourceUrl,
                                             QrConfig config,
                                             String qrContent,
                                             int qrX,
                                             int qrY,
                                             String name1,
                                             int fontSize1,
                                             int fontX1,
                                             int fontY1,
                                             String name2,
                                             int fontSize2,
                                             int fontX2,
                                             int fontY2) {
        //二维码设置
//        QrConfig config = new QrConfig(300, 300);
        //1,生成二维码
        BufferedImage qrImage = QrCodeUtil.generate(qrContent, config);

        // 2,将图片合成在一起
        Image image = ImgUtil.pressImage(
                //底图
                ImgUtil.read(sourceUrl),
                //二维码图(水印图)
                qrImage,
//                ImgUtil.read(codeFile),
                qrX,
                //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                qrY,
                //透明度
                1.0f
        );
        //3,加企业文字
        Image image1 = ImgUtil.pressText(
                image,
                //title
                name1,
                //颜色
                Color.YELLOW,
                //字体 42
                new Font("黑体", Font.BOLD, fontSize1),
                //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                fontX1,
                //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                fontY1,
                //透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
                1.0f
        );
        //4,文字2
        Image image2 = ImgUtil.pressText(
                image1,
                //title
                name2,
                //颜色
                Color.YELLOW,
                //字体 42
                new Font("黑体", Font.BOLD, fontSize2),
                //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                fontX2,
                //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                fontY2,
                //透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
                1.0f
        );
        //转为流
        ByteArrayInputStream inputStream = ImgUtil.toStream(image2, "png");
        return inputStream;
    }

    @Override
    public void batchDownload(HttpServletResponse response) throws IOException {
        //背景图地址,resources 目录下
        String fileSource = "image/bg.png";
        //文件的名称
        String downloadFilename = "二维码.zip";
        //转换中文否则可能会产生乱码
        downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
        // 指明response的返回对象是文件流
        response.setContentType("application/octet-stream");
        // 设置在下载框默认显示的文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);
        ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
        //二维码配置
        QrConfig config = new QrConfig(300, 300);
        //查询业务信息
        List<String> list = new ArrayList<>();
        list.add("这是业务对象1");
        list.add("这是业务对象2");
        // 对企业进行遍历,填充对应信息
        for (String s : list) {
            ByteArrayInputStream input = this.getQrCodeUrl(fileSource, config, s,0, 170,
                    "读取文本一", 24, 0, -280,
                    "读取文本二", 24, 0, 350);
            zos.putNextEntry(new ZipEntry("图片文件名.png"));
            byte[] buffer = new byte[1024];
            int r = 0;
            while ((r = input.read(buffer)) != -1) {
                zos.write(buffer, 0, r);
            }
            input.close();
        }
        zos.flush();
        zos.close();
    }

具体引入包

import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

hutool本身是不引入 zxing 的,但是 qrcode 工具类依赖了 zxing,还需要额外引入 zxing。

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.2</version>
</dependency>
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值