BIRT的文档生成,渲染技术
关于编写viewer,关键在于使用ReportEngine API,这个在birt官方文档上有很详细的描述。 这里将几个主要环节总结一下:
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;
??}运行报表
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();
????}
??}渲染报表
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();
????}渲染PDF和HTML报表
??/**?*//**
???*?@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
??/**?*//**
???*?@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);???
??}