BIRT中的QR码

时间:2016-02-05 05:55:14

标签: birt

我想在BIRT中生成QR码。在生成报告之前,我将输入标签数量作为输入说x,然后报告应该包含x标签和QR码.QR代码数据是动态的并且基于输入。我在网上搜索了很多但没有找到合适的解决方案。我想报告如下

2 个答案:

答案 0 :(得分:3)

可以使用ZXing库创建QRCode本身,例如使用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>'/>

答案 1 :(得分:1)

针对像我这样的初学者,请完成Dominique帖子。

  1. 创建Java项目

ZXing Maven repository上下载 core javase jars并将其添加为依赖项(或创建maven项目...)。

  1. Java项目:添加以下类
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项目路径(因此请更改您的.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项目:将图像添加到布局中

右键单击它->编辑,选中动态图像单选按钮,然后在文本框中添加vars [“ qrCode”]

如果要测试有关Birt Viewer战争的报告,请不要忘记将Java Project jar和ZXing jar添加到 WEB-INF / lib 文件夹中。