View Javadoc
1   /*
2    * Copyright (c) 2002-2020, City of Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.plugins.jasper.service.export;
35  
36  import java.io.File;
37  
38  import javax.servlet.http.HttpServletRequest;
39  
40  import fr.paris.lutece.plugins.jasper.service.JasperFileLinkService;
41  import fr.paris.lutece.portal.service.util.AppPathService;
42  import fr.paris.lutece.portal.service.util.AppPropertiesService;
43  import net.sf.jasperreports.engine.JRException;
44  import net.sf.jasperreports.engine.JasperPrint;
45  import net.sf.jasperreports.engine.export.FileHtmlResourceHandler;
46  import net.sf.jasperreports.engine.export.HtmlExporter;
47  import net.sf.jasperreports.engine.export.HtmlResourceHandler;
48  import net.sf.jasperreports.export.SimpleExporterInput;
49  import net.sf.jasperreports.export.SimpleHtmlExporterOutput;
50  import net.sf.jasperreports.export.SimpleHtmlReportConfiguration;
51  import net.sf.jasperreports.export.type.HtmlSizeUnitEnum;
52  
53  /**
54   * This class generate a Jasper report in HTML format
55   *
56   */
57  public class HtmlJasperRender extends AbstractDefaultJasperRender
58  {
59      private static final String FILE_TYPE = "html";
60      private static final String SRC_TAG_IMAGE_PATH_PREFIX = "plugins/jasper/images/";
61      private static final String SRC_TAG_IMAGE_PATH_SUFFIX = "{0}";
62  
63      /**
64       * {@inheritDoc }
65       */
66      @Override
67      public String getLink( String strReportId )
68      {
69          return null;
70      }
71  
72      /**
73       * Deletes the folder containing the images
74       * 
75       * @param imageFolder
76       *            the directory
77       */
78      public static void delete( File imageFolder )
79      {
80          if ( imageFolder.exists( ) )
81          {
82              File [ ] listFiles = imageFolder.listFiles( );
83  
84              for ( int i = 0; i < listFiles.length; i++ )
85              {
86                  File file = listFiles [i];
87  
88                  if ( file.isDirectory( ) )
89                  {
90                      delete( file );
91                  }
92  
93                  file.delete( );
94              }
95          }
96      }
97  
98      /**
99       * {@inheritDoc }
100      */
101     @Override
102     public String getFileType( )
103     {
104         return FILE_TYPE;
105     }
106 
107     /**
108      * {@inheritDoc }
109      */
110     @Override
111     protected byte [ ] getData( HttpServletRequest request, fr.paris.lutece.plugins.jasper.business.JasperReport report, JasperPrint jasperPrint )
112             throws JRException
113     {
114 
115         HtmlExporter exporter = new HtmlExporter( );
116         StringBuffer sb = new StringBuffer( );
117 
118         SimpleHtmlReportConfiguration configuration = new SimpleHtmlReportConfiguration( );
119         configuration.setWhitePageBackground( false );
120         configuration.setSizeUnit( HtmlSizeUnitEnum.PIXEL );
121         exporter.setConfiguration( configuration );
122 
123         // Save image Map to file system
124         String strImageFolderPath = AppPropertiesService.getProperty( PROPERTY_IMAGES_FILES_PATH );
125         String strAbsoluteImagePath = new StringBuffer( AppPathService.getWebAppPath( ) ).append( strImageFolderPath ).append( report.getUrl( ) )
126                 .append( PATH_SEPARATOR ).append( JasperFileLinkService.INSTANCE.getKey( request ) ).toString( );
127         File imageFolder = new File( strAbsoluteImagePath );
128 
129         if ( !imageFolder.exists( ) )
130         {
131             imageFolder.mkdirs( );
132         }
133 
134         exporter.setExporterInput( new SimpleExporterInput( jasperPrint ) );
135 
136         SimpleHtmlExporterOutput exporterOutput = new SimpleHtmlExporterOutput( sb );
137         HtmlResourceHandler imageHandler = new FileHtmlResourceHandler( imageFolder,
138                 new StringBuffer( SRC_TAG_IMAGE_PATH_PREFIX ).append( report.getUrl( ) ).append( PATH_SEPARATOR )
139                         .append( JasperFileLinkService.INSTANCE.getKey( request ) ).append( PATH_SEPARATOR ).append( SRC_TAG_IMAGE_PATH_SUFFIX ).toString( ) );
140         exporterOutput.setImageHandler( imageHandler );
141         exporter.setExporterOutput( exporterOutput );
142 
143         exporter.exportReport( );
144 
145         exporter.reset( );
146 
147         return sb.toString( ).getBytes( );
148     }
149 }