条码显示,在birt中最常见的有两种方法:1、使用条码字体(对pdf无效);2、用barcode的开源包,生成barcode,然后在报表里用动态地址去取图片。
今晚看birt文档(第 23 章 使用 Java 编写事件处理程序),例子中用java实现了一个LabelEventAdapter的适配器,对标签元素进行事件控制。脑子里灵光一现,似乎条码有着落了。
我的测试例子很简单,继承ImageEventAdapter类,重载onCreate方法,以进行条形码处理
测试用的birt报表文件简单得要死,就往上面扔了个image元素,设置其Event Handler Class为刚才写好的java类,最终得到的rptdesign文件内容如下:
运行测试,条形码出来了
遗留问题:
这次是调用org.eclipse.birt.report.engine.api.script.instance.IImageInstance.setFile()来解决问题,从javadoc可以看到,IImageInstance有很多方法可以调用,其它方法分别有什么作用?比如我尝试了半天的setData(byte[])方法,一开始以为是用这个方法直接把图形数据set进去就ok,结果未成功。
今晚看birt文档(第 23 章 使用 Java 编写事件处理程序),例子中用java实现了一个LabelEventAdapter的适配器,对标签元素进行事件控制。脑子里灵光一现,似乎条码有着落了。
我的测试例子很简单,继承ImageEventAdapter类,重载onCreate方法,以进行条形码处理
1
package
cn.ynzc.common.birt.test;
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5
6 import jbarcodebean.Code128;
7 import jbarcodebean.JBarcodeBean;
8
9 import org.apache.commons.codec.digest.DigestUtils;
10 import org.eclipse.birt.report.engine.api.script.IReportContext;
11 import org.eclipse.birt.report.engine.api.script.eventadapter.ImageEventAdapter;
12 import org.eclipse.birt.report.engine.api.script.instance.IImageInstance;
13
14 public class MyLabelClass extends ImageEventAdapter {
15
16 public void onCreate(IImageInstance image, IReportContext reportContext) {
17 try {
18 // 实际应用中,可以使用image.getRowData().getColumnValue("columnname")获得字段值
19 String code = " ABCDEF123-2222 " ;
20 // 似乎windows文件名中不允许使用“-”等符号,干脆将code进行md5散列处理
21 File file = new File(System.getProperty( " java.io.tmpdir " ), DigestUtils.md5Hex(code));
22 // 避免每次都进行条码文件生成
23 if ( ! file.exists()) {
24 JBarcodeBean bb = new JBarcodeBean();
25 bb.setCodeType( new Code128());
26 bb.setShowText( true );
27 bb.setBarcodeHeight( 45 ); // 条码高度
28 bb.setCode(code);
29 bb.gifEncode( new FileOutputStream(file));
30 }
31 image.setFile(file.getAbsolutePath());
32 }
33 catch (Exception e) {
34 e.printStackTrace();
35 }
36 }
37
38 }
39
2
3 import java.io.File;
4 import java.io.FileOutputStream;
5
6 import jbarcodebean.Code128;
7 import jbarcodebean.JBarcodeBean;
8
9 import org.apache.commons.codec.digest.DigestUtils;
10 import org.eclipse.birt.report.engine.api.script.IReportContext;
11 import org.eclipse.birt.report.engine.api.script.eventadapter.ImageEventAdapter;
12 import org.eclipse.birt.report.engine.api.script.instance.IImageInstance;
13
14 public class MyLabelClass extends ImageEventAdapter {
15
16 public void onCreate(IImageInstance image, IReportContext reportContext) {
17 try {
18 // 实际应用中,可以使用image.getRowData().getColumnValue("columnname")获得字段值
19 String code = " ABCDEF123-2222 " ;
20 // 似乎windows文件名中不允许使用“-”等符号,干脆将code进行md5散列处理
21 File file = new File(System.getProperty( " java.io.tmpdir " ), DigestUtils.md5Hex(code));
22 // 避免每次都进行条码文件生成
23 if ( ! file.exists()) {
24 JBarcodeBean bb = new JBarcodeBean();
25 bb.setCodeType( new Code128());
26 bb.setShowText( true );
27 bb.setBarcodeHeight( 45 ); // 条码高度
28 bb.setCode(code);
29 bb.gifEncode( new FileOutputStream(file));
30 }
31 image.setFile(file.getAbsolutePath());
32 }
33 catch (Exception e) {
34 e.printStackTrace();
35 }
36 }
37
38 }
39
测试用的birt报表文件简单得要死,就往上面扔了个image元素,设置其Event Handler Class为刚才写好的java类,最终得到的rptdesign文件内容如下:
1
<?
xml version="1.0" encoding="UTF-8"
?>
2 <!-- Written by Eclipse BIRT 2.0 -->
3 < report xmlns ="http://www.eclipse.org/birt/2005/design" version ="3.2.6" id ="1" >
4 < property name ="createdBy" > Eclipse BIRT Designer Version 2.1.2.v20070205-1728 Build < 20070205-1728> </ property >
5 < property name ="units" > in </ property >
6 < page-setup >
7 < simple-master-page name ="Simple MasterPage" id ="2" />
8 </ page-setup >
9 < body >
10 < image id ="4" >
11 < property name ="eventHandlerClass" > cn.ynzc.common.birt.test.MyLabelClass </ property >
12 </ image >
13 </ body >
14 </ report >
2 <!-- Written by Eclipse BIRT 2.0 -->
3 < report xmlns ="http://www.eclipse.org/birt/2005/design" version ="3.2.6" id ="1" >
4 < property name ="createdBy" > Eclipse BIRT Designer Version 2.1.2.v20070205-1728 Build < 20070205-1728> </ property >
5 < property name ="units" > in </ property >
6 < page-setup >
7 < simple-master-page name ="Simple MasterPage" id ="2" />
8 </ page-setup >
9 < body >
10 < image id ="4" >
11 < property name ="eventHandlerClass" > cn.ynzc.common.birt.test.MyLabelClass </ property >
12 </ image >
13 </ body >
14 </ report >
运行测试,条形码出来了
遗留问题:
这次是调用org.eclipse.birt.report.engine.api.script.instance.IImageInstance.setFile()来解决问题,从javadoc可以看到,IImageInstance有很多方法可以调用,其它方法分别有什么作用?比如我尝试了半天的setData(byte[])方法,一开始以为是用这个方法直接把图形数据set进去就ok,结果未成功。