博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用iText和zxing生成和读pdf417二维码
阅读量:7238 次
发布时间:2019-06-29

本文共 3505 字,大约阅读时间需要 11 分钟。

  hot3.png

     前面的一些博文中已经提到了zxing这个开源工具生成和读取二维码图片,仅从学习的角度来看,可以告一个段落。在实际的生产环境中,应用zxing生成和读取二维码,却存在一些问题:

  1. 使用扫描枪读取zxing生成的带中文的二维码图片的时候,存在中文乱码问题;
  2. 用zxing生成的二维码图片会随着存储信息量的增大,图片也会变大(就这一点来说,使用iText这个工具生成的二维码图片的长宽会相对固定一点,这也是选择iText生成二维码的一个因素)。

     为了解决这些问题,在经过一番折腾后,找到了一个替代的解决方案,使用iText工具生成二维码图片,由于iText没有提供类读取二维码内容,这里我们仍然使用zxing,并且特别注意了中文乱码的问题。下面是代码:

package test;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import javax.imageio.ImageIO;import org.apache.commons.lang.StringUtils;import com.google.zxing.BinaryBitmap;import com.google.zxing.LuminanceSource;import com.google.zxing.MultiFormatReader;import com.google.zxing.Result;import com.google.zxing.client.j2se.BufferedImageLuminanceSource;import com.google.zxing.common.HybridBinarizer;import com.itextpdf.text.pdf.BarcodePDF417;/** * 功能: 1、提供生成二维码的服务 2、提供读取二维码信息的服务 3、提供生成和读取二维码的示例代码 */public class TwoDimBarCodeService {	/**	 * 功能:生成二维码	 * @param strInfo		需要存储的内容	 * @param encode		编码格式,比如:GBK,UTF-8	 * @param imgFileExt	生成的图片格式	 * @return	byte[]		 图片的byte数组			 * @throws Exception	 */	public byte[] generatePdf417Image(String strInfo, String encode,			String imgFileExt) throws Exception {		if (StringUtils.isBlank(strInfo)) {			throw new Exception("二维条码的文本信息参数不能为空!");		}		if (StringUtils.isBlank(encode)) {			encode = "UTF-8";		}		BarcodePDF417 barcodePDF417 = new BarcodePDF417();		barcodePDF417.setText(strInfo.getBytes(encode));		Image pdfImg = barcodePDF417.createAwtImage(Color.black, Color.white);		BufferedImage img = new BufferedImage((int) pdfImg.getWidth(null),				(int) pdfImg.getHeight(null), BufferedImage.TYPE_INT_RGB);		Graphics g = img.getGraphics();		g.drawImage(pdfImg, 0, 0, Color.white, null);		ByteArrayOutputStream os = new ByteArrayOutputStream();		ImageIO.write(img, imgFileExt, os);		byte[] buffs = os.toByteArray();		os.close();		return buffs;	}	/**	 * 功能:从图片的byte数组中读取内容	 * @param imgBuff			二维码图片流的byte[]	 * @param encode			编码格式,比如:GBK,UTF-8	 * @return	 * @throws Exception	 */	public String readInfoFromPdf417Image(byte[] imgBuff, String encode)			throws Exception {		if (imgBuff == null || imgBuff.length < 1) {			throw new Exception("二维条码的图片内容不能为空!");		}		InputStream is = new ByteArrayInputStream(imgBuff);		BufferedImage image = ImageIO.read(is);		LuminanceSource source = new BufferedImageLuminanceSource(image);		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));		Result decodedValue = new MultiFormatReader().decode(bitmap);		if (decodedValue == null) {			return "";		}		String resultText = decodedValue.getText();		resultText = StringUtils.trimToEmpty(resultText);		byte[] b = resultText.getBytes("ISO-8859-1");		return new String(b, encode);	}	public static void main(String[] args) throws Exception {		TwoDimBarCodeService service = new TwoDimBarCodeService();		String strInfo = "GB0626-2005^JH-201403050005^XX公司^通知^[2014]0005^^关于推广办公自动化的通知^秘密5^特急^20140305^^^20140305^^";		byte[] buff = service.generatePdf417Image(strInfo, "GBK", "jpg");		OutputStream os = new FileOutputStream(new File("d:/test.jpg"));		os.write(buff);		os.flush();		os.close();		System.err.println("文本内容:"				+ service.readInfoFromPdf417Image(buff, "GBK"));	}}

关键类:BufferedImage ByteArrayOutputStream

存在的一个问题:

iText生成的图片也会随着信息量的变大而变大,解决思路是使用图像缩放技术,做到图片的格式固定。

转载于:https://my.oschina.net/psuyun/blog/205651

你可能感兴趣的文章
about script engine on jdk 6 is mozilla rhino
查看>>
android之Apache Http初使用——向服务器发送请求
查看>>
nohup命令 使用方法详解
查看>>
Intent 和 Intent Filter
查看>>
Linux下MySQL的主从热备(自动同步)配置
查看>>
Windows 8 Consumer Preview版升级到 Release Preview 版后Metro应用(html5+JavaScript版)修改小结...
查看>>
编程珠玑:变位词程序的实现
查看>>
POJ 2987 Firing
查看>>
Newtonsoft.Json 应用
查看>>
HDU 1400 Mondriaan's Dream
查看>>
从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-5.Android中的进程与线程)...
查看>>
如何在修改控件属性值,而不触发事件
查看>>
汉语转拼音之pinyin4j(转载)
查看>>
GNU make manual 翻译(六十)
查看>>
EffectiveC++ Item25说的东东
查看>>
stl学习总结简略
查看>>
Struts2中 No result defined for action com.test.action.LoginAction and result success
查看>>
对PostgreSQL源代码中的 ObjectClass的初步理解
查看>>
Oracle数据库系统性能优化策略
查看>>
rabbitmq使用__python客户端(消息发送者)
查看>>