在birt2.1.2中顯示條形碼
阿新 • • 發佈:2019-01-25
條碼顯示,在birt中最常見的有兩種方法:1、使用條碼字型(對pdf無效);2、用barcode的開源包,生成barcode,然後在報表裡用動態地址去取圖片。
今晚看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 publicclass MyLabelClass extends ImageEventAdapter {
15 16 publicvoid 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[])方法,一開始以為是用這個方法直接把圖形資料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;
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 publicclass MyLabelClass
15 16 publicvoid 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(
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[])方法,一開始以為是用這個方法直接把圖形資料set進去就ok,結果未成功。