google.zxing barcode generator in iReport

masoud picture masoud · Oct 2, 2011 · Viewed 11.5k times · Source

I want put a barcode in my page and can preview it. The barcode generator is google.zxing and my reporting tool is iReport.

But i dont know, how to configure Image Expression and Expression Class of an image in iReport.

Answer

mdahlman picture mdahlman · Dec 26, 2011

The two key ideas are first to write a bit of Java code to create the relevant image and then to design the report to reference this code appropriately. Perhaps the simplest way to generate the image is in a scriptlet like this:

package com.jaspersoft.alliances.mdahlman;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;

public class QRCodeScriptlet extends JRDefaultScriptlet {
    public void afterDetailEval() throws JRScriptletException {
        QRCodeWriter writer = new QRCodeWriter();
        BitMatrix matrix = null;
        try {
            matrix = writer.encode(getFieldValue("barcode_text").toString(), BarcodeFormat.QR_CODE, 256, 256);
            this.setVariableValue("BarCodeImage", MatrixToImageWriter.toBufferedImage(matrix) );
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
}

That's full of hard-coded ugliness, but the key ideas are all shown. Then you need to define the report like this:

  1. Sample query: select 'some text' as barcode_text I included this only to reinforce the point that my scriptlet hard-codes the field name barcode_text. (This is bad.)
  2. Variable: BarCodeImage of type java.awt.image.BufferedImage with calculation System. This name is hard-coded in the scriptlet too. (This is equally bad.)
  3. Add to iReport's classpath:
    • The compiled scriptlet .jar file
    • core.jar (from ZXing)
    • javase.jar (from ZXing)
  4. Add an Image element to the report with Expression $V{BarCodeImage}.

The result is a happy happy QR-code in your generated JasperReport:

Generated QR-Code

I recall a sample that I have seen which does things much more cleanly. It actually included a nice plug-in so you could easily install this functionality into iReport with minimal effort. If I can track that down, then I'll update this post. But until then this at least covers all of the critical points.