正在开发的一个j2ee的项目项目中需要使用到生成条形码 这里用了Barcode4J作为条形码生成,官网地址是http://barcode4j.sourceforge.net/ 里面有很详细的介绍。本人只是项目使用。所以就不介绍了。
首先下载barcode4j-2.0-bin.zip和barcode4j-2.0-src.zip 由于里面提供的例子是用servlet使用的。而我项目是用的 是struts,所以更改了下源代码换成action。
以下代码中。createBarcode()方法是最主要的action方法,提供给用户调用。
一下就是一个生成条形码的action类。
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
importorg.apache.avalon.framework.configuration.Configuration;
importorg.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.BarcodeUtil;
importorg.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.output.eps.EPSCanvasProvider;
import org.krysalis.barcode4j.output.svg.SVGCanvasProvider;
import org.krysalis.barcode4j.tools.MimeTypes;
public class BarcodeAction extends BaseAction {
private static final long serialVersionUID =-134361457426852420L;
publicstatic final StringBARCODE_MSG = "msg";
publicstatic final StringBARCODE_TYPE = "type";
publicstatic final StringBARCODE_HEIGHT = "height";
publicstatic final StringBARCODE_MODULE_WIDTH = "mw";
publicstatic final StringBARCODE_WIDE_FACTOR = "wf";
publicstatic final StringBARCODE_QUIET_ZONE = "qz";
publicstatic final String BARCODE_HUMAN_READABLE_POS ="hrp";
publicstatic final StringBARCODE_FORMAT = "fmt";
publicstatic final StringBARCODE_IMAGE_RESOLUTION = "res";
publicstatic final StringBARCODE_IMAGE_GRAYSCALE = "gray";
publicstatic final String BARCODE_HUMAN_READABLE_SIZE = "hrsize";
publicstatic final String BARCODE_HUMAN_READABLE_FONT = "hrfont";
publicstatic final String BARCODE_HUMAN_READABLE_PATTERN ="hrpattern";
privatetransient Logger log = newConsoleLogger(ConsoleLogger.LEVEL_INFO);
public String createBarcode() throwsServletException{
try {
String format = determineFormat(request);
int orientation = 0;
Configuration cfg = buildCfg(request);
String msg = request.getParameter(BARCODE_MSG);
if (msg == null) msg = "0123456789";
BarcodeUtil util = BarcodeUtil.getInstance();
BarcodeGenerator gen = util.createBarcodeGenerator(cfg);
ByteArrayOutputStream bout = new ByteArrayOutputStream(4096);
try {
if (format.equals(MimeTypes.MIME_SVG)) {
//Create Barcode and render it to SVG
SVGCanvasProvider svg = new SVGCanvasProvider(false,orientation);
gen.generateBarcode(svg, msg);
org.w3c.dom.DocumentFragment frag = svg.getDOMFragment();
//Serialize SVG barcode
TransformerFactory factory =TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
Source src = new javax.xml.transform.dom.DOMSource(frag);
Result res = newjavax.xml.transform.stream.StreamResult(bout);
trans.transform(src, res);
} else if (format.equals(MimeTypes.MIME_EPS)) {
EPSCanvasProvider eps = new EPSCanvasProvider(bout,orientation);
gen.generateBarcode(eps, msg);
eps.finish();
} else {
String resText =request.getParameter(BARCODE_IMAGE_RESOLUTION);
int resolution = 300; //dpi
if (resText != null) {
resolution = Integer.parseInt(resText);
}
if (resolution > 2400) {
throw new IllegalArgumentException(
"Resolutions above 2400dpi are not allowed");
}
if (resolution < 10) {
throw new IllegalArgumentException(
"Minimum resolution must be 10dpi");
}
String gray = request.getParameter(BARCODE_IMAGE_GRAYSCALE);
BitmapCanvasProvider bitmap = ("true".equalsIgnoreCase(gray)
? new BitmapCanvasProvider(
bout, format, resolution,
BufferedImage.TYPE_BYTE_GRAY, true, orientation)
: new BitmapCanvasProvider(
bout, format, resolution,
BufferedImage.TYPE_BYTE_BINARY, false, orientation));
gen.generateBarcode(bitmap, msg);
bitmap.finish();
}
} finally {
bout.close();
}
response.setContentType(format);
response.setContentLength(bout.size());
response.getOutputStream().write(bout.toByteArray());
response.getOutputStream().flush();
} catch (Exception e) {
log.error("Error while generating barcode", e);
throw new ServletException(e);
} catch (Throwable t) {
log.error("Error while generating barcode", t);
throw new ServletException(t);
}
return null;
}
protectedString determineFormat(HttpServletRequest request) {
String format = request.getParameter(BARCODE_FORMAT);
format = MimeTypes.expandFormat(format);
if (format == null) format = MimeTypes.MIME_JPEG;
return format;
}
protectedConfiguration buildCfg(HttpServletRequest request) {
DefaultConfiguration cfg = newDefaultConfiguration("barcode");
//Get type
String type = request.getParameter(BARCODE_TYPE);
if (type == null) type = "code128";
DefaultConfiguration child = new DefaultConfiguration(type);
cfg.addChild(child);
//Get additional attributes
DefaultConfiguration attr;
String height = request.getParameter(BARCODE_HEIGHT);
if (height != null) {
attr = new DefaultConfiguration("height");
attr.setValue(height);
child.addChild(attr);
}
String moduleWidth =request.getParameter(BARCODE_MODULE_WIDTH);
if (moduleWidth != null) {
attr = new DefaultConfiguration("module-width");
attr.setValue(moduleWidth);
child.addChild(attr);
}
String wideFactor =request.getParameter(BARCODE_WIDE_FACTOR);
if (wideFactor != null) {
attr = new DefaultConfiguration("wide-factor");
attr.setValue(wideFactor);
child.addChild(attr);
}
String quietZone = request.getParameter(BARCODE_QUIET_ZONE);
if (quietZone != null) {
attr = new DefaultConfiguration("quiet-zone");
if (quietZone.startsWith("disable")) {
attr.setAttribute("enabled", "false");
} else {
attr.setValue(quietZone);
}
child.addChild(attr);
}
String humanReadablePosition =request.getParameter(BARCODE_HUMAN_READABLE_POS);
String pattern =request.getParameter(BARCODE_HUMAN_READABLE_PATTERN);
String humanReadableSize =request.getParameter(BARCODE_HUMAN_READABLE_SIZE);
String humanReadableFont =request.getParameter(BARCODE_HUMAN_READABLE_FONT);
if (!((humanReadablePosition == null)
&& (pattern == null)
&& (humanReadableSize == null)
&& (humanReadableFont == null))) {
attr = new DefaultConfiguration("human-readable");
DefaultConfiguration subAttr;
if (pattern != null) {
subAttr = new DefaultConfiguration("pattern");
subAttr.setValue(pattern);
attr.addChild(subAttr);
}
if (humanReadableSize != null) {
subAttr = new DefaultConfiguration("font-size");
subAttr.setValue(humanReadableSize);
attr.addChild(subAttr);
}
if (humanReadableFont != null) {
subAttr = new DefaultConfiguration("font-name");
subAttr.setValue(humanReadableFont);
attr.addChild(subAttr);
}
if (humanReadablePosition != null) {
subAttr = new DefaultConfiguration("placement");
subAttr.setValue(humanReadablePosition);
attr.addChild(subAttr);
}
child.addChild(attr);
}
return cfg;
}
}
以上很多参数的设置,我自己也不是很了解。如果需要的话。可以官网详细了解。
调用方式,直接在页面定义一张图片,而条形码的内容 可以自定义传入,也可以动态传入
如果是自定义传入,图片中msg=22222就是生成的内容 type就是生成的规格(code39,Codabar等)