java生成一维码

/**
 * 
 * 一维码图片生成器
 * @author winter.liu
 *
 */
public class OneBarcodeUtil {
	
	
	/**
	 * 生成一维码
	 * @param value 值
	 * @return
	 */
	public static byte[] createBarcodeDefault(String value){
		return createBarcode(Code39Encoder.class,value,false);
	}
	
	//产生一维码图片
	public static byte[] createBarcode(Class<?> clazz,String value,boolean checkDigit){
		  try{
			  JBarcode localJBarcode = new JBarcode(getInstance(clazz),WidthCodedPainter.getInstance(),EAN13TextPainter.getInstance());  
		      localJBarcode.setPainter(WideRatioCodedPainter.getInstance());  
		      localJBarcode.setTextPainter(BaseLineTextPainter.getInstance());  
		      localJBarcode.setCheckDigit(checkDigit);
		      localJBarcode.setShowCheckDigit(checkDigit);
		      return getBytes(localJBarcode.createBarcode(value));  
		  }catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	//获取单例的对象
	private static BarcodeEncoder getInstance(Class<?> clazz) throws Exception{
		Constructor<?>[] constructors=clazz.getDeclaredConstructors();
		Constructor<?> privateConstructor = constructors[0];
		privateConstructor.setAccessible(true);
		return (BarcodeEncoder)privateConstructor.newInstance();
		
	}
	
	//获取图片字节码数组
	private static byte[] getBytes(BufferedImage paramBufferedImage) throws IOException{  
	      return ImageUtil.encode(paramBufferedImage,"jpeg", 96, 96);
	}  

}

所需jar:jbarcode-0.2.8.jar

原文地址:http://blog.youkuaiyun.com/angelmymei/article/details/14518251

如何把字节传到前台并以图片展示参考:http://www.cnblogs.com/Dtscal/archive/2013/02/01/2889080.html


上面的东西是前断时间写的,悲剧的是生成出来的条形码扫描不出来,放大也不行,经过查找分析,原因用一张图来说明


具体怎么对应可以参考网址:http://www.aichengxu.com/view/22024


下面给我我128码的例子(正确的

package org.transportation.tc.common.print;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.lang.reflect.Constructor;

import org.jbarcode.JBarcode;
import org.jbarcode.encode.BarcodeEncoder;
import org.jbarcode.encode.Code128Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.WidthCodedPainter;
import org.jbarcode.util.ImageUtil;

/**
 * 二维条码可以支持中文、图片、甚至是其它多媒体文件。
 * 一维条码不同的码制支持的符号数量也不同,有些只支持数字(如商品条码、二五条码),
 * 有些支持部分符号(如39条码、CODABAR码),
 * 有些支持全部的英文字母、数字和符号(如CODE-128码)。
 * 你说的/这个符号,39码,codabar码和code-128码都可以表示。
 * 一维码图片生成器
 * @author winter.liu
 *
 */
public class OneBarcodeUtil {
	
	
	/**
	 * 生成一维码
	 * @param value 值
	 * @return
	 */
	public static byte[] createBarcodeDefault(String value){
		return createBarcode(Code128Encoder.class,value,false);
	}
	
	//产生一维码图片
	public static byte[] createBarcode(Class<?> clazz,String value,boolean checkDigit){
		  try{
			  JBarcode localJBarcode = new JBarcode(getInstance(clazz),WidthCodedPainter.getInstance(),BaseLineTextPainter.getInstance());  
		/*      
		 * 参考http://www.aichengxu.com/view/22024
		 * localJBarcode.setPainter(WideRatioCodedPainter.getInstance());  
		      localJBarcode.setTextPainter(BaseLineTextPainter.getInstance()); */ 
		      localJBarcode.setCheckDigit(checkDigit);
		      localJBarcode.setShowCheckDigit(checkDigit);
		      return getBytes(localJBarcode.createBarcode(value)); 
		      /**
		       *  jBarcode.setShowText(true);//显示图片下字符串内容
				  jBarcode.setShowCheckDigit(true);//显示字符串内容中是否显示检查码内容
				  jBarcode.setCheckDigit(false);//不生成检查码
				       检查码又叫校验码。一般是条码数据中的最后一位,它由条码的主体数据按一定规则计算而来,用扫描器扫描时,
				       会把读到的数据按同样的规则计算一个校验码再和读到的校验码进行比较,如果一致说明读到的数据是正确的,不一致则说明读取的数据有误。
		       */
		  }catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	//获取单例的对象
	private static BarcodeEncoder getInstance(Class<?> clazz) throws Exception{
		Constructor<?>[] constructors=clazz.getDeclaredConstructors();
		Constructor<?> privateConstructor = constructors[0];
		privateConstructor.setAccessible(true);
		return (BarcodeEncoder)privateConstructor.newInstance();
		
	}
	
	//获取图片字节码数组
	private static byte[] getBytes(BufferedImage paramBufferedImage) throws IOException{  
	      return ImageUtil.encode(paramBufferedImage,"png", 96, 96);//jpeg
	}  
	
	public static void main(String[] args) {
		byte[] b = createBarcodeDefault("988434a");
		System.out.println(b.length);
	}
}

):


下面给我出EAN8码的例子,主要喜欢里面用的几个工具类 所以记录下

package org.transportation.tc.common.print;

/* 
 2. * To change this template, choose Tools | Templates 
 3. * and open the template in the editor. 
 4. */

import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import org.jbarcode.JBarcode;
import org.jbarcode.encode.EAN8Encoder;
import org.jbarcode.paint.EAN8TextPainter;
import org.jbarcode.paint.WidthCodedPainter;
import org.jbarcode.util.ImageUtil;

/**
 * 支持EAN13, EAN8, UPCA, UPCE, Code 3 of 9, Codabar, Code 11, Code 93, Code 128,
 * MSI/Plessey, Interleaved 2 of PostNet等 利用jbarcode生成各种条形码!测试成功!分享给大家!
 * http://bbs.it-home.org/thread-1814-1-1.html
 */
public class OneBarcodeUtil2 {

	public static void main(String[] paramArrayOfString) {
		try {
			JBarcode localJBarcode = new JBarcode(EAN8Encoder.getInstance(),WidthCodedPainter.getInstance(),EAN8TextPainter.getInstance());
			String str = "221a9644";
			BufferedImage localBufferedImage = localJBarcode.createBarcode(str);

			saveToJPEG(localBufferedImage, "EAN8.jpg");
		} 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(
					"D:\\/" + paramString1);
			ImageUtil.encodeAndWrite(paramBufferedImage, paramString2,
					localFileOutputStream, 96, 96);
			localFileOutputStream.close();
		} catch (Exception localException) {
			localException.printStackTrace();
		}
	}
}

特别提醒生成出来的一维码应该把图片宽度加大,否则也可能扫描不出来或者不容易扫描出来


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值