【亚伟-技术分享系列】之代码生成二维码原创
金蝶云社区-王亚伟
王亚伟
5人赞赏了该文章 387次浏览 未经作者许可,禁止转载编辑于2022年05月06日 18:10:02

本文分享一下使用代码后台生成二维码的开发样例,仅供大家参考,如果有帮助,希望大家点赞、收藏、转发,谢谢!


开发中需要用到的第三方jar包,请看附件。

package com.common;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.OrientationRequested;
import javax.swing.JOptionPane;

import com.swetake.util.Qrcode;


/**
 * @description(类描述): 二维码生成测试类 
 */
public class QrcodeUtils {

	/**
	 * @description(方法描述): 代码生成二维码
	 */
	public static void createQrcode() throws Exception{
		String number ="编码";
		String name ="名称";
		
		Qrcode qrcode = new Qrcode();
		qrcode.setQrcodeErrorCorrect('M'); 	// 纠错等级(分为L、M、H三个等级)
		qrcode.setQrcodeEncodeMode('B'); 	// N代表数字,A代表a-Z,B代表其它字符
		qrcode.setQrcodeVersion(13); 		// 版本
		int width = 67 + 12 * (13); 		// 宽
		int height = 67 + 12 * (13); 		// 高
		BufferedImage bufferedImagecontent = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 图片类型
		// 绘图
		Graphics2D gs = bufferedImagecontent.createGraphics();
		// 生成二维码中要存储的信息
		String qrData = "编码:" + number + "\n" + "名称:" + name + "\n";

		System.out.println("开始绘图");
		// 设置二维码内容字体样式
		Font font = new Font("微软雅黑", Font.PLAIN, 12);
		gs.setColor(Color.BLACK);
		gs.setFont(font);
		// 设置一下二维码的像素
		System.out.println("设置一下二维码的像素");
		gs.setBackground(Color.WHITE);
		gs.setColor(Color.BLACK);
		gs.clearRect(0, 0, width, height);// 清除下画板内容
		System.out.println("清除下画板内容");

		// 设置下偏移量,如果不加偏移量,有时会导致出错。
		int pixoff = 2;
		System.out.println("设置下偏移量,如果不加偏移量,有时会导致出错");
		byte[] d = qrData.getBytes("UTF-8");
		if (d.length > 0 && d.length < 300) {
			boolean[][] s = qrcode.calQrcode(d);
			for (int a = 0; a < s.length; a++) {
				for (int b = 0; b < s.length; b++) {
					if (s[b][a]) {
						gs.fillRect(b * 3 + pixoff, a * 3 + pixoff, 3, 3);
					}
				}
			}
		}
		gs.dispose();
		System.out.println("结束newQrcode()");

		// 设置简介内容字体样式
		Font textfont = new Font("微软雅黑", Font.BOLD, 24);
		BufferedImage bufferedImageintro = new BufferedImage(575, 345, BufferedImage.TYPE_INT_BGR);
		Graphics g = bufferedImageintro.getGraphics();
		g.setClip(0, 0, 575, 345);
		g.setColor(Color.white);
		g.fillRect(0, 0, 575, 345); 			// 先用黑色填充整张图片,也就是背景
		g.setColor(Color.black); 			// 再换成黑色
		g.setFont(textfont); 				// 设置画笔字体
		g.drawString("编码:" + number, 0, 40); 	// 画出字符串,设置坐标
		g.drawString("名称:" + name, 0, 100); 	        // 画出字符串
		g.dispose();
		bufferedImagecontent.flush();

		// 重新绘图
		Graphics g1 = bufferedImageintro.getGraphics();
		g1.drawImage(bufferedImagecontent, 365, 70, 200, 200, null);
		ImageIO.write(bufferedImageintro, "jpg", new File("D:/codecode/" + number + "-" + name + ".jpg"));// 保存到本地路径
		if (bufferedImageintro != null) /* 当打印内容不为空时 */ {
			DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
			PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
			DocPrintJob job = printService.createPrintJob();
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
			pras.add(OrientationRequested.PORTRAIT);// 设置成竖打
			DocAttributeSet das = new HashDocAttributeSet();
			System.out.println("自定义纸张大小");
			// 指定打印内容
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			ImageIO.write(bufferedImageintro, "png", os);
			System.out.println("指定打印内容");
			InputStream is = new ByteArrayInputStream(os.toByteArray());
			Doc doc = new SimpleDoc(is, flavor, das);/**/
			System.out.println("不显示打印对话框,直接进行打印工作");
			try {
				job.print(doc, pras); // 进行每一页的具体打印操作
			} catch (PrintException pe) {
				pe.printStackTrace();
			}
		} else {
			// 如果打印内容为空时,提示用户打印将取消
			JOptionPane.showConfirmDialog(null, "Sorry, Printer Job is Empty, Print Cancelled!", "Empty",
					JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE);
		}

	}

}


赞 5