在birt2.1.2中显示条形码

条码显示,在birt中最常见的有两种方法:1、使用条码字体(对pdf无效);2、用barcode的开源包,生成barcode,然后在报表里用动态地址去取图片。

今晚看birt文档(第 23 章 使用 Java 编写事件处理程序),例子中用java实现了一个LabelEventAdapter的适配器,对标签元素进行事件控制。脑子里灵光一现,似乎条码有着落了。

我的测试例子很简单,继承ImageEventAdapter类,重载onCreate方法,以进行条形码处理

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1packagecn.ynzc.common.birt.test;
2
3importjava.io.File;
4importjava.io.FileOutputStream;
5
6importjbarcodebean.Code128;
7importjbarcodebean.JBarcodeBean;
8
9importorg.apache.commons.codec.digest.DigestUtils;
10importorg.eclipse.birt.report.engine.api.script.IReportContext;
11importorg.eclipse.birt.report.engine.api.script.eventadapter.ImageEventAdapter;
12importorg.eclipse.birt.report.engine.api.script.instance.IImageInstance;
13
14publicclassMyLabelClassextendsImageEventAdapter{
15
16publicvoidonCreate(IImageInstanceimage,IReportContextreportContext){
17try{
18//实际应用中,可以使用image.getRowData().getColumnValue("columnname")获得字段值
19Stringcode="ABCDEF123-2222";
20//似乎windows文件名中不允许使用“-”等符号,干脆将code进行md5散列处理
21Filefile=newFile(System.getProperty("java.io.tmpdir"),DigestUtils.md5Hex(code));
22//避免每次都进行条码文件生成
23if(!file.exists()){
24JBarcodeBeanbb=newJBarcodeBean();
25bb.setCodeType(newCode128());
26bb.setShowText(true);
27bb.setBarcodeHeight(45);//条码高度
28bb.setCode(code);
29bb.gifEncode(newFileOutputStream(file));
30}
31image.setFile(file.getAbsolutePath());
32}
33catch(Exceptione){
34e.printStackTrace();
35}
36}
37
38}
39

测试用的birt报表文件简单得要死,就往上面扔了个image元素,设置其Event Handler Class为刚才写好的java类,最终得到的rptdesign文件内容如下:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1<?xmlversion="1.0"encoding="UTF-8"?>
2<!--WrittenbyEclipseBIRT2.0-->
3<reportxmlns="http://www.eclipse.org/birt/2005/design"version="3.2.6"id="1">
4<propertyname="createdBy">EclipseBIRTDesignerVersion2.1.2.v20070205-1728Build&lt;20070205-1728></property>
5<propertyname="units">in</property>
6<page-setup>
7<simple-master-pagename="SimpleMasterPage"id="2"/>
8</page-setup>
9<body>
10<imageid="4">
11<propertyname="eventHandlerClass">cn.ynzc.common.birt.test.MyLabelClass</property>
12</image>
13</body>
14</report>

运行测试,条形码出来了
在birt2.1.2中显示条形码

遗留问题:
这次是调用org.eclipse.birt.report.engine.api.script.instance.IImageInstance.setFile()来解决问题,从javadoc可以看到,IImageInstance有很多方法可以调用,其它方法分别有什么作用?比如我尝试了半天的setData(byte[])方法,一开始以为是用这个方法直接把图形数据set进去就ok,结果未成功。