java使用jbarcode生成条形码

来源:互联网 发布:淘宝一元抢购在哪里 编辑:程序博客网 时间:2024/05/21 06:22

准备工作:

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

所需jar包:jbarcode-0.2.8.jar

案例:

[java] view plain copy
  1. package jbarcode;    
  2. import java.awt.Color;  
  3. import java.awt.Font;  
  4. import java.awt.FontMetrics;  
  5. import java.awt.Graphics;  
  6. import java.awt.image.BufferedImage;  
  7. import java.io.File;  
  8. import java.io.FileNotFoundException;  
  9. import java.io.FileOutputStream;  
  10. import java.io.IOException;  
  11. import java.io.OutputStream;  
  12. import java.util.ArrayList;  
  13. import java.util.List;  
  14. import org.jbarcode.JBarcode;  
  15. import org.jbarcode.JBarcodeFactory;  
  16. import org.jbarcode.encode.Code128Encoder;  
  17. import org.jbarcode.encode.InvalidAtributeException;  
  18. import org.jbarcode.paint.TextPainter;  
  19. import org.jbarcode.util.ImageUtil;  
  20.         
  21.     /**  
  22.      *@class:JbarcodeUtil  
  23.      *@descript:生成条形码最标准  
  24.      *@date:2016年11月25日 下午1:46:07  
  25.      *@version:V1.0  
  26.      *备注:  
  27.      *1.静态代码块的作用:当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。  
  28.      *2.常量条形码的高度和字体大小设置很重要,若是设置小了会看不到设置的文件  
  29.      */    
  30.     public class JbarcodeUtil {    
  31.         
  32.         //设置条形码高度    
  33.         private static final int BARCODE_HEIGHT = 40;    
  34.         //设置条形码默认分辨率    
  35.         private static final int BARCODE_DPI = ImageUtil.DEFAULT_DPI;    
  36.         //设置条形码字体样式    
  37.         private static final String FONT_FAMILY = "console";    
  38.         //设置条形码字体大小    
  39.         private static final int FONT_SIZE = 15;    
  40.         //设置条形码文本    
  41.         public static String TEXT = "";    
  42.         //创建jbarcode    
  43.         private static JBarcode jbc = null;    
  44.             
  45.         static JBarcode getJBarcode() throws InvalidAtributeException {    
  46.          /**  
  47.          * 参考设置样式:  
  48.          *barcode.setEncoder(Code128Encoder.getInstance()); //设置编码 
  49.          *barcode.setPainter(WidthCodedPainter.getInstance());// 设置Painter 
  50.          *barcode.setTextPainter(BaseLineTextPainter.getInstance()); //设置TextPainter 
  51.          *barcode.setBarHeight(17); //设置高度 
  52.          *barcode.setWideRatio(Double.valueOf(30).doubleValue());// 设置宽度比率 
  53.          *barcode.setXDimension(Double.valueOf(2).doubleValue()); // 设置尺寸,大小 密集程度 
  54.          *barcode.setShowText(true); //是否显示文本 
  55.           *barcode.setCheckDigit(true); //是否检查数字 
  56.          *barcode.setShowCheckDigit(false); //是否显示检查数字 
  57.         */    
  58.         if (jbc == null) {    
  59.             //生成code128    
  60.             jbc = JBarcodeFactory.getInstance().createCode128();   
  61.             jbc.setEncoder(Code128Encoder.getInstance());    
  62.             jbc.setTextPainter(CustomTextPainter.getInstance());    
  63.             jbc.setBarHeight(BARCODE_HEIGHT);    
  64.             jbc.setXDimension(Double.valueOf(0.8).doubleValue());  
  65.             jbc.setShowText(true);    
  66.         }    
  67.         return jbc;    
  68.         }    
  69.         
  70.         /**  
  71.          * @descript:生成条形码文件  
  72.          * @param message  条形码内容  
  73.          * @param file   生成文件  
  74.          */    
  75.         public static void createBarcode(String message, File file,String text) {    
  76.             try {    
  77.                 FileOutputStream fos = new FileOutputStream(file);    
  78.                 createBarcode(message, fos,text);    
  79.                 fos.close();    
  80.             } catch (IOException e) {    
  81.                 throw new RuntimeException(e);    
  82.             }    
  83.         }    
  84.         
  85.         /**  
  86.          * @descript:生成条形码并写入指定输出流  
  87.          * @param message   条形码内容  
  88.          * @param os   输出流  
  89.          */    
  90.         public static void createBarcode(String message, OutputStream os,String text) {    
  91.             try {    
  92.                 //设置条形码文本  
  93.                 TEXT=text;  
  94.                 //创建条形码的BufferedImage图像    
  95.                 BufferedImage image = getJBarcode().createBarcode(message);    
  96.                 ImageUtil.encodeAndWrite(image, ImageUtil.PNG, os, BARCODE_DPI, BARCODE_DPI);    
  97.                 os.flush();    
  98.             } catch (Exception e) {    
  99.                 throw new RuntimeException(e);    
  100.             }    
  101.         }    
  102.         
  103.         /**  
  104.          * 静态内部类  
  105.          * 自定义的 TextPainter, 允许定义字体,大小,文本等  
  106.          * 参考底层实现:BaseLineTextPainter.getInstance()  
  107.          */    
  108.         protected static class CustomTextPainter implements TextPainter {    
  109.            private static CustomTextPainter instance =new CustomTextPainter();    
  110.            public static CustomTextPainter getInstance() {    
  111.                 return instance;    
  112.            }    
  113.            public void paintText(BufferedImage barCodeImage, String text, int width) {    
  114.                 //绘图    
  115.                 Graphics g2d = barCodeImage.getGraphics();    
  116.                 //创建字体    
  117.                 Font font = new Font(FONT_FAMILY, Font.PLAIN, FONT_SIZE * width);    
  118.                 g2d.setFont(font);    
  119.                 FontMetrics fm = g2d.getFontMetrics();    
  120.                 int height = fm.getHeight();    
  121.                 int center = (barCodeImage.getWidth() - fm.stringWidth(text)) / 2;    
  122.                 g2d.setColor(Color.WHITE);    
  123.                 g2d.fillRect(00, barCodeImage.getWidth(), barCodeImage.getHeight() * 1 / 20);    
  124.                 g2d.fillRect(0, barCodeImage.getHeight() - (height * 9 / 10), barCodeImage.getWidth(), (height * 9 / 10));    
  125.                 g2d.setColor(Color.BLACK);    
  126.                 //绘制文本    
  127.                 g2d.drawString(TEXT, 0145);    
  128.                 //绘制条形码    
  129.                 g2d.drawString(text, center, barCodeImage.getHeight() - (height / 10) - 2);    
  130.             }    
  131.         }    
  132.         
  133.         //测试    
  134.         public static void main(String[] args) throws FileNotFoundException, IOException {    
  135.             List<String> list=new ArrayList<String>();    
  136.             list.add("KJ4.1-0127-0001");    
  137.             list.add("KJ4.1-0128-0001");    
  138.             list.add("KJ4.1-0129-0001");    
  139.             list.add("KJ4.1-0130-0001");    
  140.             if(list!=null && list.size()>0){    
  141.                 for(String message:list){    
  142.                     JbarcodeUtil.createBarcode(message, new File("D:\\codeImg\\"+message+".png"),"苏交科");    
  143.                 }    
  144.             }       
  145.               
  146.         }    
  147.     }    

效果图:


条形码样式:



备注:

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.该案例生成的条形码扫描反应慢


原创粉丝点击