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,适合像我这样的初学者。
- 创建一个 Java 项目
在 ZXing Maven repository 上下载 core 和 javase jar 并将它们添加为依赖项(或创建一个Maven 项目...).
- 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();
}
}
- 将您的 Java 项目导出为 jar 并将其添加到您的 Birt 项目
右键单击 birt 项目 -> 属性 -> 报表设计 -> 类路径 -> 添加外部 JAR(如果你愿意,也可以添加项目)
Birt 项目:创建变量参数 "qrCode"
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);
- Birt 项目:将图像添加到您的布局
右键单击它 -> 编辑,选中动态图像单选按钮并在文本框中添加变量["qrCode"].
如果您想在 Birt Viewer War 上测试您的报告,请不要忘记将您的 Java 项目 jar 和 ZXing jar 添加到 WEB-INF/lib文件夹。
我想在 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,适合像我这样的初学者。
- 创建一个 Java 项目
在 ZXing Maven repository 上下载 core 和 javase jar 并将它们添加为依赖项(或创建一个Maven 项目...).
- 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();
}
}
- 将您的 Java 项目导出为 jar 并将其添加到您的 Birt 项目
右键单击 birt 项目 -> 属性 -> 报表设计 -> 类路径 -> 添加外部 JAR(如果你愿意,也可以添加项目)
Birt 项目:创建变量参数 "qrCode"
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);
- Birt 项目:将图像添加到您的布局
右键单击它 -> 编辑,选中动态图像单选按钮并在文本框中添加变量["qrCode"].
如果您想在 Birt Viewer War 上测试您的报告,请不要忘记将您的 Java 项目 jar 和 ZXing jar 添加到 WEB-INF/lib文件夹。