15

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.

mdahlman
  • 9,204
  • 4
  • 44
  • 72
masoud
  • 55,379
  • 16
  • 141
  • 208
  • http://groups.google.com/group/zxing/browse_thread/thread/e8fbcde52f9efd80 – Alex K Oct 10 '11 at 14:25
  • @AlexK: I tried that before, but it's not clear – masoud Oct 10 '11 at 17:42
  • You should at least tell us what kind of Barcode you are trying to generate... – Marc Nuri Nov 04 '11 at 14:01
  • @MarcNuri: No difference, but at least for 2D Barcode – masoud Nov 04 '11 at 21:32
  • @MasoudM.: I realize the original question was posted a couple of months ago, so you may have moved on... but the sample I posted should have all of the key ideas you need. Any chance you're still going to generate QR Codes? – mdahlman Jan 18 '12 at 14:03
  • I wrote an answer using `zxing` to generate the QR code in [Stack Overflow: qr-code-integration-in-jasperreport](https://stackoverflow.com/questions/29786226/qr-code-integration-in-jasperreport/47383846#47383846). If suits your requirement you can use it. – Kamal Singh Nov 20 '17 at 01:30

2 Answers2

8

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.

mdahlman
  • 9,204
  • 4
  • 44
  • 72
  • Additional there is very good guide in chapter 15, how to create scriptlet http://www.opus-college.net/devcorner/iReport-Ultimate-Guide-3.pdf – Jacek Gzel Apr 24 '17 at 09:52
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*/));
Marc Nuri
  • 2,729
  • 1
  • 14
  • 18