天天看點

使用zxing生成二維碼 - servlet形式

因為項目有個功能需要列印二維碼,因為我比較喜歡使用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格式的時候,顔色就不是黑白的,很讓人費解,希望有人能給出原因。

二維碼效果圖:

使用zxing生成二維碼 - servlet形式