读书人

BIRT的文档生成,点染技术

发布时间: 2012-10-24 14:15:58 作者: rapoo

BIRT的文档生成,渲染技术

关于编写viewer,关键在于使用ReportEngine API,这个在birt官方文档上有很详细的描述。 这里将几个主要环节总结一下:

    启动ReportEngine
    这里需要注意启动ReportEngine的开销问题和图片链的协议的问题。使用IReportEngineFactory比每次new一个出来性能方面要好很多。使用HTMLEmitterConfig可以使得生成的HTML报表中的图片的src指向一个web资源而非file资源。
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术public?IReportEngine?getEngine()?...{
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????try?...{
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??????if(platformContext?==?null)?...{
    BIRT的文档生成,点染技术????????platformContext?=?new?PlatformServletContext(servletContext);
    BIRT的文档生成,点染技术??????}
    BIRT的文档生成,点染技术??????engineConfig?=?new?EngineConfig();
    BIRT的文档生成,点染技术??????engineConfig.setEngineHome(
    BIRT的文档生成,点染技术??????????servletContext.getRealPath("/WEB-INF/platform/"));
    BIRT的文档生成,点染技术??????//?要求ENGINE?HOME?位于WEB-INF/Platform
    BIRT的文档生成,点染技术??????engineConfig.setPlatformContext(platformContext);?
    BIRT的文档生成,点染技术??????//This?call?sets?the?Log?directory?name?and?level
    BIRT的文档生成,点染技术??????engineConfig.setLogConfig(getLogDir(),?Level.FINE);
    BIRT的文档生成,点染技术??????
    BIRT的文档生成,点染技术??????//设置Emitter,渲染HTML的时候,image的地址是HTTP协议而不是File协议
    BIRT的文档生成,点染技术??????HTMLEmitterConfig?emitterConfig?=?new?HTMLEmitterConfig(?);
    BIRT的文档生成,点染技术??????emitterConfig.setActionHandler(new?HTMLActionHandler());
    BIRT的文档生成,点染技术??????HTMLServerImageHandler?imageHandler?=?new?HTMLServerImageHandler();
    BIRT的文档生成,点染技术??????emitterConfig.setImageHandler(imageHandler);
    BIRT的文档生成,点染技术??????engineConfig.getEmitterConfigs().put("html",?emitterConfig);
    BIRT的文档生成,点染技术??????
    BIRT的文档生成,点染技术??????//设置日志level
    BIRT的文档生成,点染技术??????engineConfig.setLogConfig(getLogDir(),?Level.WARNING);
    BIRT的文档生成,点染技术??????//启动Platform,创建ReportEngine
    BIRT的文档生成,点染技术??????Platform.startup(engineConfig);
    BIRT的文档生成,点染技术??????IReportEngineFactory?factory?=?(IReportEngineFactory)?Platform
    BIRT的文档生成,点染技术??????????.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
    BIRT的文档生成,点染技术??????engine?=?factory.createReportEngine(engineConfig);
    BIRT的文档生成,点染技术??????engine.changeLogLevel(Level.WARNING);
    BIRT的文档生成,点染技术??????
    BIRT的文档生成,点染技术??????log.debug("A?new?engine?startup.");
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????}?catch?(BirtException?e)?...{
    BIRT的文档生成,点染技术??????e.printStackTrace();
    BIRT的文档生成,点染技术????}
    BIRT的文档生成,点染技术
    BIRT的文档生成,点染技术????return?engine;
    BIRT的文档生成,点染技术??}运行报表
    我理解为编译报表文件。BIRT在渲染报表之前,要将报表编译为.rptdocument,再根据这个文件将报表渲染为HTML格式或PDF格式。编译报表使用IRunTask:
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术protected?void?run(String?rptDesign)?...{
    BIRT的文档生成,点染技术????assert?(context?!=?null);
    BIRT的文档生成,点染技术
    BIRT的文档生成,点染技术????IReportEngine?engine?=?context.getEngine();
    BIRT的文档生成,点染技术????//?Open?a?report?design
    BIRT的文档生成,点染技术????IReportRunnable?design?=?null;
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????try?...{
    BIRT的文档生成,点染技术??????design?=?engine.openReportDesign(context
    BIRT的文档生成,点染技术??????????.getFullRptDesignFilename(rptDesign));
    BIRT的文档生成,点染技术??????//?Create?task?to?run?the?report?-?use?the?task?to
    BIRT的文档生成,点染技术??????//?execute?the?report?and?save?to?disk.
    BIRT的文档生成,点染技术??????IRunTask?task?=?engine.createRunTask(design);
    BIRT的文档生成,点染技术??????String?doc?=?context.getFullRptDocumentFilename(rptDesign);
    BIRT的文档生成,点染技术??????//?run?the?report?and?destroy?the?engine
    BIRT的文档生成,点染技术??????task.run(doc);
    BIRT的文档生成,点染技术??????
    BIRT的文档生成,点染技术??????log.debug("save?rpt?design?to?"?+?doc);
    BIRT的文档生成,点染技术??????task.close();
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????}?catch?(EngineException?e)?...{
    BIRT的文档生成,点染技术??????e.printStackTrace();
    BIRT的文档生成,点染技术????}
    BIRT的文档生成,点染技术??}渲染报表
    BIRT支持HTML格式和PDF格式,这两种报表生成的过程相同,只是设置不同的RenderContext和RenderOptions。我们把相同的部分提取为父类的公共方法,不同的部分留给子类实现:
    BIRT的文档生成,点染技术IReportDocument?iReportDocument?=?engine.openReportDocument(docFilename);
    BIRT的文档生成,点染技术??????//Create?Render?Task
    BIRT的文档生成,点染技术??????IRenderTask?task?=?engine.createRenderTask(iReportDocument);
    BIRT的文档生成,点染技术??????task.addScriptableJavaObject("jsBirtObject",?
    BIRT的文档生成,点染技术??????????getScriptableObject(scriptObj));
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??????if(params?!=?null?&&?!params.isEmpty())?...{
    BIRT的文档生成,点染技术????????task.setParameterValues(params);
    BIRT的文档生成,点染技术??????}
    BIRT的文档生成,点染技术??????setRenderContext(task);?//设置Render?Context,具体由子类实现
    BIRT的文档生成,点染技术??????setRenderOptions(task,?out);?//设置Render?Options,具体由子类实现
    BIRT的文档生成,点染技术??????task.render();
    BIRT的文档生成,点染技术??????task.close();
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????}?catch?(EngineException?e)?...{
    BIRT的文档生成,点染技术??????e.printStackTrace();
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术????}?finally?...{
    BIRT的文档生成,点染技术??????engine.shutdown();
    BIRT的文档生成,点染技术????}渲染PDF和HTML报表
    PDF
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??/**?*//**
    BIRT的文档生成,点染技术???*?@see?AbstractBirtReportParser#setRenderContext(IRenderTask)
    BIRT的文档生成,点染技术???*/
    BIRT的文档生成,点染技术??@Override
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??protected?void?setRenderContext(IRenderTask?task)?...{
    BIRT的文档生成,点染技术????PDFRenderContext?renderContext?=?new?PDFRenderContext();
    BIRT的文档生成,点染技术????renderContext.setEmbededFont(true);????
    BIRT的文档生成,点染技术????HashMap?contextMap?=?new?HashMap();
    BIRT的文档生成,点染技术????contextMap.put(?EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT,?renderContext);
    BIRT的文档生成,点染技术????task.setAppContext(?contextMap?);????????
    BIRT的文档生成,点染技术??}
    BIRT的文档生成,点染技术
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??/**?*//**
    BIRT的文档生成,点染技术???*?@see?AbstractBirtReportParser#setRenderOptions(IRenderTask,?OutputStream)
    BIRT的文档生成,点染技术???*/
    BIRT的文档生成,点染技术??@Override
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??protected?void?setRenderOptions(IRenderTask?task,?OutputStream?out)?...{
    BIRT的文档生成,点染技术????RenderOptionBase?options?=?new?RenderOptionBase();
    BIRT的文档生成,点染技术????options.setOutputStream(out);
    BIRT的文档生成,点染技术????options.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF);
    BIRT的文档生成,点染技术????task.setRenderOption(options);
    BIRT的文档生成,点染技术??}HTML
    我们要生成一个HTML的一部分,而非包含<html/>标记的完整的HTML文档
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??/**?*//**
    BIRT的文档生成,点染技术???*?@see?AbstractBirtReportParser#setRenderContext(IRenderTask)
    BIRT的文档生成,点染技术???*/
    BIRT的文档生成,点染技术??@Override
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??protected?void?setRenderContext(IRenderTask?task)?...{
    BIRT的文档生成,点染技术????HTMLRenderContext?renderContext?=?new?HTMLRenderContext();
    BIRT的文档生成,点染技术????renderContext.setBaseURL(context.getBaseURL());????????
    BIRT的文档生成,点染技术???//You?must?define?HTMLServerImageHandler?to?use?a?URL
    BIRT的文档生成,点染技术????renderContext.setBaseImageURL(context.getBaseImageURL());
    BIRT的文档生成,点染技术????//renderContext.setImageDirectory("myimages");
    BIRT的文档生成,点染技术????renderContext.setImageDirectory(context.getImageDirectory());
    BIRT的文档生成,点染技术????renderContext.setSupportedImageFormats("JPG;PNG");
    BIRT的文档生成,点染技术????HashMap?contextMap?=?new?HashMap();
    BIRT的文档生成,点染技术????contextMap.put(?EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT,?renderContext);
    BIRT的文档生成,点染技术????task.setAppContext(?contextMap?);????
    BIRT的文档生成,点染技术??}
    BIRT的文档生成,点染技术
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??/**?*//**
    BIRT的文档生成,点染技术???*?@see?AbstractBirtReportParser#setRenderOptions(oIRenderTask,?OutputStream)
    BIRT的文档生成,点染技术???*/
    BIRT的文档生成,点染技术??@Override
    BIRT的文档生成,点染技术BIRT的文档生成,点染技术??protected?void?setRenderOptions(IRenderTask?task,?OutputStream?out)?...{
    BIRT的文档生成,点染技术????HTMLRenderOption?options?=?new?HTMLRenderOption();
    BIRT的文档生成,点染技术????options.setOutputStream(out);
    BIRT的文档生成,点染技术????options.setEmbeddable(true);
    BIRT的文档生成,点染技术????task.setRenderOption(options);???
    BIRT的文档生成,点染技术??}

读书人网 >软件架构设计

热点推荐