2015年9月6日 星期日

用 Java 在 JSP 伺服器端製作一張 QRCode 的 jsp 圖檔


製作 QRCode

這裡的範例,是為了用最簡單快速的方法,在 JSP 伺服器端製作一張 QRCode 的 jsp 圖檔,以便讓網頁呼叫。

1.下載 QRCode 元件

前往網站 http://www.swetake.com/qrcode/java/qr_java.html ,在這個只有一頁長度的日文網頁中,搜尋並下載 qrcode_java0.50beta10.tar.gz檔案,自行解壓縮後,到 qrcode_java0.50beta10\lib\ 路徑下,將 Qrcode.jar 檔案,複製到伺服器端安裝 java 的擴充元件路徑下(或是你自己設定用來放置元件的環境路徑下), 例如 C:\Program Files\Java\jdk1.7.0_45\jre\lib\ext , 然後重新啟動 Tomcat。

2.測試

呼叫以下測試網頁,例如 https://127.0.0.1/QRCodeTest.jsp 。
呼叫範例 QRCodeTest.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8" %>
<%@ include file="/Module/Jf/genQRCode.jsp" %><%
//設定 QRCode 圖片要顯示的文字內容
String str = "http://www.fmj.com.tw"; //str = "不見得要放網址\r\n這是中文測試\r\n我今天很開心"; // \r\n 是 Windows 上的換行, Linux 或 Mac 上可用 \n
//用不會重複的 UUID 當作圖片檔名
String TempFileName = java.util.UUID.randomUUID().toString()+".jpg";
//指定圖片存檔路徑, request.getRealPath("") 是伺服器端網站架設的最上層路徑
String TempFilePath = request.getRealPath("")+"/";
//在 JSP 伺服器端產生一個長寬都是140的圖檔, genQRCode 函式內容在本文後面
String TempResult = genQRCode(140, 140, str, TempFilePath+TempFileName);
if (TempResult.equals("")) {//成功

out.print("<img src='/"+TempFileName+"'>");//將 QRCode 秀在網頁上
} else {//失敗
out.print(TempResult);//顯示錯誤訊息
}
%>


使用下載的元件,製作點陣圖,儲存成 jpg 格式圖片的函式 /Module/Jf/genQRCode.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" %><%!
/*
程式碼來源 : http://playjsp.blogspot.com ,作者:Steven,不限使用請註明出處。
參考資料 http://blog.yslifes.com/archives/684
genQRCode 傳入的參數:
Img_Width 圖片寬度
Img_Height 圖片高度
Text_In QRCode 圖片要顯示的文字內容
File_Path 圖片存檔路徑與檔名
*/
public String genQRCode(int Img_Width, int Img_Height, String Text_In , String File_Path){
try {
byte[] TempByte = Text_In.getBytes("Utf-8");//將要製圖的內容轉成 byte 矩陣
java.awt.image.BufferedImage bi = new java.awt.image.BufferedImage(Img_Width, Img_Height, java.awt.image.BufferedImage.TYPE_INT_RGB);// 設定圖檔寬度予高度
//所下載元件之參數設定
com.swetake.util.Qrcode TempQRCode = new com.swetake.util.Qrcode();
TempQRCode.setQrcodeErrorCorrect('M');//容錯率L M Q H
TempQRCode.setQrcodeEncodeMode('B');//字元模式,N A 或其它的A是英文,N是數字,其它是8 byte
TempQRCode.setQrcodeVersion(7);//可使用的字串長短跟所設定的QrcodeVersion有關,越大可設定的字越多, 0-40,0是自動
//建立一個 java 的 2D 畫布,並設定畫布的背景色、大小與前景色
java.awt.Graphics2D g2D = (java.awt.Graphics2D) bi.getGraphics();
g2D.setBackground(java.awt.Color.WHITE);//背景是白色
g2D.clearRect(0, 0, Img_Width, Img_Height);
g2D.setColor(java.awt.Color.BLACK);//用黑色來畫 QRCode
//在畫布中畫入 QRCode 圖
if (TempByte.length > 0 && TempByte.length < 120) {
boolean[][] TempBoolean = TempQRCode.calQrcode(TempByte);//QRCode 圖只有黑白兩色,呼叫元件建立 QRCode 圖點布林矩陣,false不塗色,True塗入黑色
for (int XINDEX = 0; XINDEX < TempBoolean.length; XINDEX++) {
for (int YINDEX = 0; YINDEX < TempBoolean.length; YINDEX++) {
if (TempBoolean[YINDEX][XINDEX]) {//元件有成功建構圖點者
g2D.fillRect(YINDEX * 3 + 2, XINDEX * 3 + 2, 3, 3);//就在畫布中塗一個方形點
} } } } else {
return "內容長度太長";
}
g2D.dispose();
// bi.flush();
//存檔
java.io.File TempFile = new java.io.File(File_Path);
javax.imageio.ImageIO.write(bi, "jpg", TempFile);
} catch (Exception e) {
return ""+e;//.printStackTrace();
}
return "";
}
%>

參考資料

http://blog.yslifes.com/archives/684