簡單的servlet,在線生成QR二維碼圖片

以前QR碼剛開始火的時候,曾試驗過google的zxing project,解碼是沒問題的,編碼沒有範例代碼,當時測試的時候發現其中的zxing.appspot.com工程是用來生成QR圖片的,結果安裝好運行之後才知道,它是通過chart.apis.google.com提供的接口來實現的。

最近因項目需要,花了點時間閱讀zxing的javadoc,同時參考了網上的一些文章,寫了一個servlet,可以完全取代chart.apis.google.com自行生成QR圖片,有了這個servlet,不需要去訪問google的服務器也可以在網頁中內嵌URL在線顯示QR圖片了。

以下是servlet的代碼:

package testQR;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;

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;

@SuppressWarnings("serial")
public class QRCode extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
		throws IOException, ServletException {
        int onColor = 0xFF000000;
        int offColor = 0xFFFFFFFF;
        int intX = 320;
        int intY = 320;
        String sErr = "L";
        String sEnc = "UTF-8";
        String content = "Nothing";
		String[] strarry = request.getQueryString().split("&");
		for (String s : strarry) {
			if (s.startsWith("chs=")) {
				String[] sDemi = s.substring(4).split("x");
				intX = Integer.parseInt(sDemi[0]);
				intY = Integer.parseInt(sDemi[1]);
			} else if (s.startsWith("chcl=")) {
				onColor = Integer.parseInt(s.substring(5,11), 16)|0xFF000000;
				offColor = Integer.parseInt(s.substring(11), 16)|0xFF000000;
			} else if (s.startsWith("chld=")) {
				sErr = s.substring(5);
			} else if (s.startsWith("choe=")) {
				sEnc = s.substring(5);
			} else if (s.startsWith("chl=")) {
				content = URLDecoder.decode(s.substring(4),sEnc);
			}
		}

	    Map hints = new HashMap();
	    ErrorCorrectionLevel lErr;
	    if (sErr.equals("H")) lErr = ErrorCorrectionLevel.H;
	    else if (sErr.equals("Q")) lErr = ErrorCorrectionLevel.Q;
	    else if (sErr.equals("M")) lErr = ErrorCorrectionLevel.M;
	    else lErr = ErrorCorrectionLevel.L;
	    hints.put(EncodeHintType.ERROR_CORRECTION, lErr);
	    hints.put(EncodeHintType.CHARACTER_SET, sEnc);

		response.setHeader("Pragma","No-cache"); 
	    response.setHeader("Cache-Control","no-cache");
	    response.setHeader("Cache-Control","no-store");
		response.setContentType("image/png");
		ServletOutputStream rsp = response.getOutputStream();
	    QRCodeWriter qrWriter = new QRCodeWriter();
		try {
		    BitMatrix bitMatrix = qrWriter.encode(content, BarcodeFormat.QR_CODE, intX, intY,hints);
		    MatrixToImageWriter.writeToStream(bitMatrix, "png", rsp, new MatrixToImageConfig(onColor, offColor));
		} catch (WriterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		rsp.flush();
		rsp.close();
		response.flushBuffer();
	}
}
項目依賴:zxing裏的core.jar、javase.jar
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章