-
2022-03-07 16:29:41
生成二维码,选择一张海报,然后生成二维码并下载,
主要代码
生成二维码代码///生成二维码 var qrcode = new QRCode("qrcode"); // 生成二维码的方法 function makeCode () { // 二维码地址 var ewmSrc='http://h5.afocus.net/2022/cs/3/v2.html' qrcode.makeCode(ewmSrc); setTimeout(function () { var ewmSrc=$('#qrcode').find('img').attr('src') // console.log(ewmSrc) },100) } makeCode();
合成画布并自动下载
function hecheng() { base64 = []; draw(function() { // document.getElementById('imgBox').innerHTML = '<img src="' + base64[0] + '">'; // document.getElementById('downloadPic').href = base64[0]; }) //自动下载 setTimeout(function () { $("#downloadPic").click(); document.getElementById("downloadPic").click(); // $("#downloadPic")[0].click(); },500) } function draw(fn) { var hbxzBj= $('#pxfmxz_tc .haib_ylt .yulan span').find('img').attr('src') hbImgSrc.splice(0,1,hbxzBj) // console.log(hbImgSrc) // var c = document.createElement('canvas'); var c = document.getElementById('mycanvas') ctx = c.getContext('2d'); len = hbImgSrc.length; c.width = 750; c.height = 1250; ctx.rect(0, 0, c.width, c.height); ctx.fillStyle = '#fff'; ctx.fill(); function drawing(n) { if(n < len) { var img = new Image; //img.crossOrigin = 'Anonymous'; //解决跨域 img.src = hbImgSrc[n]; img.onload = function() { if(n == 1) { ctx.beginPath(); ctx.rect(240 , 840 , 280 , 280); ctx.fillStyle = '#fff'; ctx.fill(); ctx.font="normal bold 24px Arial,sans-serif" ctx.fillStyle = "#000"; ctx.fillText("长按识别二维码",294,1157); ctx.fillStyle="#fff"; ctx.font="30px Arial" ctx.textBaseline = 'middle'; //设置文本的垂直对齐方式 ctx.textAlign = 'center';//设置文本的水平对齐方式 // ctx.fillText(hbText,c.width/2,518); ctx.lineWidth=10; var lineWidth = 0; var canvasWidth = c.width-80;//计算canvas的宽度 var initHeight=40;//绘制字体距离canvas顶部初始的高度 var lastSubStrIndex= 0; //每次开始截取的字符串的索引 for(let i=0;i<hbText.length;i++){ lineWidth+=ctx.measureText(hbText[i]).width; if(lineWidth>canvasWidth){ ctx.fillText(hbText.substring(lastSubStrIndex,i),c.width/2,initHeight+400);//绘制截取部分 initHeight+=40;//20为字体的高度 lineWidth=0; lastSubStrIndex=i; } if(i==hbText.length-1){//绘制剩余部分 ctx.fillText(hbText.substring(lastSubStrIndex,i+1),c.width/2,initHeight+400); } } ctx.drawImage(img, 251 , 853 , 256 , 256); //121和129表示二维码距离背景图片左上角的X轴,Y轴,160表示生成的图片中二维码的大小 } else { ctx.drawImage(img, 0, 0, c.width, c.height); } drawing(n + 1); //递归 } } else { //保存生成作品图片 base64.push(c.toDataURL()); //通过canvas.toDataURL转成base64. // console.log(JSON.stringify(base64)); $('#imgBox').html('<img src="' + base64[0] + '">') $('#downloadPic').attr('href', base64[0]) fn(); } } drawing(0); }
更多相关内容 -
二维码字体
2019-04-01 15:13:40用于显示二维码的字体, -
qrcode 二维码 字體
2013-08-01 15:54:04二维码單字體 使用方便 不用其他程式可生成二维码 -
免费二维码字体,用于显示字符二维码
2022-02-08 14:52:57免费二维码字体,用于显示字符二维码 -
二维条码字体
2014-03-23 08:33:50这是开发条码系统所需要使用到的二维条码字体. -
二维码和条形码的生成
2017-08-25 11:06:45二维码和条形码的生成 -
WPS插件 自动生成二维码4.0版.zip
2020-06-05 17:34:00本工具可以自动生成二维码,只要提前设置好参数(包含使用哪些单元格生成二维码、二维码的尺寸、二维码的放置位置,分隔符),用户修改单元格中的值时,程序会全自动生成相应的二维码。 自带GIF动画教材。 -
C#利用QrCode.Net生成二维码(Qr码)的方法
2020-09-01 01:13:03QrCode.Net是一个使用C#编写的用于生成二维码图片的类库,使用它可以非常方便的为WinForm、WebForm、WPF、Silverlight和Windows Phone 7应用程序提供二维码编码输出功能。可以将二维码文件导出为eps格式 -
C# 水晶报表打印二维码,code128例子
2018-12-18 09:17:59用c#写的打印二维码和条形码的例子下载后直接可以运行, -
java微信小程序参数二维码生成带背景图加字体(无限生成)
2021-03-29 21:27:091需求 :1,因为项目需求 ,生成数以万计的二维码 2 ,每个二维码带不同的参数 3,二维码有固定背景图 4 , 往生成图片上写入 字体和编号(动态 )设计技术 : 1,微信接口token ,nginx 缓存 2, ... 1... -
Windows字体文件
2020-11-06 12:51:59Windows字体,本人用于Linux的字体安装 本帖为本人备份使用。 由本贴提供的程序对您的网站或计算机造成严重后果的本站概不负责。 本贴收集完全是个人兴趣爱好,禁止任何机构及个人将此系统作为商业用途! ... -
java生成单个二维码,批量生成二维码并放入zip中,及导出下载流,前端进行下载
2022-05-13 15:43:05java生成单个二维码,批量生成二维码并放入zip中,及导出下载流,前端进行下载,绝对真实java生成单个二维码,批量生成二维码并放入zip中,及导出下载流,前端进行下载
1、引入生成二维码的jar包依赖
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.1</version> </dependency>
2、创建生成二维码工具类
import com.google.zxing.*; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.springframework.stereotype.Component; import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; public class QrCodeUtil { //0x,透明度,R,G,B private static final int BLACK = 0xFF000000; private static final int WHITE = 0xFFFFFFFF; /** * 二维码图片生成 * @param matrix * @return */ public BufferedImage toBufferedImage(BitMatrix matrix) { int width = matrix.getWidth(); int height = matrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE); } } return image; } /** * 二维码输出为文件 * @param image 二维码图片 * @param format 二维码图片格式 * @param filePath 二维码保存路径 * @throws IOException */ public void writeToFile(BufferedImage image, String format, String filePath) throws IOException { File outputFile = new File(filePath); if (!outputFile.exists()) { outputFile.mkdirs(); } if (!ImageIO.write(image, format, outputFile)) { throw new IOException("不能转换成" + format ); } } /** * 二维码添加背景 * @param image 二维码图片 * @param bgFilePath 背景图片路径 * @param x 维码左顶点在背景图片的X坐标 * @param y 二维码左顶点在背景图片的Y坐标 * @return * @throws IOException */ public BufferedImage addBgImg(BufferedImage image, String bgFilePath, int x, int y) throws Exception { File file = new File(bgFilePath); if (!file.exists()) { throw new IOException("背景图片不存在"); } BufferedImage bgImg = ImageIO.read(file); if(x < 0) { x = 0; } if(y < 0) { y = 0; } if(bgImg.getWidth() < image.getWidth() || bgImg.getHeight() <image.getHeight()) { throw new Exception("背景图片小于二维码尺寸"); } if(bgImg.getWidth() < x + image.getWidth() || bgImg.getHeight() < y + image.getHeight()) { throw new Exception("以背景的("+x+","+y+")作为二维码左上角不能容下整个二维码"); } Graphics2D graph = bgImg.createGraphics(); graph.drawImage(image, x, y, image.getWidth(), image.getHeight(), null); graph.dispose(); return bgImg; } /** * 二维码底部添加文本(只限一行,没有换行) * @param image 二维码图片 * @param text 文本内容 * @param fontSize 写入文本的字体 * @return */ public BufferedImage addText(BufferedImage image, String text, int fontSize) { int outImageWidth = image.getWidth(); int outImageHeight = image.getHeight() + fontSize + 10; BufferedImage outImage = new BufferedImage(outImageWidth, outImageHeight, BufferedImage.TYPE_INT_RGB); Graphics2D graph = outImage.createGraphics(); //填充为白色背景 graph.setColor(Color.white); graph.fillRect(0 ,0 , outImageWidth, outImageHeight); //将二维码画入 graph.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); //添加文本 graph.setColor(Color.black); Font font = new Font("楷体", Font.BOLD, fontSize);//字体,字型,字号 graph.setFont(font); //文本水平,垂直居中 FontRenderContext frc = new FontRenderContext(null, true, true); Rectangle2D r2D = font.getStringBounds(text, frc); int rWidth = (int) Math.round(r2D.getWidth()); int a = (outImageWidth - rWidth) / 2; graph.drawString(text,a, outImageHeight - 5);//x,y为左下角坐标 graph.dispose(); return outImage; } /** * 生成二维码(无logo,无背景) * 根据内容,生成指定宽高、指定格式的二维码图片 * @param text 内容 * @param width 宽 * @param height 高 * @return * @throws Exception */ public BufferedImage encodeQrCode(String text, int width, int height) throws WriterException, IOException { //设置二维码配置 Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); // 设置QR二维码的纠错级别,指定纠错等级,纠错级别(L 7%、M 15%、Q 25%、H 30%) hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); hints.put(EncodeHintType.MARGIN, 0);// 白边 //创建比特矩阵(位矩阵)的QR码编码的字符串 BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); //二维码图片生成 BufferedImage qrCodeImg = toBufferedImage(bitMatrix); return qrCodeImg; } // 生成白色背景图 public BufferedImage pureColorPictures(int width, int height) { //width 生成图宽度 // height 生成图高度 //创建一个width xheight ,RGB高彩图,类型可自定 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //取得图形 Graphics g = img.getGraphics(); //设置背景图颜色 g.setColor(Color.WHITE); //填充 g.fillRect(0, 0, img.getWidth(), img.getHeight()); return img; } // 把二维码和背景图合在一起 public BufferedImage pureColorPicturesAddBgImg(BufferedImage image, BufferedImage pureColorPictures, int x, int y) throws Exception { BufferedImage bgImg = pureColorPictures; if(x < 0) { x = 0; } if(y < 0) { y = 0; } if(bgImg.getWidth() < image.getWidth() || bgImg.getHeight() <image.getHeight()) { throw new Exception("背景图片小于二维码尺寸"); } if(bgImg.getWidth() < x + image.getWidth() || bgImg.getHeight() < y + image.getHeight()) { throw new Exception("以背景的("+x+","+y+")作为二维码左上角不能容下整个二维码"); } Graphics2D graph = bgImg.createGraphics(); graph.drawImage(image, x, y, image.getWidth(), image.getHeight(), null); graph.dispose(); return bgImg; } // 二维码在背景图片的位置 // 1左上,2左中,3在下 // 4中上,5正中,6中下 // 7右上,8右中,9右下 public Map<String, Integer> calculateXY(BufferedImage bj, BufferedImage code, String type){ int bx = bj.getWidth(); int by = bj.getHeight(); int cx = code.getWidth(); int cy = code.getHeight(); int x = 0; int y = 0; if("2".equals(type)){ y = (by - cy) / 2; }else if("3".equals(type)){ y = by - (by - cy); }else if("4".equals(type)){ x = (bx - cx) / 2; }else if("5".equals(type)){ x = (bx - cx) / 2; y = (by - cy) / 2; }else if("6".equals(type)){ x = bx - (bx - cx); y = by - (by - cy); }else if("7".equals(type)){ x = bx - cx; }else if("8".equals(type)){ x = bx - cx; y = (by - cy) / 2; }else if("9".equals(type)){ x = bx - cx; y = by - cy; } Map<String,Integer> m = new HashMap(); m.put("x",x); m.put("y",y); return m; } }
3、导出二维码流前端进行下载
public class Text{ public void exportCode(String id,HttpServletResponse response) throws Exception{ // 二维码内容 // 生成二维码并指定宽高 BufferedImage generate = qrCodeUtil.encodeQrCode(id, 300,300); // 判断背景图是否存在 if (true) { log.info("导出有背景的二维码:"+id); // 有标题的二维码 BufferedImage qrCodeAddText = qrCodeUtil.addText(generate, id, 30); int x = qrCodeAddText.getWidth()-generate.getCodewidth(); int y = qrCodeAddText.getHeight()-generate.getCodeheight(); // 生成纯白色背景模板 BufferedImage bgImg = qrCodeUtil.pureColorPictures(generate.getBgwidth()+x,generate.getBgheight()+y); Map<String, Integer> m = qrCodeUtil.calculateXY(bgImg,qrCodeAddText,"5"); x = m.get("x"); y = m.get("y"); // 生成带背景图的二维码 BufferedImage qrCodeWithLogoWithBg = qrCodeUtil.pureColorPicturesAddBgImg(qrCodeAddText, bgImg, x,y); response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + id + ".jpg"); OutputStream outputStream = response.getOutputStream(); ImageIO.write(qrCodeWithLogoWithBg, "jpg", outputStream); outputStream.flush(); outputStream.close(); }else{ log.info("导出没有背景的二维码:"+id); // 带标题的二维码 BufferedImage qrCodeAddText = qrCodeUtil.addText(generate, id, 30); response.setHeader("Content-Type", "application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + id + ".jpg"); OutputStream outputStream = response.getOutputStream(); ImageIO.write(qrCodeAddText, "jpg", outputStream); outputStream.flush(); outputStream.close(); } } }
4、批量下载二维码并放入zip压缩包里面
public class Text{ public void exportList(HttpServletResponse response) throws Exception { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=二维码.zip"); // 生成zip压缩包 ZipOutputStream out = new ZipOutputStream(response.getOutputStream()); byte buff[] = new byte[1024]; if(true) { for(int i=0;i<10;i++) { // 生成二维码并指定宽高 BufferedImage generate = qrCodeUtil.encodeQrCode("第"+i,300,300); // 背景图存在 BufferedImage qrCodeAddText = qrCodeUtil.addText(generate,"第"+i, 30); int x = qrCodeAddText.getWidth()-generate.getCodewidth(); int y = qrCodeAddText.getHeight()-generate.getCodeheight(); BufferedImage pureColorPicturesImg = qrCodeUtil.pureColorPictures(generate.getBgwidth()+x,generate.getBgheight()+y); Map<String, Integer> m = qrCodeUtil.calculateXY(pureColorPicturesImg,qrCodeAddText,"5"); x = m.get("x"); y = m.get("y"); // 生成带背景图的二维码 BufferedImage qrCodeWithLogoWithBg = qrCodeUtil.pureColorPicturesAddBgImg(qrCodeAddText, pureColorPicturesImg, x, y); File f = new File(i+".png"); ImageIO.write(qrCodeWithLogoWithBg,"png",f); FileInputStream fi = new FileInputStream(f); BufferedInputStream origin = new BufferedInputStream(fi); ZipEntry entry = new ZipEntry(f.getName()); out.putNextEntry(entry); int count; while ((count = origin.read(buff)) != -1) { out.write(buff, 0, count); } origin.close(); } }else{ for(int i=0;i<10;i++) { // 生成二维码并指定宽高 BufferedImage generate = qrCodeUtil.encodeQrCode("第"+i, generate.getCodewidth(), generate.getCodeheight()); // 有标题的二维码 BufferedImage qrCodeAddText = qrCodeUtil.addText(generate,"第"+i, 30); File f = new File(i+".png"); ImageIO.write(qrCodeAddText,"png",f); FileInputStream fi = new FileInputStream(f); BufferedInputStream origin = new BufferedInputStream(fi); ZipEntry entry = new ZipEntry(f.getName()); out.putNextEntry(entry); int count; while ((count = origin.read(buff)) != -1) { out.write(buff, 0, count); } origin.close(); } } out.closeEntry(); out.flush(); out.close(); } }
5、前端下载
如果直接用get请求(比如:a标签)那么浏览器会自动进行下载,但如果是用ajax进行访问我们后台的话需要使用最原始的blob
$("#pldc").click(function () { var url2 = "后端地址路径"; var url = url2; var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // xhr.responseType = "blob"; // xhr.onreadystatechange = function() { if(xhr.readyState == 3) { } if(xhr.readyState == 4) { } }; xhr.onload = function() { // 为了让所有浏览器都兼容的代码 if(this.status === 200) { var blob = this.response; var a = document.createElement('a'); a.download = '二维码.zip';// 自定义下载的名称及格式 a.href = window.URL.createObjectURL(blob); $("body").append(a); a.click(); $(a).remove(); } }; xhr.send(); })
-
Excel中批量生成二维码与条形码V9.3
2020-01-17 09:49:468.生成条形码时提供Jan13、Code39、Jan8和Code128四种标准,其中Code128支持更换字体。 9.支持自动生成二维码,全自动的,只要单元格中录入字符,按下回车时就自动生成二维码。 10.所有功能都自动GIF动画教材,一... -
二维码制作并压缩下载
2022-05-31 14:48:46需求:制作出多张二维码,并且压缩后下载。下载下来的压缩包解压后二维码能正常扫码 引入二维码制作的jar包 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core<...需求:制作出多张二维码,并且压缩后下载。下载下来的压缩包解压后二维码能正常扫码
引入二维码制作的jar包
<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>
二维码制作工具类
package com.demo.utils; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class ZxingUtils { /** * 生成二维码 * * @param contents 二维码内容 * @param width 图片宽度 * @param height 图片高度 * @param hints 二维码相关参数 * @return BufferedImage对象 * @throws WriterException 编码时出错 * @throws IOException 写入文件出错 */ public static BufferedImage enQRCode(String contents, int width, int height, Map<EncodeHintType, ?> hints) throws WriterException { // String uuid = UUID.randomUUID().toString().replace("-", ""); //本地完整路径 // String pathname = path + "/" + uuid + "." + format; //生成二维码 BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); // Path file = new File(pathname).toPath(); //将二维码保存到路径下 // MatrixToImageWriter.writeToPa(bitMatrix, format, file); // return pathname; return MatrixToImageWriter.toBufferedImage(bitMatrix); } public static BufferedImage enQRCode(String contents, int width, int height) throws WriterException { //定义二维码参数 Map<EncodeHintType, Object> hints = new HashMap<>(); //编码 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //容错级别 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //边距 hints.put(EncodeHintType.MARGIN, 0); return enQRCode(contents, width, height, hints); } /** * 将图片绘制在背景图上 * * @param backgroundImage 背景图 * @param zxingImage 图片 * @param x 图片在背景图上绘制的x轴起点 * @param y 图片在背景图上绘制的y轴起点 * @return * @throws IOException */ public static BufferedImage drawImage(BufferedImage backgroundImage, BufferedImage zxingImage, int x, int y) throws IOException { Objects.requireNonNull(backgroundImage, ">>>>>背景图不可为空"); Objects.requireNonNull(zxingImage, ">>>>>二维码不可为空"); //二维码宽度+x不可以超过背景图的宽度,长度同理 if ((zxingImage.getWidth() + x) > backgroundImage.getWidth() || (zxingImage.getHeight() + y) > backgroundImage.getHeight()) { throw new IOException(">>>>>二维码宽度+x不可以超过背景图的宽度,长度同理"); } //合并图片 Graphics2D g = backgroundImage.createGraphics(); g.drawImage(zxingImage, x, y, zxingImage.getWidth(), zxingImage.getHeight(), null); return backgroundImage; } public static BufferedImage drawImage(String backgroundPath, BufferedImage zxingImage, int x, int y) throws IOException { //读取背景图的图片流 BufferedImage backgroundImage; //Try-with-resources 资源自动关闭,会自动调用close()方法关闭资源,只限于实现Closeable或AutoCloseable接口的类 try (InputStream imagein = new FileInputStream(backgroundPath)) { backgroundImage = ImageIO.read(imagein); } return drawImage(backgroundImage, zxingImage, x, y); } /** * 将文字绘制在背景图上 * * @param backgroundImage 背景图 * @param x 文字在背景图上绘制的x轴起点 * @param y 文字在背景图上绘制的y轴起点 * @return * @throws IOException */ public static BufferedImage drawString(BufferedImage backgroundImage, String text, int x, int y, Font font, Color color) { //绘制文字 Graphics2D g = backgroundImage.createGraphics(); //设置颜色 g.setColor(color); //消除锯齿状 g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); //设置字体 g.setFont(font); //绘制文字 g.drawString(text, x, y); return backgroundImage; } /** * backgroundImage 转换为输出流 * * @param backgroundImage 图片流 * @param format 图片后缀 * @return * @throws IOException */ public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage, String format) throws IOException { ByteArrayOutputStream bs = new ByteArrayOutputStream(); try ( ImageOutputStream imOut = ImageIO.createImageOutputStream(bs)) { ImageIO.write(backgroundImage, format, imOut); InputStream is = new ByteArrayInputStream(bs.toByteArray()); return is; } } public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage) throws IOException { return bufferedImageToInputStream(backgroundImage, "png"); } /** * 保存为文件 * * @param is 输入流 * @param fileName 保存的图片路径和文件名 * @throws IOException */ public static void saveFile(InputStream is, String fileName) throws IOException { try (BufferedInputStream in = new BufferedInputStream(is); BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName))) { int len; byte[] b = new byte[1024]; while ((len = in.read(b)) != -1) { out.write(b, 0, len); } } } /** * InputStream 转 byte数组 * * @param inputStream * @return * @throws IOException */ public static byte[] read(InputStream inputStream) throws IOException { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int num = 0; while ((num = inputStream.read(buffer)) != -1) { baos.write(buffer, 0, num); } baos.flush(); return baos.toByteArray(); } finally { if (inputStream != null) { inputStream.close(); } } } /** * 组装二维码 * * @param originalFileName 图片名称 * @param contcent 二维码内容 * @return */ public static Map oneCode(String originalFileName,String contcent) { //二维码宽度 int width = 293; //二维码高度 int height = 293; BufferedImage zxingImage = null; try { //二维码图片流 zxingImage = enQRCode(contcent, width, height); } catch (WriterException e) { e.printStackTrace(); } InputStream inputStream = null; try { //图片转inputStream inputStream = bufferedImageToInputStream(zxingImage); Map excelOut = new HashMap(); excelOut.put("fileName", originalFileName); excelOut.put("outByte", read(inputStream)); return excelOut; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { //二维码宽度 int width = 293; //二维码高度 int height = 293; //二维码内容 String contcent = "http://baidu.com"; BufferedImage zxingImage = null; try { //二维码图片流 zxingImage = enQRCode(contcent, width, height); } catch (WriterException e) { e.printStackTrace(); } //背景图片地址 String backgroundPath = "E:/background_en.png"; InputStream inputStream = null; try { //合成二维码和背景图 BufferedImage image = drawImage(backgroundPath, zxingImage, 224, 754); //绘制文字 //读取本地字体 //Font font = new Font("default", Font.BOLD, 35); //读取自定义物理字体 Font font = Font.createFont(Font.TRUETYPE_FONT, new File("C:\\Windows\\Fonts\\courbd.ttf")).deriveFont(Font.BOLD).deriveFont(40f); //文字内容 String text = "17000中文😊😊😊"; image = drawString(image, text, 325, 700, font, new Color(244, 254, 189)); //图片转inputStream inputStream = bufferedImageToInputStream(image); } catch (Exception e) { e.printStackTrace(); } //保存的图片路径 String originalFileName = "E:/99999.png"; try { //保存为本地图片 saveFile(inputStream, originalFileName); } catch (IOException e) { e.printStackTrace(); } } }
文件压缩的工具类
package com.demo.utils; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtils { /** * 多个文件压缩成压缩包并下载 * * @param fileList 文件信息列表 * @param httpResponse */ public static void zipFiles(List<Map> fileList, HttpServletResponse httpResponse) { try (ZipOutputStream zipOutputStream = new ZipOutputStream(httpResponse.getOutputStream()); OutputStream out = null) { //下载压缩包 httpResponse.setContentType("application/zip"); httpResponse.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("附件.zip", "UTF-8")); // 创建 ZipEntry 对象 for (Map map : fileList) { ZipEntry zipEntry = new ZipEntry((String) map.get("fileName")); zipOutputStream.putNextEntry(zipEntry); zipOutputStream.write((byte[]) map.get("outByte")); } } catch (IOException e) { e.printStackTrace(); } } }
最后再进行调用
public static void main(HttpServletResponse httpResponse) { Map oneCode = ZxingUtils.oneCode("1.png","www.baidu.com"); //图片组装 Map oneCode2 = ZxingUtils.oneCode("2.png","www.baidu.com"); //图片组装 Map oneCode3 = ZxingUtils.oneCode("3.png","www.baidu.com"); //图片组装 List<Map> fileList = new ArrayList<>(); fileList.add(oneCode); fileList.add(oneCode2); fileList.add(oneCode3); ZipUtils.zipFiles(fileList, httpResponse); //多文件压缩 }
-
条码字体.zip
2019-06-08 15:19:09选择此字体可以自动产生条码,特别在EXCEL中可以自动,自由设置自已的条码 C39HR-11.TTF C39HRP-3.TTF C39HRP-8.TTF C39P72-1.TTF C39P72-2.TTF -
Java生成二维码并把图片流导出压缩包下载(亲测可用)
2022-04-08 14:28:40介绍如何生成二维码,添加文字并转成压缩包到前端下载和单个二维码图片下载。目录
背景:
实际开发中有不少二维码生成并下载的需求,单个和批量下载都比较常见,最近又来了这种需求,决定记录一下,文末附上源码。
Maven依赖相关:
<!--二维码--> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.1.0</version> </dependency> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency>
二维码生成:
基础实体类:
package com.example.qrcode.util; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.HashMap; /** * @author yellow duck * @date 2022-04-08 14:41 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class QrCodeInfo { /** * 图片信息 示例:key - 二维码编号: value - 0000001(具体的值) * */ private HashMap<String, String> textMap; /** * 二维码信息 * */ private String info; }
二维码工具类 :
package com.example.qrcode.util; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static com.google.zxing.client.j2se.MatrixToImageConfig.BLACK; import static com.google.zxing.client.j2se.MatrixToImageConfig.WHITE; /** * 二维码相关工具类 * * @author yellow duck * @date 2022-04-08 14:34 */ public class QrCodeUtil { /** * 二维码宽和高 */ private static final int WIDTH_AND_HEIGHT = 180; /** * 文字的X轴坐标 */ private static final int TEXT_X = 200; /** * 文字的Y轴坐标 */ private static int TEXT_Y = 80; /** * 文字的段落高度 */ private static final int SPACE_Y = 40; /** * 二维码参数设置 */ private static final Map<EncodeHintType, Object> HINTS; static { HINTS = new EnumMap<>(EncodeHintType.class); //设置编码 HINTS.put(EncodeHintType.CHARACTER_SET, "UTF-8"); //设置二维码的纠错级别 HINTS.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); } /** * 绘制二维码并返回图片流 * * @param qrcode: 二维码相关信息 * @date 2022/4/8 14:44 * @author YD */ public static BufferedImage createQrCode(QrCodeInfo qrcode) throws WriterException { //设置对象并生成二维码 BitMatrix bitMatrix = new MultiFormatWriter().encode(qrcode.getInfo(), BarcodeFormat.QR_CODE, WIDTH_AND_HEIGHT, WIDTH_AND_HEIGHT, HINTS); //创建二维码图片缓冲区 BufferedImage image = new BufferedImage(WIDTH_AND_HEIGHT, WIDTH_AND_HEIGHT, BufferedImage.TYPE_INT_RGB); //生成二维码数组 for (int x = 0; x < bitMatrix.getWidth(); x++) { for (int y = 0; y < bitMatrix.getHeight(); y++) { //二维坐标整个区域:画什么颜色 image.setRGB(x, y, bitMatrix.get(x, y) ? BLACK : WHITE); } } //觉得这个字体好看一些 如果不喜欢可以换成微软雅黑 Font.BOLD为加粗 但会出现锯齿 Font fontChinese = new Font("华文细黑", Font.PLAIN, 16); //创建画布的缓冲区 BufferedImage bufferedImage = new BufferedImage(600, 240, BufferedImage.TYPE_4BYTE_ABGR); //创建画布 Graphics2D g2d = bufferedImage.createGraphics(); //设置背景颜色 g2d.setBackground(Color.WHITE); //开启文字抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); //绘制二维码 g2d.drawImage(image, 10, 30, image.getWidth(), image.getHeight(), null); //设置画笔颜色 g2d.setColor(Color.BLACK); ///设置二维码文本字体 g2d.setFont(fontChinese); //绘制文字 HashMap<String, String> textMap = qrcode.getTextMap(); //填充文字 textMap.forEach((key, value) -> { //每次间距为40 可以根据具体调整 g2d.drawString(key + value, TEXT_X, TEXT_Y); TEXT_Y += SPACE_Y; }); //恢复Y轴坐标 TEXT_Y = 80; //销毁画笔 g2d.dispose(); bufferedImage.flush(); image = bufferedImage; return image; } /** * 把生成的二维码打进压缩包并下载 * * @param images: 二维码流集合 * @date 2022/4/8 15:26 * @author YD */ public static void compressQrCodeToZip(List<BufferedImage> images, HttpServletResponse httpServletResponse) throws IOException { //重置HttpServletResponse防止乱码 httpServletResponse.reset(); ZipOutputStream zos = new ZipOutputStream(httpServletResponse.getOutputStream()); //文件的名称 String downloadFilename = "二维码压缩包.zip"; //转换中文否则可能会产生乱码 downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8"); // 指明response的返回对象是文件流 httpServletResponse.setContentType("application/octet-stream; charset=UTF-8"); //设置下载格式和名称 httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename); //添加二维码进zip压缩包 images.forEach( image -> { try { byte[] buf = new byte[8192]; int len; //添加二维码进zip ZipEntry entry = new ZipEntry(UUID.randomUUID() + ".png"); zos.putNextEntry(entry); InputStream inputStream = bufferedImageToInputStream(image); //输出压缩包 while ((len = inputStream.read(buf)) > 0) { zos.write(buf, 0, len); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } ); zos.close(); } /** * 下载单个二维码 * * @param bufferedImage: 二维码流 * @param httpServletResponse: http响应 * @date 2022/4/8 15:37 * @author YD */ public static void singleQrCode(BufferedImage bufferedImage, HttpServletResponse httpServletResponse) throws IOException { //重置HttpServletResponse防止乱码 httpServletResponse.reset(); //文件的名称 String downloadFilename = UUID.randomUUID() + ".png"; //转换中文否则可能会产生乱码 downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8"); // 指明response的返回对象是文件流 httpServletResponse.setContentType("application/octet-stream; charset=UTF-8"); //设置下载格式和名称 httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename); //输出二维码到前端 ImageIO.write(bufferedImage, "png", httpServletResponse.getOutputStream()); } /** * 将BufferedImage转换为InputStream * * @param image: 图片流 * @date 2022/4/8 15:29 * @author YD */ public static InputStream bufferedImageToInputStream(BufferedImage image) throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(image, "png", os); try (InputStream input = new ByteArrayInputStream(os.toByteArray())) { return input; } } }
控制层代码:
package com.example.qrcode.controller; import com.example.qrcode.util.QrCodeInfo; import com.google.zxing.WriterException; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import static com.example.qrcode.util.QrCodeUtil.*; /** * 二维码生成控制器 * * @author yellow duck * @date 2022-04-08 15:41 */ @RestController @RequestMapping("qrcode") public class QrCodeController { @GetMapping("downloadZip") public void downloadZip(HttpServletResponse httpServletResponse) throws IOException { List<BufferedImage> bufferedImages = new ArrayList<>(); //这里把需要生成的二维码然后添加进bufferedImages集合里 compressQrCodeToZip(bufferedImages,httpServletResponse); } @GetMapping("downloadOne") public void downloadOne(HttpServletResponse httpServletResponse) throws IOException, WriterException { HashMap<String, String> textMap = new HashMap<>(); textMap.put("编号:","000001"); textMap.put("名称:","二维码"); BufferedImage bufferedImages = createQrCode(QrCodeInfo.builder() .info("二维码的内容") .textMap(textMap) .build()); singleQrCode(bufferedImages,httpServletResponse); } }
结果展示:
单个二维码:
二维码压缩包:
源码地址:
-
如何打印清晰的二维码字体?
2021-04-15 10:06:44目前我们用VFP打印出来的字体,不够清晰,而用标签打印机自带软件打印的字体清晰,格式与我的不同。 因为是打小标签,VFP控制打印的扫不出来,而相同大小标签打印机自带软件的很容易识别 [img=... -
斑马打印机打印二维码,字符
2018-03-30 14:50:23用c# 代码实现斑马打印机打印二维码,是不带小方框的二维码 -
紫枫缔造文字二维码生成器V1.0绿色免费版
2019-08-01 22:46:12紫枫缔造文字二维码生成器是一款二维码生成软件下载,简单二维码生成,有兴趣的可以下载,可以帮助大家生成各种扫描的二维码,图二维码生成器使用方便,操作简单,非常适合用来制作各种名片。 使用说明 建议内容不... -
FastReport完美支持中文二维码
2013-08-15 09:31:38之前别人发过FastReport二维码的,但对中文支持多不是太好,现在我进行了修改,可以完善支持中文了。 -
Java后台生成二维码,前台实现图片下载
2020-05-19 13:31:35<div class="col-xs-11 post-control"> <button class="btn btn-primary" id="userSavePic" type="button" onclick="savePiceture()"><i class="fa fa-save"&...二维码下载</button> < -
docker容器Linux环境下二维码图片中文字体乱码处理办法
2020-03-17 18:27:09需求:因为要给老师网盘设计一个二维码下载图片,基本需求是中间团队logo,下方是APK的文件名,但是在进行线上部署的时候出现了中文乱码 具体现象 这三个小框框是三个汉字 思路:在本机运行的好好的,本机是ubuntu... -
java实现条形码二维码生成含文字标签信息
2021-06-21 10:48:28java实现条形码二维码生成含文字标签信息 -
二维码/code128码生成,保存,打印
2015-12-01 15:44:06二维码 code128码 生成 保存 打印,请自行下载字体code128安装 -
c#在图片上添加文字和二维码源码
2019-06-04 11:06:47c#在图片上添加文字和二维码源码 原文地址:https://blog.csdn.net/u012577474 添加图片方法: DrawImage(Image, 画图位置x, 画图位置y, 图片宽, 图片高); 添加文字方法: DrawString(文字, 字体, 画笔, 位置); -
Excel中批量生成二维码与条形码6.4版
2020-01-04 09:05:58批量生成二维码与条形码用于在Excel中批量生成二维码或者条形码,瞬间生成千百个且自动排版,高效又智能,且自带动画教材。 特点介绍: 1.生成二维码时允许自定义大小。 2.生成二维码时允许指定图片的名称来源,... -
JS识别二维码,JS解二维码,前端识别二维码
2021-05-17 18:55:091.之前有找过识别二维码的插件,但是遇到了些问题,具体表现为文字识别不了,带get参数识别不了。正常的普通链接没问题。 2.找了一天也没找到一个正常的。吐槽一下网上的教程正是什么样的都有,真是醉了。 3.找了一... -
生成二维码不依赖zxing.zip
2021-03-23 18:10:55生成二维码 -
springboot生成二维码在word文档,并下载到本地
2021-01-27 11:37:34分为两本分演示,第一部分生成word文档下载到本地,第二部分是生成二维码在word再保存本地 -
在线生成二维码文字云Art Word
2020-02-02 11:16:35如果词组(比如谷粒)只使用一次,Size可以精确控制词组的尺寸, 但由于我们的词组需要填充满整个图像来形成文字云, 谷粒这个词就需要被多次用到,如果谷粒被使用了N次, 那其中有N-1次的实际字体大小是与S...