package com.psddev.cms.tool.page; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Hashtable; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.psddev.cms.tool.PageServlet; import com.psddev.cms.tool.ToolPageContext; import com.psddev.dari.util.RoutingFilter; @RoutingFilter.Path(application = "cms", value = "qrCode") @SuppressWarnings("serial") public class QrCode extends PageServlet { @Override protected String getPermissionId() { return null; } @Override protected void doService(ToolPageContext page) throws IOException, ServletException { try { String data = page.param(String.class, "data"); int size = page.paramOrDefault(int.class, "size", 200); Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>(); hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode(data, BarcodeFormat.QR_CODE, size, size, hintMap); BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB); image.createGraphics(); Graphics2D graphics = (Graphics2D) image.getGraphics(); graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, size, size); graphics.setColor(Color.BLACK); for (int i = 0; i < size; ++ i) { for (int j = 0; j < size; ++ j) { if (matrix.get(i, j)) { graphics.fillRect(i, j, 1, 1); } } } HttpServletResponse response = page.getResponse(); ServletOutputStream output = response.getOutputStream(); response.setContentType("image/png"); ImageIO.write(image, "png", output); output.flush(); } catch (WriterException error) { throw new IOException(error); } } }