BIRT部署並利用API生成PDF

wenmin311發表於2008-06-05

注:本文轉自 http://blog.csdn.net/xujiaqiang/archive/2008/01/19/2052789.aspx

感謝作者分享。

 

Birt報表設計步驟:

1、下載birt all in one 2.2.1.1,包含eclipse,解開下載檔案
      啟動eclipse,必須使用JDK1.5啟動eclipse,否則新建工程對話方塊中沒有birt的相關選項


2、新建report project和report
      開啟data explorer檢視,新建一個data sources,定義資料庫連線driver/url/使用者名稱/密碼,在"Manage Drivers..."中把jdbc的jar加進來


3、新建Report Parameter,設定引數名稱、型別,引數值將來通過url傳遞或使用程式方式賦值


4、新建data sets,設定Query,即preparedStatement語句,設定data set的Pameters,即reparedStatement中的“?”,使之和report parameter關聯; 如果data set的Parameter的值不是來自於Report Parameter,例如來自另外一個data set, 可不設定關聯,而在報表內容中設定和其它data set欄位的關聯(見步驟8)

5、如果data set對應的sql是動態生成的,可以設定“property Binding”,在Query Text中輸入sql和表示式,其中可以使用Report Parameter和javascript語句,執行時將執行Property Binding中的Query Text,而不執行Query中的preparedStatement,但是Query中的preparedStatement在設計報表時還是有用的,因為可以看到執行結果的欄位列表,只要preparedStatement和Query Text返回相同的欄位即可

6、將定義好的data set拖動到設計介面上,會自動在報表放置一個Table

7、如要對table的某列合計,從Palette檢視中拖一個“Aggregation”到設計介面

8、如要Master-Sleve報表,則在Table中再放置一個Table。例如一個data set是客戶基本資訊,每個客戶一條記錄,另一個data set是客戶交易明細,每個客戶可能有多條記錄,則先將客戶基本資訊的data set拖置設計介面,會自動放置一個Table,然後將客戶交易明細的data set拖置前一個Table中適當位置,即生成一個Table中的Table。選中交易明細的Table,開啟Property Editor檢視,在binding欄中,選擇交易明細的data set,按“Dataset Parameter Binding...”,選擇“CUST_ID"欄位,將其和客戶基本資訊data set的CUST_ID關聯起來(row["CUST_ID"])

9、按需要調整報表的樣式,從eclipse工具欄中選擇“view report in web viewer”,如果設定了Report Parameter,會出現一個對話方塊,要求輸入Report Parameter的值,按確定後生成報表內容

10、在web viewer中,滑鼠右建點按生成的報表,選“屬性”,獲取url,開一個空白IE,複製url到位址列,在url最後用“&引數名=引數值”方式,把Report Parameter加進url,按回車,直接出現報表結果,不再出現報表引數輸入對話方塊。還可以pdf/doc/html等格式預覽生成的報表

Birt報表部署步驟:

部署設計好的報表很簡單,只需要下載Birt runtime,將Birt runtime部署為一個web應用,報表設計檔案複製到該應用的根目錄即可。為方便起見,以下將Birt runtime部屬為一個獨立的應用,當然也可以將Birt runtime整合到你的web應用中

1、下載birt runtime 2.2.1.1,解開下載檔案
2、將birt rumtime解開後的目錄下的部署為一個web應用,使用JDK1.4.2或以上版本
3、將報表設計步驟中生成的設計檔案(*.retdesing檔案)複製到web應用所在目錄
4、確保以下檔案在WEB-INF/lib目錄下存在,如果沒有,從all in one中搜尋複製過來
       com.ibm.icu_3.6.1.v20070906.jar
       coreapi.jar
       engineapi.jar
       scriptapi.jar
5、將jdbc的jar或zip檔案複製到WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_2.2.1.r22x_v20070919\drivers目錄下
6、刪除WEB-INF\platform\org.eclipse.birt.report.data.oda.sampledb_2.2.1.r22x_v20070919目錄(示例資料庫,沒什麼用處),否則生成報表時有不必要的警告資訊出現
7、啟動web server,修改設計步驟第10步獲得的url,使IP/埠/web應用名稱符合你的Birt runtime部署,在IE中可以檢視報表內容 

使用Birt提供API以程式方式生成報表結果,例如生成PDF格式的報表結果,程式碼片段如下:

import java.util.HashMap;
import java.util.logging.Level;

import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.ByteArrayOutputStream;

import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.PDFRenderOption;

public class PDFReportServiceAccess
{
    /** *//** 初始化的狀態 */
    protected static boolean initStatus = false;

    private static IReportEngine engine = null;

    private static EngineConfig config = null;
    
    private static IReportRunnable design = null;
    
    private static PDFRenderOption ro = null;

    /** *//** 初始化資源 */
    public void initilize()
    {
    if ( initStatus == true )
        return;

    try
    {
        config = new EngineConfig();
        config.setEngineHome( "C:/projects/birt/WEB-INF/platform" );  //birt runtime web應用中的報表引擎目錄
        config.setLogConfig( "C:/projects/birt/logs", Level.FINE );

        Platform.startup( config );
        IReportEngineFactory factory = ( IReportEngineFactory ) Platform
            .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );
        engine = factory.createReportEngine( config );
        engine.changeLogLevel( Level.WARNING );

        ro = new PDFRenderOption();
      //  ro.setBaseURL( "http://localhost:8080/birt" ); //birt runtime web應用
        config.getEmitterConfigs().put( "pdf", ro ); //生成pdf格式

        initStatus = true;

    }
    catch ( Exception ex )
    {
        ex.printStackTrace();
        initStatus = false;
    }
    }

    /** *//** 釋放資源 */
    public void release()
    {
    engine.shutdown();
    Platform.shutdown();

    initStatus = false;
    }

    protected OutputStream run( String filename, HashMap parameters ) throws EngineException
    {
    design = engine.openReportDesign( filename );
    
    // Create task to run and render the report,
    IRunAndRenderTask task = engine.createRunAndRenderTask( design );
    HashMap contextMap = new HashMap();
    contextMap.put( EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, ro );
    task.setAppContext( contextMap );
    task.setParameterValues( parameters );
    task.validateParameters();

    OutputStream os = new ByteArrayOutputStream();
    ro.setOutputStream( os );
    ro.setOutputFormat( "pdf" );
    task.setRenderOption( ro );

    task.run();
    task.close();

    return os;
    }

    /** *//**
         * 生成PDF格式報表,以OutputStream格式返回
         * 
         * @param filename 報表設計檔名全路徑
         * @param parameters
         *                報表引數
         * @return ByteArrayOutputStream
         * @throws EngineException
         */
    public OutputStream call( String filename, HashMap parameters ) throws EngineException
    {
    initilize();
    OutputStream os = run( filename, parameters );
    release();
    
    return os;
    }

    /** *//**
         * @param args
         */
    public static void main( String[] args )
    {
    HashMap parameters = new HashMap();
                     //三個Report Parameters,名稱必須在報表設計檔案中預先定義好
    parameters.put( "begindate", "2004/01/01" );
    parameters.put( "enddate", "2007/12/31" );
    parameters.put(  "sql", " where cust_id = 1234567" );
    
    ByteArrayOutputStream bos = null;

    PDFReportServiceAccess ebr = new PDFReportServiceAccess();

    String filename = "C:/projects/birt/batch_report.rptdesign";
    try
    {
        bos = ( ByteArrayOutputStream ) ebr.call( filename, parameters );
        OutputStream fis = new FileOutputStream( "c:/test.pdf" );
        bos.writeTo( fis );
    }
    catch ( Exception e )
    {
        e.printStackTrace();
    }
    }

}

 

相關文章