开发者

google.zxing barcode generator in iReport

开发者 https://www.devze.com 2023-04-10 16:35 出处:网络
I want put a barcode in my page and can preview it. The barcode generator is google.zxing and my reporting tool is 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.


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:

google.zxing barcode generator in iReport

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.


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*/));
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号