Itext5生成高质量、易识别、适合小尺寸标签打印的二维码

news/2025/3/26 13:11:33/文章来源:https://www.cnblogs.com/aeolian/p/18789685

高质量、易识别、小尺寸二维码生成

1.增大二维码的原始尺寸(例如 1000 x 1000 或更大),再缩放为 PDF 所需的大小。这样可以保留更多像素细节,提高识别率。
2.降低容错级别到 L 或 M,如果你的内容不是特别长或复杂的话,这样能减少密集度。
3.优化缩放方式:
• 使用 BufferedImage 放大或缩小时,避免图片模糊。
• 尽量在原始生成阶段保持高分辨率。
需要引入zxing

<!--  zxing  -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.0</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.5.0</version>
</dependency>
/*** 生成二维码* @param content 字符串(二维码内容)* @param cb PDF模版文件* @throws Exception*/
private void generateQRcode(String content, PdfContentByte cb) throws Exception {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 容错级别调为 Lhints.put(EncodeHintType.MARGIN, 0); // 去掉白边,实际没起作用int originalSize = 1000; // 生成更大的二维码QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, originalSize, originalSize, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();// 创建高分辨率的 BufferedImageBufferedImage qrImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D graphics = qrImage.createGraphics();// 设置背景为白色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, width, height);// 绘制二维码graphics.setColor(Color.BLACK);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {if (bitMatrix.get(x, y)) {qrImage.setRGB(x, y, 0xFF000000);}}}graphics.dispose(); // 释放图形资源// 将高质量二维码写入字节流ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(qrImage, "png", byteArrayOutputStream);// 从字节流中读取为 iText Image 对象Image qrcodeImage = PngImage.getImage(byteArrayOutputStream.toByteArray());// 缩放图片到适合 PDF 的大小qrcodeImage.scaleAbsolute(274, 271);// 设置位置qrcodeImage.setAbsolutePosition(417, 13);cb.addImage(qrcodeImage);
}

二维码裁剪白色边框

hints.put(EncodeHintType.MARGIN, 0)去掉白边代码,实际没起作用

            InputStream templateStream = getClass().getResourceAsStream("/template/Autumntemplate.pdf");PdfReader reader = new PdfReader(templateStream);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();PdfStamper stamper = new PdfStamper(reader, outputStream);// 获取第1页的 PdfContentBytePdfContentByte cb = stamper.getOverContent(1);// 传入 PdfContentByte 对象,附加二维码generateQRcode(qrContent, cb);/*** 生成二维码并附加到PDF上* @param content* @param cb* @throws Exception*/private void generateQRcode(String content, PdfContentByte cb) throws Exception {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");// 容错级别调为 Lhints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 去掉白边,实际没有去掉hints.put(EncodeHintType.MARGIN, 0);// 生成更大的二维码int originalSize = 1000;QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, originalSize, originalSize, hints);// 创建一个与二维码大小相同的 BufferedImageint width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage qrImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 填充二维码图像for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {qrImage.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}// 裁剪掉白色边距BufferedImage croppedImage = cropWhiteBorder(qrImage);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(croppedImage, "png", byteArrayOutputStream);Image qrcodeImage = PngImage.getImage(byteArrayOutputStream.toByteArray());// 设置图片大小,最终二维码大小和位置在这里设置qrcodeImage.scaleAbsolute(274, 271);// 设置位置qrcodeImage.setAbsolutePosition(417, 13);cb.addImage(qrcodeImage);}/*** 去二维码白边* @param image* @return*/private BufferedImage cropWhiteBorder(BufferedImage image) {int width = image.getWidth();int height = image.getHeight();int left = width, right = 0, top = height, bottom = 0;for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {// 如果是黑色像素if (image.getRGB(x, y) == 0xFF000000) {if (x < left) left = x;if (x > right) right = x;if (y < top) top = y;if (y > bottom) bottom = y;}}}// 根据检测到的边界裁剪return image.getSubimage(left, top, right - left + 1, bottom - top + 1);}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】安装部署jenkins

docker安装部署jenkinsdocker安装jenkins  1、下载jenkins  2、创建挂载目录  3、启动jenkins容器  4、验证jenkins是否启动成功  5、获取管理员密码  6、下载安装插件 docker安装jenkins【1】下载jenkins拉取jenkins镜像 docker pull jenkins/jenkins:2.426.2-lts…

焊接保护气体智能调节控制器|节气装置

机器人焊接节气装置在焊接流程中扮演着至关重要的角色,它犹如一道坚实的屏障,为熔融金属营造一个纯净的焊接环境,有效抵御空气中氧气、氮气、水蒸气等不良因素的侵扰。具体而言,保护气体的多重功效可详尽阐述为以下几个层面:对焊缝的精心呵护。在诸如氩弧焊等精密焊接工艺…

线段树+扫描线,解决“静态矩阵加和+矩阵查询”问题

在试图用 CDQ 分治做这道题的时候遇到了一些麻烦,修改全部在查询之前的静态部分不会做,题解虽然还算详细,但是本人蒟蒻仍然无法理解,思考一上午,尝试过各种证明方法后,大致证明题解算法的正确性,记录在这里。先看题解的说法和代码:使用扫描线、线段树和差分离线解决静态…

centOS 上部署hadoop+mysql+hive 服务之mysql 和hive安装

hive默认存放元数据的数据库是Derby数据库,Derby数据库是嵌入式数据库,它只能单用户访问,也就是只能有一个会话连接到元数据存储,不适合多用户连接操作需求。比如,多用户同时进行查询或并发操作时,Derby无法处理,这会导致性能瓶颈或直接报错。因此,建议替换为用mysql在…

Pydantic根校验器:构建跨字段验证系统

title: Pydantic根校验器:构建跨字段验证系统 date: 2025/3/24 updated: 2025/3/24 author: cmdragon excerpt: Pydantic根校验器支持预处理(pre)与后处理(post)模式,可访问全量字段数据并修改值字典。多字段关联验证实现业务规则检查,如航班时间顺序与保险策略联动。分阶…

机器人焊接节气设备

WGFACS(Welding Gas Flow Automatic Control System)机器人焊接气体流量自适应控制系统。机器人焊接节气设备包含高速控制和采集系统与气体流量自适应装置。它专为在保证焊接质量的前提下,实现节能减排、降低用气成本而设计,广泛应用于汽车制造、航空航天、机械加工等多个行业…

做销售,会讲故事,能说服90%的客户!

在开始之前,先抛出一个问题:说服他人最有效的方式是什么? 或许很多人的第一反应是:事实和数据。毕竟,数据被认为是不会说谎的(当然,也存在数据造假的情况),人们似乎也更倾向于相信数据。正因如此,许多销售话术总会包含大量数据,诸如升学率达 xx%、录取率为 xx%、满意…

CSP安全策略与XSS漏洞的关系

CSP与XSS漏洞的关系1、CSP不依赖漏洞的存在: 2、CSP是独立的安全机制,其有效性取决于策略本身的严格性,而非漏洞是否存在。 例如: 严格CSP(基于nonce):即使站点存在XSS漏洞,攻击者也无法伪造合法的 nonce 值来执行脚本。 宽松CSP(允许unsafe-inline):若漏洞存在,攻…

vue项目启动报错---FATAL ERROR js堆内存不足

vue项目启动报错---FATAL ERROR js堆内存不足 估计项目太大 电脑性能扛不住 解决方法如下: 1.启动项目报错 估计是项目太大了 电脑性能不太行FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 2.白话文---致命…

spring boot项目打包例子

1.进入到spring项目执行 mvn clean package2.这个时候会在target目录下生成如下包 3.运行 java -jar demo-0.0.1-SNAPSHOT.war 4.调用 5.项目目录结构

攻击

sql注入 SQL注入是一种常见的Web应用程序漏洞,攻击者可以利用它来执行恶意的SQL查询,从而绕过身份验证、访问敏感数据或对数据库进行破坏。以下是一些常见的SQL注入攻击语句示例:基本的SQL注入攻击:SELECT * FROM users WHERE username = admin AND password = OR 1=1; Co…

CTF

Web前置技能 HTTP请求 请求方式读题get传参类型 UseCTF**B那就传参CTFHUB得到flagBP抓包改包得到flag302跳转点击这个会进行http重定向重新返回这个页面 我们就可以用BP截取截取第一次请求得到flag cookie看提示唯一admin可以得到flag基本认证响应包源代码 信息泄露 目标遍历ph…