谷歌.zxing条形码生成器在iReport中的应用

15

我希望在我的页面上添加一个条形码,并能够预览它。条形码生成器是google.zxing,我的报表工具是iReport

但是我不知道如何配置iReport中图像的Image ExpressionExpression Class


http://groups.google.com/group/zxing/browse_thread/thread/e8fbcde52f9efd80 - Alex K
@AlexK:我之前尝试过,但是不够清晰。 - masoud
你至少应该告诉我们你想要生成什么类型的条形码... - Marc Nuri
@MarcNuri:没有区别,但至少对于二维条码。 - masoud
@MasoudM.:我知道原问题是几个月前发布的,所以你可能已经转移了注意力……但我发布的示例应该包含您需要的所有关键思想。您还有生成QR码的机会吗? - mdahlman
我在 Stack Overflow: qr-code-integration-in-jasperreport 中使用 zxing 编写了一个答案,用于生成 QR 码。如果符合您的要求,您可以使用它。 - Kamal Singh
2个回答

8
两个关键点是首先编写一些Java代码来创建相关的图像,然后设计报告以适当引用此代码。也许生成图像最简单的方法是使用类似于这样的脚本:
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();
        }
    }
}

那段代码充满了硬编码的丑陋,但关键思想都有体现。然后你需要这样定义报告:
  1. 示例查询:select 'some text' as barcode_text。我只是为了强调我的脚本硬编码了字段名barcode_text。(这很糟糕。)
  2. 变量:BarCodeImage,类型为java.awt.image.BufferedImage,计算为System。这个名称也在脚本中硬编码了。(同样很糟糕。)
  3. 将以下内容添加到iReport的类路径中:
    • 编译后的脚本文件.jar文件
    • core.jar(来自ZXing)
    • javase.jar(来自ZXing)
  4. 在报表中添加一个图像元素,表达式为$V{BarCodeImage}

结果是在生成的JasperReport中看到一个快乐的QR码:

Generated QR-Code

我记得看过一个更干净的示例,它实际上包括了一个不错的插件,因此您可以轻松地将此功能安装到iReport中,而不需要太多努力。如果我能找到它,那么我会更新此帖子。但在那之前,这至少涵盖了所有关键点。


此外,在第15章中还有非常好的指南,介绍如何创建脚本 http://www.opus-college.net/devcorner/iReport-Ultimate-Guide-3.pdf - Jacek Gzel

2

图像表达式应该返回java.awt.Image的任何子类。最简单的方法是使用自己的帮助程序类来生成Image。您可以创建一个静态方法,从String生成条形码,并从IReport调用该方法。

在ZXing的情况下,我不知道要使用哪种方法,但我可以告诉您我使用的ImageExpression使用的是Barbecue库。

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

MyBarcodeGenerator 类包含方法 getFromString(...),该方法返回一个 net.sourceforge.barbecue.Barcode 对象,在我的情况下是一个 net.sourceforge.barbecue.linear.code39.Code39Barcode 对象。

Expression Class 被忽略。

--编辑:

要在 zxing 中编码图像,您应该使用 MatrixToImageWriter

以下代码将 QRCode 编码为 BufferedImage,您可以在 Image Expression 字段中使用该对象:

MatrixToImageWriter.toBufferedImage(new QRCodeWriter().encode("BARCODE CONTENT", BarcodeFormat.QR_CODE,     400 /*Width*/, 400/*Height*/));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接