文档章节

java条形码的生成与扫描

sitaluoduoxi
 sitaluoduoxi
发布于 2016/07/26 22:14
字数 837
阅读 125
收藏 4
部分代码来自网上,所需jar包:barbecue-1.5-beta1.jar,jbarcode-0.2.8.jar
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;

import javax.swing.JFrame;

import org.jbarcode.JBarcode;
import org.jbarcode.encode.Code39Encoder;
import org.jbarcode.encode.EAN13Encoder;
import org.jbarcode.paint.BaseLineTextPainter;
import org.jbarcode.paint.EAN13TextPainter;
import org.jbarcode.paint.WideRatioCodedPainter;
import org.jbarcode.paint.WidthCodedPainter;
import org.jbarcode.util.ImageUtil;

import net.sourceforge.barbecue.Barcode;
import net.sourceforge.barbecue.BarcodeException;
import net.sourceforge.barbecue.BarcodeFactory;

/**
 * @description 针对条形码的帮助类
 * @使用方法 类名调用
 * @方法一:getNumStringByBarcode() 扫描条形码得到对应的数字字符串
 * @方法二:(可以不用,方法三取代)getBarcodeByNumString(String numStr) 通过一串数字字符串得到条形码(swing显示)
 * @author 
 * @区分键盘输入还是扫描枪输入 思路:扫描输入的间隔比较均匀且时间很短(小于50毫秒), 而手动输入间隔至少在100毫秒以上。
 * @方法三:createBarcodePictureByString(String numStr,String path)
 */
public class BarcodeUtils {

	static long timeMillis1;
	static long timeMillis2;

	// 求间隔时间时用到的标志位,每进来一次keyPressed方法,把flag置反,并且记录当前系统的时间毫秒值前后相减,得到间隔时间
	static boolean IntervalFlag = false;

	static int count = 0;// 进入一次keyPressed()方法加1,第一次进入是不算时间间隔,count=2时开始算,另外可以用来判断是否是连续多次输入
	static StringBuilder sb = null;
	static String str = "";
	static long timeInterval = 0;
	static String str2 = "";
							
	static boolean scanningGunFlag = false; // 是否是 扫描枪输入
	static boolean kpressedFlag3 = false;// 是否有键盘输入
	static boolean keyboardAndScanFlag4 = false;// 判断是不是 先有键盘输入 再有扫描输入

	/**
	 * 
	 * @param numStr 条形码字符串
	 * @param path 图片存储路径,例如"f:/"
	 */
	public static void createBarcodePictureByString(String numStr,String path) {
		try {
			JBarcode localJBarcode = new JBarcode(EAN13Encoder.getInstance(),
					WidthCodedPainter.getInstance(),
					EAN13TextPainter.getInstance());
			//BufferedImage localBufferedImage = localJBarcode.createBarcode(numStr);
			//saveToGIF(localBufferedImage, "aaa.gif");
			
			 localJBarcode.setEncoder(Code39Encoder.getInstance());
			 localJBarcode.setPainter(WideRatioCodedPainter.getInstance());
			 localJBarcode.setTextPainter(BaseLineTextPainter.getInstance());
			 localJBarcode.setShowCheckDigit(false); //xx str = "JBARCODE-39";
			 BufferedImage localBufferedImage = localJBarcode.createBarcode(numStr);
			 saveToPNG(localBufferedImage, numStr+".png",path);
			
		} catch (Exception localException) {
			localException.printStackTrace();
		}
	}

	/**
	 * 此方法的作用是更具条形码字符串生成一个条形码(swing界面显示出来)
	 * 
	 * @param numStr
	 *            条形码数字对象的字符串
	 */
	@SuppressWarnings("static-access")
	public static void getBarcodeByNumString(String numStr) {
		JFrame frame = new JFrame("getBarcodeByNumString");
		BarcodeUtils u = new BarcodeUtils();
		Component contents = u.usingBarbecueAsSwingComponent(numStr);
		frame.getContentPane().add(contents, BorderLayout.CENTER);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.pack();
		frame.setVisible(true);
	}

	/**
	 * 扫描条形码的到数字字符串
	 * 
	 * @return 条形码对应的数字字符串
	 */
	public static String getNumStringByBarcode() {

		JFrame frame = new JFrame("getNumStringByBarcode");
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		frame.addKeyListener(new KeyAdapter() {

			public void keyPressed(KeyEvent e) {
				count++;
				if (IntervalFlag == false) {
					timeMillis1 = System.currentTimeMillis();
					// System.out.println(timeMillis1+":t1");
					IntervalFlag = true;
				} else {
					timeMillis2 = System.currentTimeMillis();
					// System.out.println(timeMillis2+":t2");
					IntervalFlag = false;
				}
				if (count > 1) {
					timeInterval = Math.abs(timeMillis2 - timeMillis1);
				}
				// System.out.print(timeInterval+"---");
				if (timeInterval < 50) {
					count++;
					if (sb == null)
						sb = new StringBuilder();
					if (e.getKeyCode() >= KeyEvent.VK_0
							&& e.getKeyCode() <= KeyEvent.VK_9) {
						// System.out.println(e.getKeyCode()+":"+e.getKeyChar());
						sb.append(e.getKeyChar());
						kpressedFlag3 = true;
					}
					if (e.getKeyCode() == KeyEvent.VK_ENTER) {
						if (scanningGunFlag == true
								|| keyboardAndScanFlag4 == true) {
							str = str2 + sb.toString();
							str2 = "";
						} else {
							str = sb.toString();
						}
						sb = null;
						if (str.length() >= 8) {
							System.out.println("条形码:" + str);
							
						} else {
							str = "";
						}
						if (count >= 8) {
							scanningGunFlag = true;
							count = 0;
						}
					}
					// System.out.println("str-:"+str);
					if (kpressedFlag3 == true && scanningGunFlag == false) {
						// 首先是键盘输入再有扫描输入
						keyboardAndScanFlag4 = true;
					}
				} else {
					if (e.getKeyCode() >= KeyEvent.VK_0
							&& e.getKeyCode() <= KeyEvent.VK_9
							&& scanningGunFlag == true) {
						// 连续扫描
						str2 = "" + e.getKeyChar();
					}
					if (e.getKeyCode() >= KeyEvent.VK_0
							&& e.getKeyCode() <= KeyEvent.VK_9
							&& keyboardAndScanFlag4 == true) {
						// 先按下键盘再扫描
						str2 = "" + e.getKeyChar();
						// System.out.println("s--:"+str2);
						scanningGunFlag = false;
					}
					sb = null;
				}

			}

		});

		frame.pack();
		frame.setVisible(true);
		return str;

	}

	/**
	 * @param num
	 * @return Component
	 */
	private static Component usingBarbecueAsSwingComponent(String num) {
		Barcode barcode = null;
		try {
			barcode = BarcodeFactory.createCode128B(num);

			barcode.setBarHeight(50);
			barcode.setBarWidth(1);
		} catch (BarcodeException e) {
		}
		return barcode;
	}

	//////一下方法为createBarcodePictureByString()需要用到的方法--//
	@SuppressWarnings("unused")
	private static void saveToJPEG(BufferedImage paramBufferedImage,
			String paramString,String path) {
		saveToFile(paramBufferedImage, paramString, "jpeg",path);
	}

	private static void saveToPNG(BufferedImage paramBufferedImage,
			String paramString,String path) {
		saveToFile(paramBufferedImage, paramString, "png",path);
	}

	@SuppressWarnings("unused")
	private static void saveToGIF(BufferedImage paramBufferedImage,
			String paramString,String path) {
		saveToFile(paramBufferedImage, paramString, "gif",path);
	}

	private static void saveToFile(BufferedImage paramBufferedImage,
			String paramString1, String paramString2,String path) {
		try {
			FileOutputStream localFileOutputStream = new FileOutputStream("f:/"
					+ paramString1);
			ImageUtil.encodeAndWrite(paramBufferedImage, paramString2,
					localFileOutputStream, 96, 96);
			localFileOutputStream.close();
		} catch (Exception localException) {
			localException.printStackTrace();
		}
	}
	//------/////
}


© 著作权归作者所有

sitaluoduoxi
粉丝 0
博文 34
码字总数 26821
作品 0
广州
后端工程师
私信 提问
java 生成条形码旋转问题

使用java做条形码,怎么生成旋转的条形码比如选择90度和270的条形码 还要保持识别率,我使用java Graphics2D对生成的条形码图片旋转后,扫描枪识别不了 请假大家帮指点一下...

小豆包
2012/12/27
132
0
Aspose.BarCode for Java 2.7.0 发布

Aspose.BarCode for Java 2.7.0 发布,该版本更新如下: 此版本包括一个更新的Java ME(移动版)的条码组件,现在完全支持Java ME SDK3.0。增加了对创建和阅读一些新的条码符号的支持,以及b...

小卒过河
2011/07/11
397
0
ZXing读写二维码,桌面和手机的不同用法

虽然ZXing是用Java实现的Barcode开源库,但是并不代表桌面上实现的Barcode应用在手机上也可以直接使用。因为Android的Java接口有很多是不同的。这里分享下Java Barcode生成和读取的不同用法。...

yushulx
2015/08/18
723
0
Aspose.BarCode for Java 4.4.0 发布

Aspose.BarCode for Java 和 .NET 功能相同,该版本主要是一些 API 的小改变,在源码上有一些不兼容旧版本,将以升级,因为以后的版本更新将以此为基础。 Aspose.BarCode 是一个 Java 的条形...

红薯
2011/12/17
447
0
关于条形码扫描设备java接口

谁做过java对接条形码设备的?有直接提供java接口的吗?多谢了

xu81.com
2011/03/15
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

vue入门--简单路由配置

本文转载于:专业的前端网站➜vue入门--简单路由配置   在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装。然后在目录...

前端老手
32分钟前
3
0
怎么给视频配音

很多刚开始尝试视频制作的小伙伴,帮助到怎么给制作完成的视频配音,其实给视频配音的方法非常简单,在手机上可以进行制作,下面一起来看看给视频配音的方法吧! 具体步骤如下: 1、首先在手...

白米稀饭2019
41分钟前
3
0
windows批处理bat脚本编写

什么是bat脚本 .bat结尾的文件其实就是windows上的批处理脚本,Windows中的bat文件相当于 Linux中shell编程的.sh脚本,批量执行DOS命令。 其最简单的例子,是逐行书写在命令行中会用到的各种...

孙幼凌
49分钟前
3
0
华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
57分钟前
5
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部