Java生成二维码并打印二维码和文字信息

news2025/1/9 4:29:44

 

目录

1、生成二维码,并调用画布进行二维码和文字的描绘。

2、主程序:获取打印机,并打印内容

3、打印效果

参考文献:


    前期工作是安装好打印机驱动,可连接打印机。

    添加三个依赖jar:

具体见文底的参考文献。

1、生成二维码,并调用画布进行二维码和文字的描绘。

package print;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.util.HashMap;
import java.util.Map;

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;

/**
 * 此类,用于构建打印内容。
 * @author Administrator
 *
 */
public class LabelPrintable implements Printable {
	
	private String serNo = "643566786420230921054158";
	
	private String f1="45.5";
	
	private String f2="46.5";

	@Override
	public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
		if (pageIndex > 0) {
			return NO_SUCH_PAGE;
		}
		Graphics2D g2d = (Graphics2D) graphics;
		g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
		// 绘制二维码
		BufferedImage img = createImage(serNo);
		// 将二维码绘制到打印机
		g2d.drawImage(img, 0, 0, 35, 35, null);
		// 设置字体大小
		Font font = new Font("Arial", Font.PLAIN, 7);
		g2d.setFont(font);
		// 将文字绘制到打印机
		g2d.drawString(serNo.substring(0, serNo.length()-14), 40, 7);
		g2d.drawString(serNo.substring(serNo.length()-14), 40, 16);
		g2d.drawString("FMAX1:"+f1, 40, 25);
		g2d.drawString("FMAX5:"+f2, 40, 34);
		g2d.dispose();
		return PAGE_EXISTS;
	}
	/**
	 * 生成二维码
	 * @param serNo
	 * @return
	 */
	private BufferedImage createImage(String serNo) {
		//图片宽度、高度,二维码和边框的边距
		
        //二维码的容错等级
        Map<EncodeHintType,Object> map = new HashMap<EncodeHintType,Object>();
        map.put(EncodeHintType.MAX_SIZE, 100);
        //设置编剧(二维码与图片编剧边框的距离)枚举
        map.put(EncodeHintType.MARGIN,2);
        //设置容错的等级 有四级  L(7%) M(15%) Q(25%)  H(30%)
        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        //设置字符集,避免中文乱码的情况
        map.put(EncodeHintType.CHARACTER_SET,"utf-8");
        //二维码的输出流 IO流
        MultiFormatWriter mfw = new MultiFormatWriter();
        try{
            //通过流创建一个二维矩阵643566786420230921054158
            BitMatrix bm = mfw.encode(serNo, BarcodeFormat.QR_CODE,400,400,map);
            //声明一张图片来回值二维码
            BufferedImage img = new BufferedImage(400,400,BufferedImage.TYPE_INT_BGR);
            //将二维码的矩阵回值到图片上
            //重复的做某件事就使用循环结构
            for (int i = 0; i < 400; i++) {
                for (int j = 0; j < 400; j++) {
                    //声明一个颜色
                    int rgb = 0;
                    //画矩阵图
                    rgb = bm.get(i,j) ? Color.BLACK.getRGB() : Color.WHITE.getRGB();
                    //将内容绘制到图片中
                    img.setRGB(i,j,rgb);
                }
            }
            //指定二维码的存储路径
//            ImageIO.write(img,"jpg",new File("D:/简书主页.jpg"));
            System.out.println("二维码生成完成");
            return img;
//        }catch(WriterException | IOException e){
        }catch(WriterException e){
            e.printStackTrace();
        }
        return null;
	}
	
}

画布的核心代码是:

Graphics2D g2d = (Graphics2D) graphics;
		g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
		// 绘制二维码
		BufferedImage img = createImage(serNo);
		// 将二维码绘制到打印机
		g2d.drawImage(img, 0, 0, 35, 35, null);
		// 设置字体大小
		Font font = new Font("Arial", Font.PLAIN, 7);
		g2d.setFont(font);
		// 将文字绘制到打印机
		g2d.drawString(serNo.substring(0, serNo.length()-14), 40, 7);
		g2d.drawString(serNo.substring(serNo.length()-14), 40, 16);
		g2d.drawString("FMAX1:"+f1, 40, 25);
		g2d.drawString("FMAX5:"+f2, 40, 34);
		g2d.dispose();
g2d.drawImage(img, 0, 0, 35, 35, null);

 以上是将二维码绘制到坐标0.0,图像宽度35、高度35

        // 将文字绘制到打印机
		g2d.drawString(serNo.substring(0, serNo.length()-14), 40, 7);
		g2d.drawString(serNo.substring(serNo.length()-14), 40, 16);
		g2d.drawString("FMAX1:"+f1, 40, 25);
		g2d.drawString("FMAX5:"+f2, 40, 34);

以上是将四行文字绘制到画布里x坐标40。

以上坐标根据具体情况和打印机进行调整。

2、主程序:获取打印机,并打印内容

package print;

import java.awt.print.Printable;
import java.awt.print.PrinterJob;

import javax.print.PrintService;
import javax.print.PrintServiceLookup;

public class MainPrint {

	public static void main(String[] args) {

		try {
			// 连接到标签打印机
			PrintService printService = getLabelPrinter();

			// 创建打印任务
			PrinterJob printerJob = PrinterJob.getPrinterJob();
			printerJob.setPrintService(printService);

			// 设置打印内容
			Printable printable = new LabelPrintable();
			printerJob.setPrintable(printable);

			// 发送打印任务
			printerJob.print();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 查找打印机
	 * @return
	 */
	private static PrintService getLabelPrinter() {
		PrintService[] printServices = PrintServiceLookup.lookupPrintServices(null, null);
		for (PrintService printService : printServices) {
			System.out.println(printService.getName());
			// 查找标签打印机Label PPLB
			if (printService.getName().contains("Label")) {
				return printService;
			}
		}
		return null;
	}
	

}

3、打印效果

参考文献:

1、

小项目教学——用Java生成二维码_程序员小橙的博客-CSDN博客

2、

java调用标签打印机_mob649e81630984的技术博客_51CTO博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么情况会造成电表不走数?

电表是衡量用电量的重要设备&#xff0c;一旦出现不走数的情况&#xff0c;不仅会影响用户对用电量的准确计算&#xff0c;还可能造成电费纠纷。那么&#xff0c;究竟什么情况下会造成电表不走数呢&#xff1f;接下来&#xff0c;小编来为大家介绍下&#xff0c;一起来看下吧&a…

学习使用php实现汉字验证码

学习使用php实现汉字验证码 <?php //开启session &#xff0c;方便验证 session_start(); //创建背景画布 $image imagecreatetruecolor(200, 60); $background imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background);//创建背景画布 for ($…

【腾讯云HAI域探秘】AI让我变成灵魂画手

【腾讯云HAI域探秘】AI让我变成灵魂画手 文章目录 【腾讯云HAI域探秘】AI让我变成灵魂画手前言环境搭建进入 StableDiffusionWebUI使用 高性能应用服务HAI 部署的 StableDiffusionWebUI 快速进行AI绘画总结 前言 最近有幸参与了腾讯云举办的 腾讯云 HAI 产品体验活动。在这个过…

解决VS中文编译时出现:常量中有换行符

错误如下 首先确定文件编码格式已经是utf-8了&#xff0c;然后在有中文的情况的下&#xff0c;编译时会报错&#xff0c;真的很恶心 tabWidget.addTab(widget, tr("材料库"));tabWidget.addTab(widget1, tr("B"));解决方案 通过在项目里设置编译选项: /utf…

【docker使用Jar自定义镜像:基于windows】

在一个空文件夹中创建Dockerfile 将jar包复制到该路径下 在Dockerfile中添加以下内容 # 指定基础镜像 FROM java:8-alpine# 和java项目的包 COPY ./study_dockerfile-1.0.0.jar /tmp/app.jar# 暴露端口 EXPOSE 8081# 入口&#xff0c;java项目的启动命令 ENTRYPOINT java -jar…

开发ros一定要买树莓派吗?

结论&#xff1a;开发ros不一定要买树莓派&#xff0c;但是买一个会更方便&#xff0c;市场价410元/块&#xff1b; 开发ros机器人的时候&#xff0c;分为上位机和下位机2个控制中心&#xff0c; 其中下位机基本就是用STM32控制一个驱动电机。负责这个运动方向和速度。&#…

算法通关村第五关-白银挑战实现队列

大纲 队列基础队列的基本概念和基本特征实现队列队列的基本操作Java中的队列 队列基础 队列的基本概念和基本特征 队列的特点是节点的排队次序和出队次序按入队时间先后确定&#xff0c;即先入队者先出队&#xff0c;后入队者后出队&#xff0c;即我们常说的FIFO(first in fi…

感受野(Receptive Field)理解和计算

[Toc](感受野(Receptive Filed)的理解和计算) 感受野定义 在卷积神经网络中&#xff0c;感受野(Receptive Filed)是经过神经网络后生成的指特征图上的某个像素点所对应输入图像的区域。 针对上面的图&#xff0c;经过conv2 卷积神经网络后&#xff0c;生成了22 的特征图&…

微软曝光!ChatGPT 真实参数只有 200 亿?大模型评测基准已经失去意义?丨 RTE 开发者日报 Vol.76

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

【Cheat Engine7.5】基础教程第一关(STEP3)

文章目录 一、STEP3练习1、打开文件2、简介&#xff08;2种解决方法&#xff09;2.1、第一种解决方法(未知的初始值)2.1.1、未知的初始值2.1.2、点击打我&#xff0c;发现数值减少2&#xff0c;值在变小2.1.3、选择数值减少了多少&#xff0c;针对性搜索2.1.4、继续上一次反复操…

竞赛 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

springboot+vue跨域请求使用方法

这里写目录标题 一、所谓跨域:二、不做任何处理三、解决跨域请求案例 一案例 二 一、所谓跨域: 在前后端分离的项目中&#xff0c;前台一个服务&#xff0c;后台一个服务。 前台的一个Axios请求打进来&#xff0c;要访问后台Tomcat服务器Restful接口 浏览器出于安全的考虑&…

“泰山众筹:引爆全球的财富狂潮!“

想象一下&#xff0c;你手中的白酒不再只是简单的饮品&#xff0c;而是一份珍贵的投资&#xff0c;一份充满惊喜的冒险&#xff0c;一份财富的种子&#xff01;在这个神奇的时刻&#xff0c;让我们一起探索泰山众筹模式的魅力&#xff01; 在传统的投资领域&#xff0c;你是否…

跨国传输的常见问题与对应解决方案

在今天的全球化时代&#xff0c;跨国数据传输已经成为一个不可或缺的需求。不论是个人还是企业&#xff0c;都需要通过网络将文件或数据从一个国家传输到另一个国家&#xff0c;以实现信息共享、协作、备份等目的。然而&#xff0c;跨国数据传输并不是一项容易的任务&#xff0…

我应该删除低质量页面以提高Google排名吗?

为什么考虑删除低质量页面&#xff1f; 上个月&#xff0c;根据Google的搜索团队John Mueller和Gary Illyes在 “Search Off the Record”播客中的讨论&#xff0c;质量是影响搜索的几乎每一个方面的关键因素。 虽然高质量的内容不能保证高排名&#xff0c;但它可以影响Googl…

三相电表逆相序是由于负载造成的吗

大家好&#xff0c;最近有蛮多客户问三相电表逆相序是由于负载造成的吗&#xff1f;那么答案是&#xff1a;是的&#xff0c;但是负载只是导致三相电表出现逆向序的原因之一&#xff0c;下面&#xff0c;小编来带大家一起了解下三相电表出现逆相序的原因有哪些&#xff0c;一起…

分享88个工作总结PPT,总有一款适合您

分享88个工作总结PPT&#xff0c;总有一款适合您 88个工作总结PPT下载链接&#xff1a;https://pan.baidu.com/s/1y08X9RMdIOCncbs28aMgDw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 蓝色水彩风年终总结PPT模板 清新水彩简…

USB PD v1.0快速充电通信原理

1 原理 本篇文章讲的快速充电是指USB论坛所发布的USB Power Delivery快速充电规范&#xff08;通过VBUS直流电平上耦合FSK信号来请求充电器调整输出电压和电流的过程&#xff09;&#xff0c;不同于本人发布的另一篇文章所讲的高通Quick Charger 2.0规范&#xff0c;因为高通QC…

uniapp自定义权限菜单,动态tabbar

已封装为组件&#xff0c;亲测4个菜单项目可以切换&#xff0c; 以下为示例&#xff0c;根据Storage 中 userType 的 值&#xff0c;判断权限菜单 <template><view class"tab-bar pb10"><view class"tabli" v-for"(tab, index) in ta…