Pages

Saturday, February 2, 2013

Decode QR Code using Java


As in earlier post we had learn what is QR code and how can we generate QR code in java and servlet.
Now here I will show you how can we read QR Code in java.
Here again i had use same jar file as we had previous. ZXing- Zibra Corossing
Here is code to read/decode QR Code.
file: QRReader.java
import java.io.FileInputStream;
import javax.imageio.ImageIO;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class QRReader {

public static void main(String args[]){

Result result = null;
BinaryBitmap binaryBitmap;

try{

binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(ImageIO.read(new FileInputStream("D:/Generated_QR.PNG")))));
result = new MultiFormatReader().decode(binaryBitmap);
System.out.println("QR Code : "+result.getText());

}catch(Exception ex){
ex.printStackTrace();
}
}
}

I hope, now you are clear with QR Code generation and decoding using Java.

Generate QR Code using Java and Servlet Integration


Nowadays, Quick Response (QR) Codes are becoming more and more useful as they have gone mainstream, thanks to the smart phones. Right from the bus shelter, product packaging, home improvement store, automobile, a lot of internet websites are integrating QR Codes on their pages to let people quickly reach them. With increase in number of users of smart phones day by day, the QR codes usage is going up exponentially.QR codes are a type of two-dimensional barcode. They are also known as hardlinks or physical world hyperlinks. QR Codes store up to 4,296 alphanumeric characters of arbitrary text. This text can be anything, for example URL, contact information, a telephone number etc.
Let us see a quick overview of Quick Response (QR) codes and also how to generate these codes in Java.
What is QR Code?
A QR code (abbreviated from Quick Response code) is a type of matrix barcode (or two-dimensional code) first designed for the automotive industry. More recently, the system has become popular outside of the industry due to its fast readability and comparatively large storage capacity. The code consists of black modules arranged in a square pattern on a white background. The information encoded can be made up of four standardized kinds (“modes”) of data (numeric, alphanumeric, byte/binary, Kanji), or by supported extensions virtually any kind of data.
Created by Toyota subsidiary Denso Wave in 1994 to track vehicles during the manufacturing process, the QR code is one of the most popular types of two-dimensional barcodes. It was designed to allow its contents to be decoded at high speed.


Let’s Create QR Code in JAVA


Zebra Crossing (ZXing) is an awesome open source library that one can use to generate / parse QR Codes in almost all the platforms (Android, JavaSE, IPhone, RIM, Symbian etc). But if you have to generate simple QR Codes, I found it a bit clumsy to implement.
However QRGen is a good library that creates a layer on top of ZXing and makes QR Code generation in Java a piece of cake. It has a dependency on ZXing, so you would need ZXing jar files along with QRGen to create QR Codes in Java.
Download this three files and rename it with .doc to .jar & put in lib to generate QR.
  • zxing-j2se-1.7.jar
  • zxing-core-1.7.jar
  • qrgen-1.0.jar

Include these JAR files in your Classpath and execute following Java code to generate QR Code

package com.opensourcetechno.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;

public class GenerateQR {
public static void main(String[] args) {

ByteArrayOutputStream out=QRCode.from("Dhaval Shah").to(ImageType.PNG).stream();

try {

FileOutputStream fout = new FileOutputStream(new File("D:\\Generated_QR.PNG"));

fout.write(out.toByteArray());

fout.flush();
fout.close();

} catch (FileNotFoundException e) {
// Do Logging
e.printStackTrace();
} catch (IOException e) {
// Do Logging
e.printStackTrace();
}
}
}


The code is pretty straight forward. We used QRCode class to generate QR Code Stream and write the byte stream to a file D:\Generated_QR.PNG.
If you open this JPEG file and scan using your iPhone or Android QR scanner, you’ll find a cool “Dhaval Shah” in it 
Apart from generating Sterams of data using QRGen API, we can also use below APIs to create QR Codes:
// get QR file from text using defaults
File file = QRCode.from("Hello World").file();
// get QR stream from text using defaults
ByteArrayOutputStream stream = QRCode.from("Hello World").stream();

// override the image type to be JPG
QRCode.from("Hello World").to(ImageType.JPG).file();
QRCode.from("Hello World").to(ImageType.JPG).stream();

// override image size to be 250x250
QRCode.from("Hello World").withSize(250, 250).file();
QRCode.from("Hello World").withSize(250, 250).stream();

// override size and image type
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).file();
QRCode.from("Hello World").to(ImageType.GIF).withSize(250, 250).stream();


Website Link (URLs) QR Code in Java
One of the most common use of a QR Code is to bring traffic to a particular webpage or download page of website. Thus QR Code encodes a URL or website address which a user can scan using phone camera and open in their browser. URLs can be straight forward included in QR Codes. In above Java Hello World example, just replace “Dhaval Shah” string with the URL you want to encode in QR Code. Below is the code snippet:
ByteArrayOutputStream out = QRCode.from("https://opensourcetechno.blogspot.com").to(ImageType.PNG).stream();
QR Code in Servlet


Most of the time you would need to generate QR Codes dynamically in some website. We already saw how easy it is to generate QR code in Java. Now we will see how to integrate this QR Code generation in a Java Servlet.
Following is a simple Http Servlet that creates QR Code using QRGen and ZXing library. User provides the text for which QR Code is generated.
The index jsp file contains a simple html form with a textbox and submit button. User can enter the text that user wishes to generate QR code of and presses submit.
file: index.jsp
<html>
<head>
<title>QR Code in Java Servlet</title>
</head>
<body>

<form action="generateQRServlet" method="get">
<p>Enter Text to create QR Code</p>
<input type="text" name="qrtext" />
<input type="submit" value="Generate QR Code" />
</form>
</body>
</html>

The actual logic will be in QRCodeServlet.java. Here we uses QRGen library along with ZXing and generates QR Code for given text (Text we get from request.getParameter). Once the QR Stream is generated, we write this to response and set appropriate content type.

file: GenerateQRCodeServlet.java

package com.opensourcetechno.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.glxn.qrgen.QRCode;
import net.glxn.qrgen.image.ImageType;

public class GenerateQRCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) 
throws ServletException, IOException {

String qrtext = request.getParameter("qrtext");

ByteArrayOutputStream out = QRCode.from(qrtext).to(
ImageType.PNG).stream();

response.setContentType("image/png");
response.setContentLength(out.size());

OutputStream outStream = response.getOutputStream();

outStream.write(out.toByteArray());

outStream.flush();
outStream.close();
}
}

The below web.xml simply maps GenerateQRCodeServlet.java with /GenerateQR URL.

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

<display-name>QR_Code_Servlet</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>GenerateQRCodeServlet</servlet-name>
<servlet-class>com.opensourcetechno.util.GenerateQRCodeServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>GenerateQRCodeServlet</servlet-name>
<url-pattern>/GenerateQR</url-pattern>
</servlet-mapping>

</web-app>

Now execute in browser and you will get QR Code of entered text.
Generating QR Codes in Java is not only easy, but quite straight forward. Integrating this functionality with any existing Java based app is just a piece of cake! In this tutorial we saw how to generate these QR codes in Java and also with Servlet.
Happy Codding, guys...!!!