*
* Copyright 2002-2007 Jeremias Maerki or contributors to Barcode4J, as applicable
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.util;
/*
* 作者:朱湘鄂
* 目的:达到实现条形码的效果
* 日期:2010-05-24
*/
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
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;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.BarcodeUtil;
import org.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;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.avalon.framework.logger.ConsoleLogger;
import org.apache.avalon.framework.logger.Logger;
/**
* Simple barcode servlet.
*
* @version $Id: BarcodeServlet.java,v 1.7 2008/03/04 20:07:23 jmaerki Exp $
*/
public class BarcodeServlet extends HttpServlet {
/** Parameter name for the message */
public static final String BARCODE_MSG = "msg";
/** Parameter name for the barcode type */
public static final String BARCODE_TYPE = "type";
/** Parameter name for the barcode height */
public static final String BARCODE_HEIGHT = "height";
/** Parameter name for the module width */
public static final String BARCODE_MODULE_WIDTH = "mw";
/** Parameter name for the wide factor */
public static final String BARCODE_WIDE_FACTOR = "wf";
/** Parameter name for the quiet zone */
public static final String BARCODE_QUIET_ZONE = "qz";
/** Parameter name for the human-readable placement */
public static final String BARCODE_HUMAN_READABLE_POS = "hrp";
/** Parameter name for the output format */
public static final String BARCODE_FORMAT = "fmt";
/** Parameter name for the image resolution (for bitmaps) */
public static final String BARCODE_IMAGE_RESOLUTION = "res";
/** Parameter name for the grayscale or b/w image (for bitmaps) */
public static final String BARCODE_IMAGE_GRAYSCALE = "gray";
/** Parameter name for the font size of the human readable display */
public static final String BARCODE_HUMAN_READABLE_SIZE = "hrsize";
/** Parameter name for the font name of the human readable display */
public static final String BARCODE_HUMAN_READABLE_FONT = "hrfont";
/** Parameter name for the pattern to format the human readable message */
public static final String BARCODE_HUMAN_READABLE_PATTERN = "hrpattern";
private transient Logger log = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);
/**
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest, HttpServletResponse)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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 = new javax.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);
}
}
/**
* Check the request for the desired output format.
* @param request the request to use
* @return MIME type of the desired output format.
*/
protected String determineFormat(HttpServletRequest request) {
String format = request.getParameter(BARCODE_FORMAT);
format = MimeTypes.expandFormat(format);
if (format == null) format = MimeTypes.MIME_JPEG;
return format;
}
/**
* Build an Avalon Configuration object from the request.
* @param request the request to use
* @return the newly built COnfiguration object
* @todo Change to bean API
*/
protected Configuration buildCfg(HttpServletRequest request) {
DefaultConfiguration cfg = new DefaultConfiguration("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);
}
// creating human readable configuration according to the new Barcode Element Mappings
// where the human-readable has children for font name, font size, placement and
// custom pattern.
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;
}
}
在web.xml中的配置为:
<!-- 条形码的servlet映射和路径 -->
<servlet>
<servlet-name>BarcodeServlet</servlet-name>
<servlet-class>com.util.BarcodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BarcodeServlet</servlet-name>
<url-pattern>/barcode</url-pattern>
</servlet-mapping>
页面的访问:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>zhuzhu</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<img src="<%=request.getContextPath() %>/barcode?msg=12345678" height="50px" width=130px/>
</body>
</html>
实现的效果图为:
分享到:
相关推荐
目前比较通用的用Java实现条形码打印的集成插件主要有:barbecue和barcode4j. 但是用barbecue,条形码可以显示出来,可是下面对应数字却不能显示出来,当然可以自己手动加上去,不过那就不是一张图片里面的了,并且...
本篇将深入探讨如何使用Java结合ZXing库来生成包含文字标签信息的条形码和二维码。 ZXing,全称为“Zebra Crossing”,是一个开源的、跨平台的条码读取和生成项目。它支持多种条码格式,包括一维条形码(如EAN-13、...
Java 实现条形码编程是一项常见的任务,尤其在自动化数据处理、库存管理、物流跟踪等领域。这个项目提供了完整的实现,确保能够正确运行并经过测试,为有相关需求的用户提供了一个可靠的解决方案。 首先,我们需要...
"JAVA实现条形码架包" 是一个专为Java开发者设计的库,它提供了生成和解析各种类型条形码的能力。这个包的核心组件是`JBarcodeBean`,它是一个基于Java的条形码生成工具,能够帮助开发者在应用程序中集成条形码功能...
本篇将详细介绍如何使用Java编程语言来实现与Zebra打印机进行交互,从而打印条形码。 首先,我们需要了解Zebra的通用打印机命令语言(ZPL)或EPL,这是Zebra打印机理解和执行打印任务的语言。ZPL是一种基于文本的...
总的来说,Java实现条形码和二维码的功能主要依赖于第三方库,如QRCode.jar 和 jbarcode-0.2.8.jar。这些库提供了一系列的API,使得开发者能够快速、高效地在Java应用中生成和解析条形码及二维码,从而满足各种数据...
本篇文章将深入讲解如何使用Java和Zxing库来实现条形码的识别。 首先,我们需要在项目中引入Zxing库。如果你的项目是Maven工程,可以在pom.xml文件中添加以下依赖: ```xml <groupId>com.google.zxing</groupId>...
Java条形码识别技术主要涉及的是对一维和二维条形码进行解码的过程,它在物流、零售、仓储管理等领域广泛...结合`Barcode.java`的源代码,你可以更好地理解如何在实践中使用ZXing,从而实现你自己的条形码识别系统。
在Java编程环境中,生成条形码是一项常见的需求,特别是在数据管理、库存跟踪和产品标识等领域。以下是关于使用Java生成条形码的三个主要方法的详细解释:barcode4j、jbarcode和google-zxing。 1. **barcode4j**: ...
ZXing是一个开源项目,提供了多种条码和二维码的读写功能,而Barbecue则专注于生成条形码。在这里,我们假设你已经选择了适合的库,并正确地将其引入到你的Java项目中。 一、ZXing(Zebra Crossing)库的使用 1. ...
### Java打印条形码知识点详解 ...本文详细介绍了如何使用Java实现条形码的打印功能,包括前端页面的设计与交互、后端逻辑处理以及条形码图像的生成与打印。通过这种方式,可以有效地提高业务流程中的效率和准确性。
2. **Java实现条形码** - 在Java中,可以使用开源库如`barcode4j`、`ZXing`(Zebra Crossing)或者`Java Barcode API`等来生成BarCode 39条形码。 - `barcode4j`是一个基于XML的、可扩展的条形码生成库,可以生成...
Java生成条形码的Demo是一种在Java环境中实现条形码生成的应用示例。条形码在各种领域,如零售、物流、库存管理等,都扮演着重要的角色,它能够快速准确地识别商品信息。本Demo旨在帮助开发者了解如何在Java项目中...
本文将详细介绍如何利用Java生成条形码,包括必要的参数配置以及代码实现。 #### 知识点一:Java条形码生成概述 条形码是一种图形表示方式,用于编码信息,通常是数字或字母。Java条形码生成通常涉及到以下步骤: ...
ZPL是一种专门用于配置和控制Zebra品牌的条码打印机的语言,它允许开发者创建自定义的标签、条形码、二维码等。对于中文打印,ZPL提供了特殊的支持,因为中文字符通常不是单字节的ASCII字符,而是多字节的Unicode...
在本示例中,我们将探讨如何使用Java实现这一功能,并涉及如何添加水印以增强PDF的安全性和标识性。 首先,我们需要引入能够处理条码和PDF的库。一个常用的库是` ZXing (Zebra Crossing)`,它是一个开源的条码读取...
总的来说,Java实现二维条码源代码的项目提供了一个方便的工具,让开发者能够轻松地在他们的应用程序中集成条码生成功能。无论是为了简化数据录入,还是为了增加交互性,理解并掌握这些知识点对于Java开发者来说都是...
Java作为广泛应用的编程语言,提供了丰富的库和API来实现条形码的生成与打印。本项目名为“条形码打印(java)”,显然是一个基于Java的条形码生成解决方案,且支持Web环境,意味着我们可以在线生成并打印条形码。 ...