條碼顯示,在birt中最常見的有兩種方法:1、使用條碼字體(對pdf無效);2、用barcode的開源包,生成barcode,然后在報表里用動態(tài)地址去取圖片。
今晚看birt文檔(第 23 章 使用 Java 編寫事件處理程序),例子中用java實現(xiàn)了一個LabelEventAdapter的適配器,對標簽元素進行事件控制。腦子里靈光一現(xiàn),似乎條碼有著落了。
我的測試例子很簡單,繼承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?
測試用的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>
運行測試,條形碼出來了

遺留問題:
這次是調用org.eclipse.birt.report.engine.api.script.instance.IImageInstance.setFile()來解決問題,從javadoc可以看到,IImageInstance有很多方法可以調用,其它方法分別有什么作用?比如我嘗試了半天的setData(byte[])方法,一開始以為是用這個方法直接把圖形數(shù)據set進去就ok,結果未成功。