google.zxing 条形码生成器 in iReport

2022-09-03 15:30:50

我想在我的页面中放置条形码并可以预览它。条形码生成器是google.zxing,我的报告工具是iReport

但我不知道,如何在iReport中配置和图像。Image ExpressionExpression Class


答案 1

两个关键思想是首先编写一些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. 示例查询:我包含此内容只是为了强调我的 scriptlet 对字段名称进行硬编码的观点。(这很糟糕。select 'some text' as barcode_textbarcode_text
  2. 变量:具有计算的类型。此名称在 scriptlet 中也是硬编码的。(这同样糟糕。BarCodeImagejava.awt.image.BufferedImageSystem
  3. 添加到 iReport 的类路径:
    • 已编译的脚本.jar文件
    • 核心.jar(来自ZXing)
    • javase.jar (来自 ZXing)
  4. 使用表达式 向报表中添加图像元素。$V{BarCodeImage}

结果是您生成的JasperReport中一个快乐的QR码:

Generated QR-Code

我记得我见过的一个样本,它把事情做得更干净。它实际上包含一个不错的插件,因此您可以轻松地将此功能安装到iReport中,而无需付出任何努力。如果我能追踪到这一点,那么我会更新这篇文章。但在此之前,这至少涵盖了所有关键点。


答案 2

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

在ZXing的情况下,我不知道要使用的方法,但我可以使用Grill库来判断我用作ImageExpression的内容。

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

MyBarcodeGenerator类包含在我的案例中返回 a 的方法getFromString(...)net.sourceforge.barbecue.Barcodenet.sourceforge.barbecue.linear.code39.Code39Barcode

将被忽略。Expression Class

--已编辑:

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

以下代码将 QRCode 编码为可在“图像表达式”字段中使用的缓冲图像:

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

推荐