项目中需要用到二维码,二维码的码制是PDF417,在做了一番研究之后发现zxing是个不错的开源工具(代码托管在google上面)。为什么选择zxing,由于其他一些工具比如barcode4j(开源,支持读,好像不支持写,最后维护时间在2010年)、barcode(商业版)都不太适合,所以选择了zxing。
zxing并没有提供直接可以使用的jar文件,而是需要自己通过编译源码,生成需要的jar文件。额外说明,zxing利用maven管理自己的代码,并且默认使用了jdk7,代码中也使用了jdk7的一些新特性,基于这些情况,可以适当调整jdk的版本(如果降低jdk的版本,需要改动少量的源码)。
下面直接贴出读写文件的代码:
ZxingPdfRead
package test;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.EnumMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.BufferedImageLuminanceSource;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Reader;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
public class ZxingPdfRead {
private static Reader barcodeReader = new MultiFormatReader();
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws Exception {
File testImage = new File(
"E:\\work\\all_workspace\\wp_zxing\\barcode4jTest\\src\\test\\helloworld.png");
BufferedImage image = ImageIO.read(testImage);
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
try {
Map<DecodeHintType, Object> hints = new EnumMap<DecodeHintType, Object>(
DecodeHintType.class);
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
Result result = barcodeReader.decode(bitmap, hints);
String resultText = result.getText();
System.out.println("resultText:" + URLDecoder.decode(resultText, "UTF-8"));
} catch (ReaderException ignored) {
ignored.printStackTrace();
}
}
}
ZxingPdfWrite
package test;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.pdf417.PDF417Writer;
public class ZxingPdfWrite {
private static final int BLACK = 0xff000000;
private static final int WHITE = 0xFFFFFFFF;
/**
* @param args
* @throws WriterException
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
PDF417Writer pdf417Writer = new PDF417Writer();
//注意中文乱码问题
BitMatrix bitMatrix = pdf417Writer.encode(URLEncoder.encode("我是中国人","UTF-8"),
BarcodeFormat.PDF_417, 100, 50);
writeToFile(bitMatrix,"png",new File("E:\\work\\all_workspace\\wp_zxing\\barcode4jTest\\src\\test\\helloworld.png"));
}
public static void writeToFile(BitMatrix matrix, String format, File file)
throws IOException {
BufferedImage image = toBufferedImage(matrix);
ImageIO.write(image, format, file);
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) == true ? BLACK : WHITE);
}
}
return image;
}
}
来源:oschina
链接:https://my.oschina.net/u/781254/blog/185173