Java生成一维码并显示到前端打印

项目要求的是使用chrome浏览器

最近手上项目要求实现打印功能,其中就要求将单号生成一维码,显示到前端并打印,下面为具体实现细节:如有说的不对的地方,希望指正!

一).首先将单号生成一维码,这里介绍两种:

1.

public class CodeScan {
    static BASE64Encoder encoder = new sun.misc.BASE64Encoder();

    public static void main(String[] paramArrayOfString) {
        try {
//            JBarcode localJBarcode = new JBarcode(EAN8Encoder.getInstance(), WidthCodedPainter.getInstance(), EAN8TextPainter.getInstance());//EAN8不支字母
            JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(),WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());//code128
            String str = "AA2219644";
            BufferedImage localBufferedImage = localJBarcode.createBarcode(str);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
     
           saveToJPEG(localBufferedImage, "EAN8.jpeg");
        } catch (Exception localException) {
            localException.printStackTrace();
        }
    }


    static void saveToJPEG(BufferedImage paramBufferedImage, String paramString) {
        saveToFile(paramBufferedImage, paramString, "jpeg");
    }

    static void saveToFile(BufferedImage paramBufferedImage, String paramString1, String paramString2) {
        try {
            FileOutputStream localFileOutputStream = new FileOutputStream("C:\\Users\\Administrator\\Desktop/" + paramString1);
            ImageUtil.encodeAndWrite(paramBufferedImage, paramString2, localFileOutputStream, 500, 500);
            localFileOutputStream.close();
        } catch (Exception localException) {
            localException.printStackTrace();
        }
    }
}


因为第一种是需要将图片保存下来,再传到前台,感觉太麻烦了,用完了以后还要删除,所以下就有第二种方法:

2.将bufferImage生成的图片利用ImageIo将内容写到ByteArrayoutOutputStream缓存中,在利用Base64Encoder将内容编码,下面为具体细节:

private JSONObject createBase64Image(JSONObject jsonObject, String number) throws InvalidAtributeException, IOException {
        if(number == null || number.equals("")) return jsonObject;
        BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());
        BufferedImage image = localJBarcode.createBarcode(number);


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "jpeg", baos);
        byte[] bytes = baos.toByteArray();
        jsonObject.put("base64code", encoder.encodeBuffer(bytes).trim());
        return jsonObject;
    }


二:前端是Extjs,打印页面是html组成,

1.在测试的时候发现直接将上面第一种生成的图片路径设置为<img src=“路径”/>,前端显示不了;需要将图片放置在项目,比如web下有一个images文件夹用来放置图片,要显示的图片为"test.jpeg",那么 src的路径为 <img src="http://localhost/images/test.jpeg" />,这样的 话就能显示出来啦!如果没有显示请等上十来秒,然后重新点击打印预览

2.当然在这里需要注意的是如果图片格式为png,并且浏览器为chrome,有可能图片不能显示,需要在打印预览页面使用Alt+F9(将页面视图转换为web视图),这样的话是可以显示但是你不觉得太麻烦吗?下面介绍第三种显示方法:

3.将img标签的src变为http请求

<img id="imgVcode" src="http://localhost:8080/missioncreateCodeImage.action?number='+produceNumber+'" />
,向后台获取图片,注意这里不是获取路径而是图片内容,下面是后台获取请求并响应:

   

public String createCodeImage() {
        try {


            String number = getParamStr("number");
            JBarcode localJBarcode = new JBarcode(Code128Encoder.getInstance(), WidthCodedPainter.getInstance(), BaseLineTextPainter.getInstance());
            BufferedImage image = localJBarcode.createBarcode(number);
            HttpServletResponse response = ServletActionContext.getResponse();
            response.reset();
            response.setContentType("image/jpeg");
            OutputStream ops =
                    response.getOutputStream();
            javax.imageio.ImageIO
                    .write(image, "jpeg", ops);
            ops.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

这样获取的图片内容,在chrome中测试,居然不显示,后来又在其他浏览器中测试均正常,并且生成的图片加载速度相较于路径引用来说快的多;如果对浏览器没有什么要求的话可以使用这种方式,下面为第四种:

4.打印页面图片显示为

<img src="data:image/jpeg;base64,'+val.base64code+'" />
, 其中data:image/jpeg为图片格式,base64为编码格式;上面第一部分第二种生成图片方式就是将图片编码的代码

 此Java代码sun.misc.BASE64Decoder这个包导入不进去的话,请将eclipse的Java运行环境修改成不是eclipse自带的jdk,换成本地1.7的jdk就OK了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值