google.zxing barcode generator in iReport

12,041

Solution 1

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.

Solution 2

The image expression should return any subclass of java.awt.Image. The easiest way to achieve this is to use your own helper class to generate the Image. You can create a static method that generates a barcode from a Stringand call that method from IReport.

In the case of ZXing I don't know the method to use, but I can tell what I use as ImageExpression using the Barbecue library.

        net.sourceforge.barbecue.BarcodeImageHandler.getImage(
MyBarcodeGenerator.getFromString($F{field})

MyBarcodeGenerator class contains the method getFromString(...) that returns a net.sourceforge.barbecue.Barcode in my case a net.sourceforge.barbecue.linear.code39.Code39Barcode

The Expression Class is ignored.

--Edited:

To encode an Image in zxing you should use MatrixToImageWriter

The following code will encode a QRCode into a BufferedImage which you can use in the Image Expression field:

MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE,     400 /*Width*/, 400/*Height*/));
Share:
12,041
masoud
Author by

masoud

I am.

Updated on June 04, 2022

Comments

  • masoud
    masoud almost 2 years

    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.

  • Jacek Gzel
    Jacek Gzel about 7 years
    Additional there is very good guide in chapter 15, how to create scriptlet opus-college.net/devcorner/iReport-Ultimate-Guide-3.pdf