{"id":2444,"date":"2017-01-09T00:22:57","date_gmt":"2017-01-08T23:22:57","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=2444"},"modified":"2017-01-09T22:46:32","modified_gmt":"2017-01-09T21:46:32","slug":"generer-un-fichier-pdf-sur-clic-dans-une-servlet-avec-birt-maven-netbeans","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=2444","title":{"rendered":"G\u00e9n\u00e9rer un fichier PDF sur clic dans une servlet avec BIRT &#8211; Maven &#8211; Netbeans"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full aligncenter\" src=\"https:\/\/www.eclipse.org\/birt\/img\/logo\/birt-purple-logo.png\" width=\"155\" height=\"176\" \/><\/p>\n<h6 style=\"text-align: justify;\">Avant-propos<\/h6>\n<p style=\"text-align: justify;\">Cet article va pr\u00e9senter une technologie compl\u00e9mentaire (BIRT) utilis\u00e9e dans le cadre d&rsquo;un projet de gestion de cours en ligne fait en TP de Java \u00e0 l&rsquo;UTBM.<\/p>\n<p style=\"text-align: justify;\">BIRT (The Business Intelligence and Reporting Tool) est un projet de la communaut\u00e9 Eclipse comprenant un g\u00e9n\u00e9rateur de rapports, un g\u00e9n\u00e9rateur de graphique ainsi qu&rsquo;un environnement de conception. Heureusement pour nous il n&rsquo;est pas n\u00e9cessaire de d\u00e9velopper sur Eclipse pour l&rsquo;utiliser. Mais il vous faudra tout de m\u00eame installer le BIRT report designer que vous pouvez trouver sur cette <a href=\"http:\/\/download.eclipse.org\/birt\/downloads\/\">page<\/a>.<\/p>\n<h6 style=\"text-align: justify;\">Pr\u00e9requis<\/h6>\n<p style=\"text-align: justify;\">Le <strong>BIRT report designer<\/strong> est <strong>n\u00e9cessaire<\/strong> pour la g\u00e9n\u00e9ration d&rsquo;un fichier <strong>.rptdesign<\/strong> qui vous sera demand\u00e9 par la suite.<\/p>\n<p style=\"text-align: justify;\">Ajout de la bonne d\u00e9pendance (org.eclipse.birt.runtime) dans le fichier pom.xml de votre projet que vous pouvez trouver <a href=\"https:\/\/mvnrepository.com\/artifact\/org.eclipse.birt.runtime\/org.eclipse.birt.runtime\/4.2.0\">ici<\/a> par exemple.<\/p>\n<h6 style=\"text-align: justify;\">Tutoriel : G\u00e9n\u00e9rer un fichier PDF sur clic dans une servlet avec BIRT<\/h6>\n<p>Les deux classes suivantes sont \u00e0 ajouter dans votre projet.<\/p>\n<p>Ainsi vous avez la premi\u00e8re classe appel\u00e9e par la servlet et permettant de d\u00e9marrer le Report Engine.<\/p>\n<pre>public class BirtEngine {\r\n\r\n\u00a0\u00a0\u00a0 private static IReportEngine birtEngine = null;\r\n\r\n\u00a0\u00a0\u00a0 private static Properties configProps = new Properties();\r\n\r\n\u00a0\u00a0\u00a0 private final static String configFile = \"BirtConfig.properties\";\r\n\r\n\u00a0\u00a0\u00a0 public static synchronized void initBirtConfig() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 loadEngineProps();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public static synchronized IReportEngine getBirtEngine(ServletContext sc) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (birtEngine == null) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 EngineConfig config = new EngineConfig();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if( configProps != null){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String logLevel = configProps.getProperty(\"logLevel\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Level level = Level.OFF;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (\"SEVERE\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.SEVERE;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"WARNING\".equalsIgnoreCase(logLevel))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.WARNING;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"INFO\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.INFO;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"CONFIG\".equalsIgnoreCase(logLevel))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.CONFIG;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"FINE\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.FINE;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"FINER\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.FINER;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"FINEST\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.FINEST;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } else if (\"OFF\".equalsIgnoreCase(logLevel)) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 level = Level.OFF;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 config.setLogConfig(configProps.getProperty(\"logDirectory\"), level);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IPlatformContext context = new PlatformServletContext( sc );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 config.setPlatformContext( context );\r\n\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Platform.startup( config );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 catch ( BirtException e )\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace( );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IReportEngineFactory factory = (IReportEngineFactory) Platform\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .createFactoryObject( IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 birtEngine = factory.createReportEngine( config );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return birtEngine;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public static synchronized void destroyBirtEngine() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (birtEngine == null) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 birtEngine.shutdown();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Platform.shutdown();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 birtEngine = null;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public Object clone() throws CloneNotSupportedException {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new CloneNotSupportedException();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 private static void loadEngineProps() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Config File must be in classpath\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ClassLoader cl = Thread.currentThread ().getContextClassLoader();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 InputStream in = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in = cl.getResourceAsStream (configFile);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 configProps.load(in);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>La classe de la servlet que vous appellerez pour g\u00e9n\u00e9rer votre fichier pdf.<\/p>\n<pre>public class WebReportServlet extends HttpServlet {\r\n\r\n\u00a0\u00a0\u00a0 private static final long serialVersionUID = 1L;\r\n\r\n\u00a0\u00a0\u00a0 private IReportEngine birtReportEngine = null;\r\n\u00a0\u00a0\u00a0 protected static Logger logger = Logger.getLogger( \"org.eclipse.birt\" );\r\n\r\n\u00a0\u00a0\u00a0 public WebReportServlet() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 super();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0 public void destroy() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 super.destroy(); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BirtEngine.destroyBirtEngine();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\r\n\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0 public void doGet(HttpServletRequest req, HttpServletResponse resp)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 throws ServletException, IOException {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resp.setContentType( \"application\/pdf\" ); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resp.setHeader (\"Content-Disposition\",\"inline; filename=test.pdf\"); \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String reportName = \"test.rptdesign\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String param1 = req.getParameter(\"param_1\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ServletContext sc = req.getSession().getServletContext();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.birtReportEngine = BirtEngine.getBirtEngine(sc);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IReportRunnable design = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Open report design\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 design = birtReportEngine.openReportDesign( sc.getRealPath(\"\/Reports\")+\"\/\"+reportName );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/create task to run and render report\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask( design ); \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int parameter1 = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parameter1 = new Integer(param1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 parameter1 = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(parameter1 &gt;= 1){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task.setParameterValue(\"param_1\", parameter1);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task.setParameterValue(\"param_1\", 0);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/set output options\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HTMLRenderOption options = new HTMLRenderOption();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 options.setOutputStream(resp.getOutputStream());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task.setRenderOption(options);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/run report\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task.run();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 task.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new ServletException( e );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0 public void doPost(HttpServletRequest request, HttpServletResponse response)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 throws ServletException, IOException {\r\n\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>Assurez vous d&rsquo;avoir mapp\u00e9 votre servlet correctement ici le mappage est r\u00e9alis\u00e9 dans le fichier web.xml comme ceci :<\/p>\n<pre>\u00a0\u00a0\u00a0 &lt;servlet&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-name&gt;birtServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-class&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 com.coursenligne.servlet.WebReportServlet\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/servlet-class&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/servlet&gt;\r\n\u00a0\u00a0\u00a0 &lt;servlet-mapping&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;servlet-name&gt;birtServlet&lt;\/servlet-name&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;url-pattern&gt;\/birt&lt;\/url-pattern&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/servlet-mapping&gt;\r\n<\/pre>\n<p>Dans le cas pr\u00e9sent l&rsquo;appel \u00e0 l&rsquo;adresse suivante via votre navigateur&#8230;<\/p>\n<pre>http:\/\/localhost\/webapp\/birt?param_1=1<\/pre>\n<p>&#8230; ne vous donnera pas le r\u00e9sultat escompt\u00e9, en cause la ligne suivante :<\/p>\n<pre>design = birtReportEngine.openReportDesign( sc.getRealPath(\"\/Reports\")+\"\/\"+reportName );\r\n<\/pre>\n<p>Le design en question est un fichier. Celui dont je vous parlais plus t\u00f4t au format .rptdesign. Il est \u00e0 placer dans le r\u00e9pertoire cible (Attention : le placement de votre dossier de placement d\u00e9terminera aussi la visibilit\u00e9 des documents contenus, voir visibilit\u00e9 de WEB-INF).<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2448\" rel=\"attachment wp-att-2448\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2448\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/1-hi\u00e9rarchie.png\" alt=\"\" width=\"164\" height=\"87\" \/><\/a>Heureusement pour vous, apr\u00e8s v\u00e9rification on peut voir que le mot de passe de votre base de donn\u00e9es est chiffr\u00e9. Moins d&rsquo;inqui\u00e9tude donc si l&rsquo;on tombait par hasard sur votre fichier de design.<\/p>\n<pre>&lt;encrypted-property name=\"odaPassword\" encryptionID=\"base64\"&gt;Y291cnM=&lt;\/encrypted-property&gt;\r\n<\/pre>\n<p>Comme vous l&rsquo;avez peut-\u00eatre constat\u00e9 vous ne pouvez ex\u00e9cuter le code pr\u00e9c\u00e9dent, et pour cause il vous faut g\u00e9n\u00e9rer le fichier de design. Prochaine \u00e9tape donc, le BIRT report designer qui se pr\u00e9sente comme ci-dessous.<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2449\" rel=\"attachment wp-att-2449\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2449\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/2-BIRT-designer.png\" alt=\"\" width=\"1177\" height=\"832\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/2-BIRT-designer.png 1177w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/2-BIRT-designer-300x212.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/2-BIRT-designer-768x543.png 768w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/2-BIRT-designer-1024x724.png 1024w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a>Rien de bien nouveau pour ceux qui utilisent r\u00e9guli\u00e8rement toutes sortent d&rsquo;IDE. Pour acc\u00e9der \u00e0 vos donn\u00e9es (Data Source) vous aurez plusieurs choix, cliquez sur l&rsquo;onglet \u00ab\u00a0Data Explorer\u00a0\u00bb dans la colonne de gauche. Puis clic droit sur \u00ab\u00a0Data Sources\u00a0\u00bb et \u00ab\u00a0New Data Source\u00a0\u00bb plusieurs choix s&rsquo;offrent \u00e0 vous.<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2450\" rel=\"attachment wp-att-2450\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2450\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/3_DataSource.png\" alt=\"\" width=\"343\" height=\"303\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/3_DataSource.png 536w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/3_DataSource-300x265.png 300w\" sizes=\"auto, (max-width: 343px) 85vw, 343px\" \/><\/a>Ici pour une question de simplicit\u00e9 j&rsquo;ai choisi d&rsquo;utiliser \u00ab\u00a0JDBC Data Source\u00a0\u00bb, ajoutez y les param\u00e8tres de connexion \u00e0 votre base de donn\u00e9es. Ensuite cr\u00e9ez un Data Set qui va vous permettre de r\u00e9cup\u00e9rer le pr\u00e9cieux s\u00e9same (vos donn\u00e9es).<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2451\" rel=\"attachment wp-att-2451\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2451\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/4-DataSet.png\" alt=\"\" width=\"547\" height=\"343\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/4-DataSet.png 782w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/4-DataSet-300x188.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/4-DataSet-768x481.png 768w\" sizes=\"auto, (max-width: 547px) 85vw, 547px\" \/><\/a>La clause where pr\u00e9sente va ajouter un param dans \u00ab\u00a0Parameters\u00a0\u00bb<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2452\" rel=\"attachment wp-att-2452\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2452\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/5-Parameters.png\" alt=\"\" width=\"577\" height=\"148\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/5-Parameters.png 1019w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/5-Parameters-300x77.png 300w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/5-Parameters-768x197.png 768w\" sizes=\"auto, (max-width: 577px) 85vw, 577px\" \/><\/a><\/p>\n<p>Si vous voulez que la g\u00e9n\u00e9ration de votre fichier pdf prenne en compte un param\u00e8tre pass\u00e9 dans la barre de recherche \u00e9ditez simplement la ligne en activant \u00ab\u00a0Linked To Report Parameter\u00a0\u00bb comme ceci :<\/p>\n<p><a href=\"http:\/\/www.unicoda.com\/?attachment_id=2453\" rel=\"attachment wp-att-2453\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2453\" src=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/6-LinkedtoReportParam.png\" alt=\"\" width=\"325\" height=\"247\" srcset=\"https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/6-LinkedtoReportParam.png 596w, https:\/\/www.unicoda.com\/wp-content\/uploads\/2017\/01\/6-LinkedtoReportParam-300x229.png 300w\" sizes=\"auto, (max-width: 325px) 85vw, 325px\" \/><\/a>Voil\u00e0 vous \u00eates fin pr\u00eat \u00e0 g\u00e9n\u00e9rer votre fichier pdf, il suffit d&rsquo;ajouter un bouton pointant sur la bonne URL avec les bons param\u00e8tres !<\/p>\n<h6 style=\"text-align: justify;\">En conclusion<\/h6>\n<p style=\"text-align: justify;\">Les deux grandes difficult\u00e9s que j&rsquo;ai pu rencontrer lors de la mise en place de la g\u00e9n\u00e9ration automatique de PDF \u00e0 l&rsquo;aide de BIRT a \u00e9t\u00e9 la vieillesse des r\u00e9sultats retourn\u00e9s par les moteurs de recherches. L&rsquo;\u00e2ge du projet BIRT en est la cause (de 2005 \u00e0 maintenant). La deuxi\u00e8me difficult\u00e9 a \u00e9t\u00e9 de comprendre que le .rptdesign est obligatoire pour g\u00e9n\u00e9rer un pdf m\u00eame si nous voulons le g\u00e9n\u00e9rer de mani\u00e8re programmatique. Un dernier point noir est la difficult\u00e9 de trouver une documentation BIRT digne de ce nom.<\/p>\n<p style=\"text-align: justify;\">L&rsquo;opinion neutre est que l&rsquo;utilisation du BIRT report designer par un informaticien n&rsquo;est pas la chose la plus ancr\u00e9e dans ses g\u00eanes bien que vous ayez des tonnes de param\u00e8tres tr\u00e8s proches du HTML\/CSS on est dans notre droit de demander si ils n&rsquo;auraient pas pu int\u00e9grer directement les m\u00eames balises dans les .rptdesign au lieu de faire \u00e0 leur sauce et nous obliger \u00e0 utiliser le designer.<\/p>\n<p style=\"text-align: justify;\">Les points positifs sont la facilit\u00e9 \u00e0 post\u00e9riori (une fois la technologie dompt\u00e9e) de g\u00e9n\u00e9rer un fichier pdf par simple clic dans notre application avec les donn\u00e9es directement trouv\u00e9es dans notre base de donn\u00e9es.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;avais utiliser FPDF en PHP pour la g\u00e9n\u00e9ration de facture automatique en stage de fin d&rsquo;IUT et j&rsquo;avais trouv\u00e9 l&rsquo;utilisation \/ int\u00e9gration dans ne application existante tr\u00e8s facile. Dans le cas de FPDF toute la g\u00e9n\u00e9ration est programm\u00e9e en PHP un vrai plus si vous \u00eates d\u00e9velopper et que la t\u00e2che \u00e0 r\u00e9aliser est bien d\u00e9finie et ne changera pas tous les 10 du mois. A l&rsquo;inverse, mon utilisation de BIRT me laisse porter \u00e0 croire que son utilisation au sein d&rsquo;une moyenne ou grande entreprise est fort appr\u00e9ciable, avec quand m\u00eame dans l&rsquo;obligation de maitriser correctement le BIRT report designer et ses nuances ! Un petit avantage aussi pour la modification d&rsquo;un design d\u00e9j\u00e0 existant, vous voulez ajouter une image ? Importer la dans le designer et glisser la \u00e0 l&rsquo;endroit souhait\u00e9 (Quid par contre de la mise en page qu&rsquo;il faudra revoir mais au moins ici vous avez un retour visuel direct).<\/p>\n<p style=\"text-align: justify;\">Code source inspir\u00e9 de : <a href=\"https:\/\/wiki.eclipse.org\/Servlet_Example_(BIRT)_2.1\">Wiki officiel BIRT servlet<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avant-propos Cet article va pr\u00e9senter une technologie compl\u00e9mentaire (BIRT) utilis\u00e9e dans le cadre d&rsquo;un projet de gestion de cours en ligne fait en TP de Java \u00e0 l&rsquo;UTBM. BIRT (The Business Intelligence and Reporting Tool) est un projet de la communaut\u00e9 Eclipse comprenant un g\u00e9n\u00e9rateur de rapports, un g\u00e9n\u00e9rateur de graphique ainsi qu&rsquo;un environnement de &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=2444\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;G\u00e9n\u00e9rer un fichier PDF sur clic dans une servlet avec BIRT &#8211; Maven &#8211; Netbeans&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[40],"tags":[],"class_list":["post-2444","post","type-post","status-publish","format-standard","hentry","category-info"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2444"}],"version-history":[{"count":7,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2444\/revisions"}],"predecessor-version":[{"id":2458,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2444\/revisions\/2458"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}