BIRT 中的二维码

QR Code in BIRT

我想在 BIRT 中生成二维码。在生成报告之前,我将输入标签数量作为输入,比如 x,然后报告应包含 x 个标签以及 QR code.QR 代码数据是动态的,基于 input.I 在网上搜索了很多但没有合适的解决方案 found.I 想要像下面这样的报告

QRCode 本身可以使用 ZXing library using for example this tutorial.

创建

this example 中,开发了一个使用 zxing 的小型生成器,以使脚本尽可能简单,但这是兼性的,您可以将所有 java 内容直接放入 BIRT 脚本中。这个脚本基本上是这样的:

importPackage(Packages.java.awt);
importPackage(Packages.org.my.package.using.zxing);

var url="Generate a URL or a message with data bindings, report parameters etc.";
try{
  vars["QRCode"]=QRcodeGenerator.getImage64QR(url, Color(params["QRColor"].value), Color.WHITE,params["QRSize"].value); 
}catch(e){
  vars["QRexception"]=e.message;
}

在您的情况下,可以将类似的脚本放在动态图像的数据绑定中,或放在 onCreate 事件中等。此时有两种选择:

  • 为每个数据集行生成不同的临时 .png 或 .jpg,并使用返回此临时文件的 URI 表达式设置本机 BIRT 图像元素
  • 为每个数据集行生成一个 base64 图像并将其嵌入到动态图像元素或 HTML 文本元素中

该示例使用第二种方法,其中包含 HTML 文本元素和如下表达式:

<img alt="This QRCode can't be displayed" src='<VALUE-OF>vars["QRCode"]</VALUE-OF>'/>

完成 Dominique post,适合像我这样的初学者。

  1. 创建一个 Java 项目

ZXing Maven repository 上下载 corejavase jar 并将它们添加为依赖项(或创建一个Maven 项目...).

  1. Java项目:添加以下内容class
package your.package.path;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class QRCodeGenerator {

    /**
     * Method that generate a qrcode as byte array which could be consumed by a birt image item
     * @param text
     * @param width (pixels)
     * @param height (pixels)
     * @return
     * @throws WriterException
     * @throws IOException
     */
    public static byte[] getQRCodeImage(String text, int width, int height) throws WriterException, IOException {
        // No margin around the code
        Map<EncodeHintType, Integer> hints = new HashMap<>();
        hints.put(EncodeHintType.MARGIN, 0);

        // Use the code you want, here QR_CODE
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);

        // Generate the PNG which include the code
        ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream);

        // Return the PNG as byte array
        return pngOutputStream.toByteArray();
    }

}
  1. 将您的 Java 项目导出为 jar 并将其添加到您的 Birt 项目

右键单击 birt 项目 -> 属性 -> 报表设计 -> 类路径 -> 添加外部 JAR(如果你愿意,也可以添加项目)

  1. Birt 项目:创建变量参数 "qrCode"

  2. Birt 项目:在 onCreate 事件中添加以下脚本(在加载文本之后和生成图像之前)

使用您的 java 项目路径(因此 your.package.path 由您更改)。

    importPackage(Packages.your.package.path);

    // We call the Java method and get PNG bytes that we put inside qdCode variable and that will be consumed by the dynamic image
    vars["qrCode"] =  QRCodeGenerator.getQRCodeImage(this.getRowData().getColumnValue("YourTextVariableName"), 220, 220); 
  1. Birt 项目:将图像添加到您的布局

右键单击它 -> 编辑,选中动态图像单选按钮在文本框中添加变量["qrCode"].

如果您想在 Birt Viewer War 上测试您的报告,请不要忘记将您的 Java 项目 jar 和 ZXing jar 添加到 WEB-INF/lib文件夹。