java使用jbarcode生成条形码

准备工作:

开发工具:eclipse4.5+jdk1.7

所需jar包:jbarcode-0.2.8.jar

案例:

package jbarcode;  
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.jbarcode.JBarcode;
import org.jbarcode.JBarcodeFactory;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.encode.InvalidAtributeException;
import org.jbarcode.paint.TextPainter;
import org.jbarcode.util.ImageUtil;
      
    /** 
     *@class:JbarcodeUtil 
     *@descript:生成条形码最标准 
     *@date:2016年11月25日 下午1:46:07 
     *@version:V1.0 
     *备注: 
     *1.静态代码块的作用:当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。 
     *2.常量条形码的高度和字体大小设置很重要,若是设置小了会看不到设置的文件 
     */  
    public class JbarcodeUtil {  
      
        //设置条形码高度  
        private static final int BARCODE_HEIGHT = 40;  
        //设置条形码默认分辨率  
        private static final int BARCODE_DPI = ImageUtil.DEFAULT_DPI;  
        //设置条形码字体样式  
        private static final String FONT_FAMILY = "console";  
        //设置条形码字体大小  
        private static final int FONT_SIZE = 15;  
        //设置条形码文本  
        public static String TEXT = "";  
        //创建jbarcode  
        private static JBarcode jbc = null;  
          
        static JBarcode getJBarcode() throws InvalidAtributeException {  
         /** 
         * 参考设置样式: 
         *barcode.setEncoder(Code128Encoder.getInstance()); //设置编码
         *barcode.setPainter(WidthCodedPainter.getInstance());// 设置Painter
         *barcode.setTextPainter(BaseLineTextPainter.getInstance()); //设置TextPainter
         *barcode.setBarHeight(17); //设置高度
         *barcode.setWideRatio(Double.valueOf(30).doubleValue());// 设置宽度比率
         *barcode.setXDimension(Double.valueOf(2).doubleValue()); // 设置尺寸,大小 密集程度
         *barcode.setShowText(true); //是否显示文本
          *barcode.setCheckDigit(true); //是否检查数字
         *barcode.setShowCheckDigit(false); //是否显示检查数字
        */  
        if (jbc == null) {  
            //生成code128  
            jbc = JBarcodeFactory.getInstance().createCode128(); 
            jbc.setEncoder(Code128Encoder.getInstance());  
            jbc.setTextPainter(CustomTextPainter.getInstance());  
            jbc.setBarHeight(BARCODE_HEIGHT);  
            jbc.setXDimension(Double.valueOf(0.8).doubleValue());
            jbc.setShowText(true);  
        }  
        return jbc;  
        }  
      
        /** 
         * @descript:生成条形码文件 
         * @param message  条形码内容 
         * @param file   生成文件 
         */  
        public static void createBarcode(String message, File file,String text) {  
            try {  
                FileOutputStream fos = new FileOutputStream(file);  
                createBarcode(message, fos,text);  
                fos.close();  
            } catch (IOException e) {  
                throw new RuntimeException(e);  
            }  
        }  
      
        /** 
         * @descript:生成条形码并写入指定输出流 
         * @param message   条形码内容 
         * @param os   输出流 
         */  
        public static void createBarcode(String message, OutputStream os,String text) {  
            try {  
            	//设置条形码文本
            	TEXT=text;
                //创建条形码的BufferedImage图像  
                BufferedImage image = getJBarcode().createBarcode(message);  
                ImageUtil.encodeAndWrite(image, ImageUtil.PNG, os, BARCODE_DPI, BARCODE_DPI);  
                os.flush();  
            } catch (Exception e) {  
                throw new RuntimeException(e);  
            }  
        }  
      
        /** 
         * 静态内部类 
         * 自定义的 TextPainter, 允许定义字体,大小,文本等 
         * 参考底层实现:BaseLineTextPainter.getInstance() 
         */  
        protected static class CustomTextPainter implements TextPainter {  
           private static CustomTextPainter instance =new CustomTextPainter();  
           public static CustomTextPainter getInstance() {  
                return instance;  
           }  
           public void paintText(BufferedImage barCodeImage, String text, int width) {  
                //绘图  
                Graphics g2d = barCodeImage.getGraphics();  
                //创建字体  
                Font font = new Font(FONT_FAMILY, Font.PLAIN, FONT_SIZE * width);  
                g2d.setFont(font);  
                FontMetrics fm = g2d.getFontMetrics();  
                int height = fm.getHeight();  
                int center = (barCodeImage.getWidth() - fm.stringWidth(text)) / 2;  
                g2d.setColor(Color.WHITE);  
                g2d.fillRect(0, 0, barCodeImage.getWidth(), barCodeImage.getHeight() * 1 / 20);  
                g2d.fillRect(0, barCodeImage.getHeight() - (height * 9 / 10), barCodeImage.getWidth(), (height * 9 / 10));  
                g2d.setColor(Color.BLACK);  
                //绘制文本  
                g2d.drawString(TEXT, 0, 145);  
                //绘制条形码  
                g2d.drawString(text, center, barCodeImage.getHeight() - (height / 10) - 2);  
            }  
        }  
      
        //测试  
        public static void main(String[] args) throws FileNotFoundException, IOException {  
            List<String> list=new ArrayList<String>();  
            list.add("KJ4.1-0127-0001");  
            list.add("KJ4.1-0128-0001");  
            list.add("KJ4.1-0129-0001");  
            list.add("KJ4.1-0130-0001");  
            if(list!=null && list.size()>0){  
                for(String message:list){  
                    JbarcodeUtil.createBarcode(message, new File("D:\\codeImg\\"+message+".png"),"苏交科");  
                }  
            }     
            
        }  
    }  

效果图:


条形码样式:



备注:

1.//设置条形码高度
    private static final int BARCODE_HEIGHT = 20;

  //设置条形码字体大小
  private static final int FONT_SIZE = 15;

这2个设置大小很重要,若是设置值小了则看不到文件如“苏薇”,自己可以把值修改为12运行下会发现文本"苏微"看不到,这是由于高度太小,字体无法显示

2.生成的条形码用扫码枪可以扫描,但是有时候扫描不了,原因是生成的条形码密度太厚,故"jbc.setXDimension(Double.valueOf(0.8).doubleValue());"设置很重要,值越小密度越细,条形码宽度越宽。

3.案例中message="KJ4.1-0130-0001",若message="KJ4.1-0130-0001(001)"则扫描不了,原因识别不了括号

4.该案例生成的条形码扫描反应慢






  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值