
本文介绍在 Vaadin Flow(24+)中将任意字符串快速生成 QR 码并封装为 Image 组件的完整实现,基于 ZXing 库,提供可直接复用的 toQr(String) 方法,支持流式资源与 Data URL 两种嵌入方式。
本文介绍在 vaadin flow(24+)中将任意字符串快速生成 qr 码并封装为 `image` 组件的完整实现,基于 zxing 库,提供可直接复用的 `toqr(string)` 方法,支持流式资源与 data url 两种嵌入方式。
要在 Vaadin 中将字符串(如 "123456789")直接转为可显示的 QR 码 Image 组件,核心步骤是:生成 QR 码位图 → 封装为 Vaadin 可识别的资源 → 绑定到 Image.setSrc()。以下是简洁、健壮、开箱即用的实现方案。
✅ 推荐方法:使用 StreamResource(推荐用于生产环境)
该方式避免 Base64 膨胀,支持缓存与大尺寸码图,且符合 Vaadin 最佳实践:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.server.StreamResource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class QrCodeUtils {
private static final int QR_WIDTH = 300;
private static final int QR_HEIGHT = 300;
/**
* 将字符串转换为 Vaadin Image 组件,显示其 QR 码
* @param content 待编码的字符串(如 "Hello World" 或 "123456789")
* @return 已设置 QR 码源的 Image 实例
*/
public static Image toQr(String content) {
if (content == null || content.trim().isEmpty()) {
throw new IllegalArgumentException("QR content cannot be null or empty");
}
BufferedImage qrImage = generateQrImage(content);
StreamResource resource = new StreamResource(
"qrcode.png",
() -> {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ImageIO.write(qrImage, "png", baos);
return new ByteArrayInputStream(baos.toByteArray());
} catch (IOException e) {
throw new RuntimeException("Failed to write QR image to stream", e);
}
}
);
Image image = new Image();
image.setSrc(resource);
image.setAlt("QR Code for: " + content);
return image;
}
private static BufferedImage generateQrImage(String content) {
try {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(
content,
BarcodeFormat.QR_CODE,
QR_WIDTH,
QR_HEIGHT
);
return MatrixToImageWriter.toBufferedImage(bitMatrix);
} catch (Exception e) {
throw new RuntimeException("Failed to generate QR code for: " + content, e);
}
}
}
? 使用示例(在视图中调用)
@Route("qr-demo")
public class QrDemoView extends VerticalLayout {
public QrDemoView() {
// ✅ 一行即可添加 QR 图像
add(QrCodeUtils.toQr("Hello World"));
add(QrCodeUtils.toQr("123456789"));
// 可选:设置宽高约束以保持清晰度
Image qr = QrCodeUtils.toQr("https://vaadin.com");
qr.setWidth("250px");
qr.setHeight("250px");
add(qr);
}
}
⚠️ 注意事项与依赖配置
-
必需依赖(Maven):
<dependency><groupid>com.google.zxing</groupid><artifactid>core</artifactid><version>3.5.3</version></dependency><dependency><groupid>com.google.zxing</groupid><artifactid>javase</artifactid><version>3.5.3</version></dependency>
-
不建议使用
toDataUrl方式:Base64 编码会使 HTML 体积膨胀约 33%,且无法被浏览器缓存;仅适用于极简原型或单次小图。 - 字符兼容性:ZXing 默认支持 UTF-8,中文、URL、特殊符号均可正常编码(无需额外配置)。
- 异常处理:方法已内置空值检查与运行时异常包装,便于调试和日志追踪。
通过以上实现,你即可获得一个稳定、轻量、符合 Vaadin Flow 规范的 toQr(String) 工具方法——输入字符串,输出即用的 Image 组件,无缝集成至任何布局中。










