`
yangzb
  • 浏览: 3502963 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

BIRT的文档生成,渲染技术

    博客分类:
  • Java
阅读更多

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

  1. 启动ReportEngine
    这里需要注意启动ReportEngine的开销问题和图片链的协议的问题。使用 IReportEngineFactory比每次new一个出来性能方面要好很多。使用HTMLEmitterConfig可以使得生成的HTML报表中 的图片的src指向一个web资源而非file资源。
    public  IReportEngine getEngine()  ... {
        
    try   ... {
          
    if (platformContext  ==   null ... {
            platformContext 
    =   new  PlatformServletContext(servletContext);
          }

          engineConfig 
    =   new  EngineConfig();
          engineConfig.setEngineHome(
              servletContext.getRealPath(
    " /WEB-INF/platform/ " ));
          
    //  要求ENGINE HOME 位于WEB-INF/Platform
          engineConfig.setPlatformContext(platformContext); 
          
    // This call sets the Log directory name and level
          engineConfig.setLogConfig(getLogDir(), Level.FINE);
          
          
    // 设置Emitter,渲染HTML的时候,image的地址是HTTP协议而不是File协议
          HTMLEmitterConfig emitterConfig  =   new  HTMLEmitterConfig( );
          emitterConfig.setActionHandler(
    new  HTMLActionHandler());
          HTMLServerImageHandler imageHandler 
    =   new  HTMLServerImageHandler();
          emitterConfig.setImageHandler(imageHandler);
          engineConfig.getEmitterConfigs().put(
    " html " , emitterConfig);
          
          
    // 设置日志level
          engineConfig.setLogConfig(getLogDir(), Level.WARNING);
          
    // 启动Platform,创建ReportEngine
          Platform.startup(engineConfig);
          IReportEngineFactory factory 
    =  (IReportEngineFactory) Platform
              .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
          engine 
    =  factory.createReportEngine(engineConfig);
          engine.changeLogLevel(Level.WARNING);
          
          log.debug(
    " A new engine startup. " );
        }
      catch  (BirtException e)  ... {
          e.printStackTrace();
        }


        
    return  engine;
      }
  2. 运行报表
    我理解为编译报表文件。BIRT在渲染报表之前,要将报表编译为.rptdocument,再根据这个文件将报表渲染为HTML格式或PDF格式。编译报表使用IRunTask:
    protected   void  run(String rptDesign)  ... {
        
    assert  (context  !=   null );

        IReportEngine engine 
    =  context.getEngine();
        
    //  Open a report design
        IReportRunnable design  =   null ;
        
    try   ... {
          design 
    =  engine.openReportDesign(context
              .getFullRptDesignFilename(rptDesign));
          
    //  Create task to run the report - use the task to
          
    //  execute the report and save to disk.
          IRunTask task  =  engine.createRunTask(design);
          String doc 
    =  context.getFullRptDocumentFilename(rptDesign);
          
    //  run the report and destroy the engine
          task.run(doc);
          
          log.debug(
    " save rpt design to  "   +  doc);
          task.close();
        }
      catch  (EngineException e)  ... {
          e.printStackTrace();
        }

      }
  3. 渲染报表
    BIRT支持HTML格式和PDF格式,这两种报表生成的过程相同,只是设置不同的RenderContext和RenderOptions。我们把相同的部分提取为父类的公共方法,不同的部分留给子类实现:
    IReportDocument iReportDocument  =  engine.openReportDocument(docFilename);
          
    // Create Render Task
          IRenderTask task  =  engine.createRenderTask(iReportDocument);
          task.addScriptableJavaObject(
    " jsBirtObject "
              getScriptableObject(scriptObj));
          
    if (params  !=   null   &&   ! params.isEmpty())  ... {
            task.setParameterValues(params);
          }

          setRenderContext(task); 
    // 设置Render Context,具体由子类实现
          setRenderOptions(task, out);  // 设置Render Options,具体由子类实现
          task.render();
          task.close();
        } 
    catch  (EngineException e)  ... {
          e.printStackTrace();
        }
      finally   ... {
          engine.shutdown();
        }
  4. 渲染PDF和HTML报表
    • PDF
         /** */ /**
         * 
      @see  AbstractBirtReportParser#setRenderContext(IRenderTask)
         
      */

        @Override
        
      protected   void  setRenderContext(IRenderTask task)  ... {
          PDFRenderContext renderContext 
      =   new  PDFRenderContext();
          renderContext.setEmbededFont(
      true );    
          HashMap contextMap 
      =   new  HashMap();
          contextMap.put( EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, renderContext);
          task.setAppContext( contextMap );        
        }


        
      /** */ /**
         * 
      @see  AbstractBirtReportParser#setRenderOptions(IRenderTask, OutputStream)
         
      */

        @Override
        
      protected   void  setRenderOptions(IRenderTask task, OutputStream out)  ... {
          RenderOptionBase options 
      =   new  RenderOptionBase();
          options.setOutputStream(out);
          options.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF);
          task.setRenderOption(options);
        }
    • HTML
      我们要生成一个HTML的一部分,而非包含<html/>标记的完整的HTML文档
         /** */ /**
         * 
      @see  AbstractBirtReportParser#setRenderContext(IRenderTask)
         
      */

        @Override
        
      protected   void  setRenderContext(IRenderTask task)  ... {
          HTMLRenderContext renderContext 
      =   new  HTMLRenderContext();
          renderContext.setBaseURL(context.getBaseURL());        
         
      // You must define HTMLServerImageHandler to use a URL
          renderContext.setBaseImageURL(context.getBaseImageURL());
          
      // renderContext.setImageDirectory("myimages");
          renderContext.setImageDirectory(context.getImageDirectory());
          renderContext.setSupportedImageFormats(
      " JPG;PNG " );
          HashMap contextMap 
      =   new  HashMap();
          contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext);
          task.setAppContext( contextMap );    
        }


        
      /** */ /**
         * 
      @see  AbstractBirtReportParser#setRenderOptions(oIRenderTask, OutputStream)
         
      */

        @Override
        
      protected   void  setRenderOptions(IRenderTask task, OutputStream out)  ... {
          HTMLRenderOption options 
      =   new  HTMLRenderOption();
          options.setOutputStream(out);
          options.setEmbeddable(
      true );
          task.setRenderOption(options);   
        }
分享到:
评论

相关推荐

    FlappyBird注释%2B开发文档版_java

    FlappyBird的基本设计包括角色(小鸟)的移动、管道的生成与移动、碰撞检测和得分机制。在Java环境下,我们可以利用面向对象编程的思想,将游戏元素如小鸟、管道等设计为独立的类,通过实例化这些类来创建游戏世界。...

    使用N4开发板实现Flappy Bird小游戏

    开发人员需要设计并实现相应的数字逻辑电路,使得N4开发板能够正确地生成并传输VGA信号,以在屏幕上实时渲染Flappy Bird游戏。 声音传感器是另一个重要的硬件组件,它能检测到环境中的音频信号,并将其转化为数字...

    flybird.zip_Fly Bi_ego1开发板游戏_fpga的fly bird_vivdao

    《基于Fly Bi Ego1开发板的FPGA小鸟游戏实现——深入解析Vivado技术》 在当前的数字系统设计领域,FPGA(Field-Programmable Gate Array)因其灵活性和高速性能,被广泛应用于各种嵌入式系统,尤其是游戏开发。本...

    Flappy_Bird unity_java_everyonejck_flappybirdunity_flappybirduni

    在这个项目中,Unity被用来创建Flappy Bird的游戏环境,包括背景、管道、角色等元素的渲染和动画效果。 源码中主要涉及以下几个关键知识点: 1. **游戏对象和组件**:在Unity中,游戏世界由各种Game Objects组成,...

    Android应用源码之FlappyBird像素鸟Unity+cocos2dx项目-IT计算机-毕业设计.zip

    这篇文档将深入解析《Android应用源码之FlappyBird像素鸟Unity+cocos2dx项目》这一资源包,它是一个适用于毕业设计的学习示例,旨在帮助学生掌握Android应用开发的关键技术。我们将围绕Android、Unity和cocos2dx这三...

    基于html5+phaser.js+node环境实现flappy-bird.zip

    在Flappy Bird的实现中,Phaser.js使得游戏逻辑编写变得简单,比如定义鸟的跳跃动作、管道的生成和移动、以及得分系统等。同时,Phaser.js还提供了调试工具和优化机制,帮助开发者优化性能,确保游戏在不同设备上...

    安卓Android源码——FlappyBird像素鸟Unity+cocos2dx项目.zip

    压缩包中的"不死鸟分析文档.pdf"是对Flappy Bird游戏设计和实现的详细解析,包括游戏规则、核心算法和优化策略,对于理解源码有极大的帮助。"javaapk.com_000X.png"是一系列截图,可能用于展示游戏界面或关键流程,...

    微信小程序源码_富文本解析,折线图,MD5,bluebird.zip

    在这个“微信小程序源码_富文本解析,折线图,MD5,bluebird.zip”压缩包中,包含了一些核心的开发组件和技术的示例代码,下面将对这些知识点进行详细解释。 1. 富文本解析:在微信小程序中,处理富文本内容是常见的...

    [模仿]html5游戏_FlyppyBird

    开发者通过`&lt;canvas&gt;`标签在HTML文档中定义画布,并通过JavaScript的`canvas.getContext('2d')`获取2D渲染上下文,进而进行绘制、填充、描边等操作。 二、JavaScript基础 1. 事件处理:游戏的交互主要依赖...

    birt pdf 书

    1. **PDF渲染选项**:讲解如何配置BIRT以生成高质量、多页或单页、带有水印和安全设置的PDF报告。 2. **页面布局和样式**:指导如何设计PDF报表的版式,包括字体、颜色、边距、页眉和页脚等。 3. **图表和图像**:...

    flappy_bird:移动设备应用程序开发课程的短期任务5(Flappy Bird)-学生

    【标题】"flappy_bird" 是一个针对移动设备应用程序开发课程的短期任务,它以经典游戏Flappy Bird为蓝本,旨在让学生实践并掌握Java编程语言和Android应用开发技术。这个项目通常会涵盖游戏的基本逻辑、用户界面设计...

    游戏开发是一个充满创造性和技术挑战的领域.docx

    这些资源涵盖了引擎的基础使用方法、高级渲染技术、蓝图视觉脚本语言等内容。通过学习Unreal Engine,开发者能够掌握创建高质量游戏所需的关键技能。 ##### 3. **在线课程平台** - **Coursera**:Coursera汇集了...

    Watch-Out-Game:使用库LibGDX重制Flappy Bird

    `render()`方法是我们更新游戏状态和绘制画面的地方,这里将实现Flappy Bird的基本逻辑,包括鸟的飞行、管道的生成与移动、碰撞检测以及分数计算。 游戏对象的表示是通过精灵(Sprites)和纹理(Textures)来完成的...

    Flaybird简单demo实现(适合新手cocos2d)

    3.3final是它的一个稳定版本,提供了丰富的图形渲染、动画、物理模拟和音频处理等功能。 2. **Flappy Bird核心机制**:Flappy Bird游戏的核心在于角色的飞行控制和管道穿越。玩家通过点击屏幕使小鸟上下飞行,避开...

    threejs-bird:threejs鸟背景

    在压缩包文件名称"threejs-bird-master"中,"master"通常表示这是项目的主分支或最新版本,意味着我们可以期待找到项目的源代码、资源文件和其他相关文档。 深入讨论知识点: 1. **Three.js**:Three.js是...

    html转pdf(亲测可用)

    HTML到PDF转换是一种常见的需求,特别是在网页打印、文档保存或跨平台分享时。本文将详细介绍如何使用HTML转PDF的方法,并重点讲解在JavaScript环境下,特别是基于`jspdf`库的实现方式。 `jspdf`是一个开源的...

    QtFlappyBird-master.zip_QT游戏_Qt制作flappy

    10. **软件工程实践**:除了技术细节,这个项目还可能包含良好的软件工程实践,如模块化设计、注释、测试和文档。这些对于维护和扩展项目至关重要。 通过学习和分析这个项目,开发者不仅可以掌握Qt游戏开发的基本...

    fe20tp2_bev_2-main-源码.rar

    源码的组织结构可能包括以下几个部分:主程序入口、模块化功能(如传感器接口、数据处理、BEV渲染)、配置文件、测试用例、文档等。 【编程语言】根据文件名无法直接确定使用哪种编程语言,但在自动驾驶和计算机...

    css-bird:分析CSS源代码-css source code

    为了使用“CSS鸟”,开发者首先需要下载提供的压缩包“css-bird-master”,解压后按照项目文档的指示进行安装和运行。通常,这涉及克隆Git仓库、安装依赖项,并通过命令行工具启动应用。在使用过程中,开发者可以...

    cce_java_thecode_

    "_thecode_"这部分暗示我们将讨论的是实际的源代码,而不是文档或概念。 【描述】:“FlappyBird reproduction project source code”揭示了这个Java项目是关于复现经典游戏《Flappy Bird》的。Flappy Bird是一款...

Global site tag (gtag.js) - Google Analytics