因為項目有個功能需要列印二維碼,因為我比較喜歡使用html+css+js實作,是以首先想到的是jquery.qrcode.js插件,這個插件可以用canvas和table生成二維碼,效果也不錯,不過對中文支援有問題,這個插件預設使用canvas,是以使用ie的時候,需要指定參數render,隻要參數值不是canvas就會用table生成。由于這個問題,我在github,fork了一個,做了如下的修改:
[javascript] view
plain copy
//true if support
function canvassupport() {
return !!document.createelement('canvas').getcontext;
}
return this.each(function(){
//if the browser not support canvas,then table.
if(!canvassupport()){
options.render = "table";
}
var element = options.render == "canvas" ? createcanvas() : createtable();
$(element).appendto(this);
});
修改後就不需要指定render參數,如果不支援canvas就會用table.
使用canvas有個缺點就是網頁列印的時候顯示不出來...這個問題好像已經有解決辦法了,我沒有去找,我直接用的table。不過列印似乎仍然有問題。
jquery.qrcode.js插件位址:https://github.com/jeromeetienne/jquery-qrcode
js有問題,是以隻能通過zxing來輸出二維碼,寫了如下的servlet代碼:
[java] view
@suppresswarnings("serial")
public class qrcodeservlet extends httpservlet {
private static final int black = -16777216;
private static final int white = -1;
private bufferedimage tobufferedimage(bitmatrix matrix) {
int width = matrix.getwidth();
int height = matrix.getheight();
bufferedimage image = new bufferedimage(width, height,bufferedimage.type_int_argb);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setrgb(x, y, matrix.get(x, y) ? black : white);
return image;
}
@override
protected void doget(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception {
try {
string content = req.getparameter("m");
if(content==null||content.equals("")){
resp.setcontenttype("text/plain;charset=utf-8");
resp.getoutputstream().write("二維碼内容不能為空!".getbytes("utf-8"));
resp.getoutputstream().close();
int imgwidth = 110;
int imgheight = 110;
string width = req.getparameter("w");
string height = req.getparameter("h");
if(width!=null&&!width.equals("")){
try {
imgwidth = integer.parseint(width);
} catch (exception e) {}
if(height!=null&&!height.equals("")){
imgheight = integer.parseint(height);
bitmatrix bytematrix;
hashtable<encodehinttype, object> hints = new hashtable<encodehinttype, object>();
hints.put(encodehinttype.error_correction, errorcorrectionlevel.h);
bytematrix = new multiformatwriter().encode(
new string(content.getbytes("utf-8"),"iso-8859-1"),
barcodeformat.qr_code,
imgwidth,
imgheight,
hints);
bufferedimage image = tobufferedimage(bytematrix);
resp.setcontenttype("image/png");
imageio.write(image, "png", resp.getoutputstream());
} catch (exception e) {
}
參數m必須有,參數h、w可選,預設的寬高為110px。
由于zxing預設的編碼為iso-8859-1,是以使用其他編碼的時候會出現亂碼,即使執行其他的編碼方式,還是有問題,如果轉換為iso-8859-1就沒有亂碼。
還有一個很重要的内容,就是使用zxing的時候必須導出png格式的二維碼,導出jpg格式的時候,顔色就不是黑白的,很讓人費解,希望有人能給出原因。
二維碼效果圖: