Search code examples
javajasper-reportsireportbarcodezxing

google.zxing barcode generator in iReport


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.


Solution

  • 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.