JFinal使用技巧-生成条形码

睡不着... 逛论坛... 刚看见一个想要条形码的, 感觉有点意思, 模仿验证码写个例子

package test.plugin;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.servlet.ServletOutputStream;

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;

import com.jfinal.kit.LogKit;
import com.jfinal.render.Render;
import com.jfinal.render.RenderException;

/**
 * 生成条形码 - Barcode4J
 *   
 * @author dufuzhong
 * @date 2017年8月1日
 *  jar : http://mvnrepository.com/artifact/net.sf.barcode4j/barcode4j-light/2.0
 *  
 *  代码参考处: http://www.cnblogs.com/littleatp/p/4815921.html
 *  代码参考处: http://blog.csdn.net/wabiaozia/article/details/52747772
 */
public class BarcodeRender extends Render {

    private String msg;
    
    BarcodeRender(String msg){
        this.msg = msg;
    }
    
    // 自行扩展自己需要的业务

    @Override
    public void render() {
        
        
        Code39Bean bean = new Code39Bean();
        
        // 精细度
        final int dpi = 150;
        // module宽度
        final double moduleWidth = UnitConv.in2mm(1.0f / dpi);
 
        // 配置对象
        bean.setModuleWidth(moduleWidth);
        bean.setWideFactor(3);
        bean.doQuietZone(false);
 
        String mime = "image/png";
        
        response.setHeader("Pragma","no-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);
        response.setContentType(mime);

        ServletOutputStream sos = null;
        BitmapCanvasProvider canvas = null;
        try {
            sos = response.getOutputStream();
            
            // 输出到流
            canvas = new BitmapCanvasProvider(sos, mime, dpi,
                    BufferedImage.TYPE_BYTE_BINARY, false, 0);
            
            // 生成条形码
            bean.generateBarcode(canvas, msg);
            
            // 结束绘制
            canvas.finish();
        } catch (IOException e) {
            if (getDevMode()) {
                throw new RenderException(e);
            }
        } catch (Exception e) {
            throw new RenderException(e);
        } finally {
            if (sos != null) {
                try {sos.close();} catch (IOException e) {LogKit.logNothing(e);}
            }
        }
    }

}
测试一下:
//  /test/barcode/jfinal-20170801
@Clear()
public class BarcodeController extends Controller {
    
    public void index(){
        render(new BarcodeRender(getPara()));
    }

}

图片.png

23333, 解码就不写了

评论区

l745230

2017-08-01 10:55

JFinal

2017-08-01 11:00

代码十分简洁,楼主的功能越来越精进了,赞一个

JFinal

2017-08-01 11:00

顺便问一个,zxing 是否支持条形码,如果支持的话,就不必多引入一个 jar 包了

JFinal

2017-08-01 11:01

看了一下是支持的: http://blog.csdn.net/zmx729618/article/details/52846546

jfinal 3.2 打算加这个条形码功能,哈哈

杜福忠

2017-08-01 11:43

@JFinal 是老大教的好, 在 jfinal俱乐部 待着, 看大神们聊天, 耳濡目染... 自然就能学到几招上乘武功

这个条形码是随手写的.. 只是想给反馈那的小伙伴说明一下, 这个扩展是非常简单的

浅浅伤微微凉

2017-11-13 13:28

@JFinal @JFinal 想问下JFinal实现二维码引入是哪个jar包?

杜福忠

2017-11-13 15:09

@浅浅伤微微凉
在首页下载 jfinal-3.2-all.zip 这个文件,里面有一个说明文件指出是什么 jar 包,并且所有的 jar 包也提供了 :
10:google-zxing-core-3.2.1.jar、google-zxing-javase-3.2.1.jar、jcommander-1.48.jar
支持二维码生成

浅浅伤微微凉

2017-11-16 19:16

@杜福忠 Jfinal 导出excel

杜福忠

2017-11-16 21:19

@浅浅伤微微凉 我一般用Apache POI HSSF 去生成再输出的 .
或者如果数据量比较小(几千条,多了客户电脑打开会很卡), 可以直接用jfinal模版进行组装 html 的 table 然后再输出文件用 .xls 做文件后缀,就可以了

浅浅伤微微凉

2017-11-17 09:36

@杜福忠 需要maven引入poi-hssf依赖注入吗?为什么我引不进去啊

杜福忠

2017-11-17 12:10

@浅浅伤微微凉
https://gitee.com/dongcb678/JfinalUIB/blob/JFinalUIB_V4/platform/com/platform/tools/ToolPoi.java
你看下董老师的工具类吧

ming一名

2018-03-07 18:09

有谁遇到乱码的吗

饿了吃口葫芦肉

2018-06-19 20:53

我按照你发的例子,生成了条形码,前台应该如何取值?是否按照二维码的写法来写呢。< img style="height: 180px; width: 180px" src="/onShelfPerson/test" />。但是这样写的话,src后面的内容原样输出,没有走后台。

杜福忠

2018-06-19 21:26

@ming一名 服务器没有对应字体, 安装一下字体库, 或者升级到jfinal最新版

杜福忠

2018-06-19 21:37

@饿了吃口葫芦肉
<img src="/test/barcode/jfinal-20170801">
是这样的啊

饿了吃口葫芦肉

2018-06-20 09:30

@杜福忠 直接指向后台的方法传参数么?我是这样写的 < img src="/controller/方法名/参数" />,但是他没有走后台的方法,直接就把这个img原样读出来了。

杜福忠

2018-06-20 10:03

@饿了吃口葫芦肉 "img原样" 是什么意思 ? 例子代码我测试过, 没有问题,
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test-barcode</title>
</head>
<body>
<img src="/test/barcode/jfinal-20170801">
</body>
</html>

JAVA:
/**
* /test/barcode/jfinal-20170801
*/
public class BarcodeController extends Controller {
public void index(){
render(new BarcodeRender(getPara()));
}
}

饿了吃口葫芦肉

2018-06-20 11:59

@杜福忠 刚刚解决了,我写的方法名是test,被eova拦截了,改了一下就可以了,十分感谢您的帮助。谢谢。

热门分享

扫码入社