Java 创建/识别条形码
项目刚好需要用到就记录一下
-- 依赖
<!-- 条形码生成 -->
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.avalon.framework/avalon-framework-api -->
<dependency>
<groupId>org.apache.avalon.framework</groupId>
<artifactId>avalon-framework-api</artifactId>
<version>4.3.1</version>
</dependency>
-- 工具类
package com.example.mybatis_plus;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.apache.commons.io.FileUtils;
import org.krysalis.barcode4j.BarcodeException;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.BarcodeUtil;
import org.krysalis.barcode4j.HumanReadablePlacement;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import java.awt.image.BufferedImage;
import java.io.*;
/**
* 条形码工具类
*/
public class BarCodeUtils {
/**************************** 条形码 ********************************/
/**
* 生成code128条形码
*
* @param message 要生成的文本
* @param withQuietZone 是否两边留白
* @param hideText 隐藏可读文本
* @param filePath 文件生成的路径
*/
public static void generateBarCode128(String message, boolean withQuietZone, boolean hideText, String filePath) {
Code128Bean bean = new Code128Bean();
// 分辨率
int dpi = 512;
// 设置两侧是否留白
bean.doQuietZone(withQuietZone);
// 设置条形码高度和宽度(不填就是默认的)
// bean.setBarHeight((double) ObjectUtils.defaultIfNull(height, 9.0D));
// if (width != null) {
// bean.setModuleWidth(width);
// }
// 设置文本位置(包括是否显示)
if (hideText) {
bean.setMsgPosition(HumanReadablePlacement.HRP_NONE);
}
// 设置图片类型
String format = "image/png";
ByteArrayOutputStream ous = new ByteArrayOutputStream();
BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, dpi,
BufferedImage.TYPE_BYTE_BINARY, false, 0);
// 生产条形码
bean.generateBarcode(canvas, message);
try {
canvas.finish();
//字节码
byte[] bytes = ous.toByteArray();
FileUtils.writeByteArrayToFile(new File(filePath), bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
/**************************** 二维码 ********************************/
/**
* 生成二维码
* @param message 要生成的文本
* @param filePath 文件生成的路径
*/
public static void genQRCode(String message, String filePath){
try {
BarcodeUtil util = BarcodeUtil.getInstance();
DefaultConfiguration cfg = new DefaultConfiguration("barcode");
// Bar code type
DefaultConfiguration child = new DefaultConfiguration("datamatrix");
cfg.addChild(child);
// Human readable text position
DefaultConfiguration attr = new DefaultConfiguration("human-readable");
// //设置高度(无效果)
// attr = new DefaultConfiguration("height");
// attr.setValue(50);
// child.addChild(attr);
//设置二维码宽度
attr = new DefaultConfiguration("module-width");
attr.setValue("2.0");
child.addChild(attr);
BarcodeGenerator gen = util.createBarcodeGenerator(cfg);
//分辨率
int resolution = 300;
// 设置图片类型
String format = "image/png";
ByteArrayOutputStream ous = new ByteArrayOutputStream();
BitmapCanvasProvider canvas = new BitmapCanvasProvider(ous, format, resolution,
BufferedImage.TYPE_BYTE_BINARY, false, 0);
gen.generateBarcode(canvas, message);
canvas.finish();
//字节码
byte[] bytes = ous.toByteArray();
FileUtils.writeByteArrayToFile(new File(filePath), bytes);
} catch (ConfigurationException e) {
e.printStackTrace();
} catch (BarcodeException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
-- 测试方法
package com.example.mybatis_plus;
public class demo1 {
public static void main(String[] args) {
BarCodeUtils.generateBarCode128("SP0012", true, false,"D:\\aaab.jpg");
}
}
--文档
https://www.cnblogs.com/Yesi/p/11527369.html
官方地址:http://barcode4j.sourceforge.net/
嵌入到 Java 应用程序中(使用 JavaBean API) (sourceforge.net)
https://barcode4j.sourceforge.net/2.1/embedding-bean.html
Zxing 代码示例
pom.xml引入
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
package com.torey.javaAdvanced.mooc4.zxing;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName:BarCodeTest
* @Description:
* @author: Torey
*/
public class BarCodeTest {
/**
* 根据code生成相应的一维码
* @param file 一维码目标文件
* @param code 一维码内容
* @param width 图片宽度
* @param height 图片高度
*/
public static void generateCode(File file, String code,int width,int height){
//定义位图矩阵BitMatrix
BitMatrix matrix=null;
try{
//使用code_128格式进行表面生成100*25的条形码
MultiFormatWriter writer = new MultiFormatWriter();
matrix= writer.encode(code,BarcodeFormat.CODE_128,width,height,null);
// matrix= writer.encode(code,BarcodeFormat.EAN_13,width,height,null);
}catch (Exception ex){ex.printStackTrace();}
//将位图矩阵BitMatrix保存为图片
try(FileOutputStream outStream =new FileOutputStream(file)){
ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix),"png",outStream);
outStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
generateCode(new File("1dcode.png"),"123456789012",500,250);
readCode(new File("1dcode.png"));
}
/**
* 解析一维码
* @param file
*/
private static void readCode(File file) {
try{
BufferedImage read = ImageIO.read(file);
if (null==read) {
return;
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(read);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Map<DecodeHintType,Object> hints=new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET,"GBK");
hints.put(DecodeHintType.PURE_BARCODE,Boolean.TRUE);
hints.put(DecodeHintType.TRY_HARDER,Boolean.TRUE);
Result decode = new MultiFormatReader().decode(bitmap, hints);
System.out.println("条形码的内容是:"+decode.getText());
}catch (Exception ex){}
}
}
Java 创建/识别条形码的更多相关文章
- Java 创建/识别条形码、二维码
条形码(Barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常用于标示物品的生产国.制造厂家.商品名称.生产日期.图书分类号.邮件起止地点.类别.日期等 ...
- Java 扫描识别条形码图片
1.条形码扫描识别的实现方法及步骤 本文以Java代码示例介绍如何来扫描和识别条形码图片.这里使用免费条码工具 Free Spire.Barcode for Java,调用BarcodeScanner ...
- java创建文件和目录
java创建文件和目录 2013-09-04 12:56 99933人阅读 评论(7) 收藏 举报 分类: JAVA基础(10) 版权声明:本文为博主原创文章,未经博主允许不得转载. 创建文件和目 ...
- JAX-WS(一)之使用wsgen从Java创建简单的WebService
概念 JAX-WS2.0的全称Java API for XML-Based Web Service 2.0.JAX-WS2.0是对JAX-RPC1.0规范的扩展,是JAX-RPC1.1的后续版本,JA ...
- 【Java】Java创建String时,什么情况放进String Pool?
对Java创建String是否放入String pool作代码性的试验. 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String o ...
- 实例源码--ZXing识别条形码和二维码识别源码
下载源码 技术要点: 1.ZXing库的 使用 2.识别条形码和二 维码 3.自定义视图 4.源码带有非常详 细的中文注释 ...... 详细介绍: 1.ZXing库 ZXing是个很经典的条码/ ...
- java创建多线程(转载)
转载自:Java创建线程的两个方法 Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对 ...
- Oracle - java创建Oracle 的触发器
Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...
- Java创建柱状图及饼状图
Java创建图表其实还是很方便的,但是要引入相关的jar包.如下 jfreechart.jar jcommon,jar gnujaxp.jar 其中最主要的是jfreechart.jar. 下面就让我 ...
- 识别率很高的java文字识别技术
java文字识别程序的关键是寻找一个可以调用的OCR引擎.tesseract-ocr就是一个这样的OCR引擎,在1985年到1995年由HP实验室开发,现在在Google.tesseract-ocr ...
随机推荐
- C# 面试问答
引用:https://www.cnblogs.com/zh7791/p/13705434.html 1.什么是 COM? COM 代表组件对象模型.COM 是微软技术之一.使用这项技术,我们可以开 ...
- C#中操作Excel
在GIS数据处理中,经常遇到与Excel的交互,这里进行简单的总结. Excel行列号就像是编辑中的二维数据组,操作Excel相当于操作二维数组.遍历.循环.取值.赋值-- 1.添加引用 添加引用也有 ...
- Response下载文件
Response下载文件的主要步骤有七个: 1.要获取下载文件的路径 String realPath = "F:\\JavaWeb\\WorkSpace\\JavaWeb-Servlet\\ ...
- VulnHub-ical打靶记录
这绝对是最简单的一个题目了. 目标发现 netdiscover -r 192.168.0.10/24 根据靶场和本地系统的网段进行扫描. 信息收集 nmap -sV -Pn -sT -sC -A 19 ...
- 一个简单的开源消息中间件 FolkMQ v1.4.2 发布
功能简表 角色 功能 生产者(客户端) 发布消息.定时消息(或叫延时).顺序消息.可过期消息.事务消息.支持 Qos0.Qos1 消费者(客户端) 订阅.取消订阅.消费-ACK(自动.手动) 服务端 ...
- lattice烧录器回读功能。
经常被人问,lattice的 怎么回读,下面就说这个步骤. 烧录器检测到设备以后,以后选择operation,选择flash programming mode ,选择flash read and sa ...
- Kotlin泛型的高级特性
Kotlin中是可以将内联函数中的泛型进行实化的. 那么具体该怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline 关键字来修饰该函数.其次,在声明泛型的地方必须加上reif ...
- 《c#高级编程》第2章C#2.0中的更改(一)——泛型
一.实例 当我们需要编写一些通用的代码,但是不确定它们将处理的数据类型时,泛型就非常有用了.下面是一个简单的 C# 泛型示例: using System; public class Example { ...
- 力扣34(java)-在排序数组中查找元素的第一个和最后一个位置(中等)
题目: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target.请你找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返回 [-1, -1]. 你 ...
- 代码安全无忧—云效Codeup代码加密技术发展之路
简介: 从代码服务及代码安全角度出发,看看云效代码加密技术如何解决这一问题 代码数据存在云端,如何保障它的安全? 部分企业管理者对于云端代码托管存在一丝担心:我的代码存在云端服务器,会不会被泄露? 接 ...