View Javadoc

1   package ecar.util.jasper;
2   
3   import java.io.ByteArrayOutputStream;
4   import java.util.Map;
5   
6   import net.sf.jasperreports.engine.JREmptyDataSource;
7   import net.sf.jasperreports.engine.JRException;
8   import net.sf.jasperreports.engine.JasperExportManager;
9   import net.sf.jasperreports.engine.JasperFillManager;
10  import net.sf.jasperreports.engine.JasperPrint;
11  import net.sf.jasperreports.engine.JasperReport;
12  import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
13  import net.sf.jasperreports.engine.util.JRLoader;
14  
15  import org.apache.log4j.Logger;
16  
17  import com.lowagie.text.Document;
18  import com.lowagie.text.pdf.PdfCopy;
19  import com.lowagie.text.pdf.PdfImportedPage;
20  import com.lowagie.text.pdf.PdfReader;
21  
22  /**
23   * Classe utilitaria para geracao de relatorio
24   * @author gabrielsolana
25   * 
26   */
27  public class JasperService {
28  
29  	private static Logger logger = Logger.getLogger(JasperService.class);
30  	public static String PATH_RELATORIO = "/PPAJasper";
31  	
32  	
33  	public JasperService(){}
34  	
35  	
36  	/**
37  	 * Carrega o arquivo .jasper ( Relatorio compilado )
38  	 * @param path ( URL absoluta )  do arquivo .jasper
39  	 * @return objeto que representa o relatorio JasperReport, se erro retorna <null> 
40  	 */
41  	public static JasperReport loadReport( String pathReport ){
42  		
43  		logger.info( "Carregando arquivo de relatorio <.jasper>" );
44  		try {
45  
46  			JasperReport report = (JasperReport)JRLoader.loadObject( pathReport );
47  			logger.info( "Arquivo de relatorio <.jasper> carregado com sucesso" );
48  			return report;
49  			
50  		} catch (JRException e) {
51  			e.printStackTrace();
52  			logger.error( "<ERRO JasperReports>: Nao foi possivel carregar arquivo de relatorio <.jasper>" , e );	
53  			return null;
54  		}
55  		catch ( Exception e) {
56  			e.printStackTrace();
57  			logger.error( "<ERRO>: Nao foi possivel carregar arquivo de relatorio <.jasper>" , e );	
58  		return null;
59  	}			
60  		
61  	}
62  	
63  	/**
64  	 * Gera uma pre-impressao Jasper do objeto relatorio.
65  	 * @param relatorio objeto Jasper
66  	 * @param parametros do relatorio
67  	 * @param beanDS data Source do relatorio
68  	 * @return objeto pre-impressao Jasper
69  	 */
70  	public static JasperPrint fillReport(JasperReport relatorio, Map parametros, JRBeanCollectionDataSource beanDS ){
71  		
72  		logger.info( "Gerar objeto impressao Jasper" );
73  		try {
74  			JasperPrint print = JasperFillManager.fillReport(relatorio, parametros, beanDS );
75  			return print;
76  			
77  		} catch (JRException e) {
78  			e.printStackTrace();
79  			logger.error( "<ERRO JasperReports>: Nao foi possivel gerar impressao Jasper" , e );
80  			return null;
81  		} catch (Exception ex) {
82  				ex.printStackTrace();
83  				logger.error( "<ERRO>: Nao foi possivel gerar impressao Jasper" , ex );
84  				return null;
85  		}
86  	}
87  	
88  	/**
89  	 * Gera uma pre-impressao Jasper do objeto relatorio.
90  	 * @param relatorio objeto Jasper
91  	 * @param parametros do relatorio
92  	 * @param beanDS data Source do relatorio
93  	 * @return objeto pre-impressao Jasper
94  	 */
95  	public static JasperPrint fillReport(JasperReport relatorio, Map parametros ){
96  		
97  		logger.info( "Gerar objeto impressao Jasper" );
98  		try {
99  			
100 
101 			JasperPrint print = JasperFillManager.fillReport(relatorio, parametros, new JREmptyDataSource() );
102 			
103 			return print;
104 			
105 		} catch (JRException e) {
106 			e.printStackTrace();
107 			logger.error( "<ERRO JasperReports>: Nao foi possivel gerar impressao Jasper"  , e );
108 			return null;
109 		} catch (Exception ex) {
110 				ex.printStackTrace();
111 				logger.error( "<ERRO>: Nao foi possivel gerar impressao Jasper" , ex );
112 				return null;
113 		}
114 	}	
115 	
116 	
117 	public static Integer getNumberOfPages( JasperPrint relatorio ){
118 		return relatorio.getPages().size();		
119 	}
120 	
121 	/**
122 	 * Adiciona o relatorioOrigem ao relatorioDestino
123 	 * @param relatorioOrigem impressao Jasper que deve ser copiado
124 	 * @param relatorioDestino impressao Jasper Destino, é aqui que vai ser adicionado o outro relatorio
125 	 */
126 	public static void addRelatorio( JasperPrint relatorioOrigem, JasperPrint relatorioDestino, ByteArrayOutputStream out ){
127 		try {
128 
129 			byte[] bytesOrg  = geraRelatorioPDF(relatorioOrigem);
130 			byte[] bytesDest  = geraRelatorioPDF(relatorioDestino);
131 
132 			PdfReader readerOrg = new PdfReader(bytesOrg);
133 			int paginasOrg = readerOrg.getNumberOfPages();
134 			PdfReader readerDest = new PdfReader(bytesDest);
135 			int paginasDest = readerDest.getNumberOfPages();
136 			
137 			Document document = new Document(readerOrg.getPageSizeWithRotation(1));
138 			PdfCopy writer = new PdfCopy( document, out );
139 			
140 			document.open();
141 
142 			 PdfImportedPage page;
143              for (int i = 0; i < paginasOrg; ) {
144                  ++i;
145                  page = writer.getImportedPage(readerOrg, i);
146                  writer.addPage(page);
147              }
148 
149              for ( int j =0;j<paginasDest;){
150             	 ++j;
151             	 page = writer.getImportedPage(readerDest, j);
152                  writer.addPage(page);            	 
153              }
154 
155              document.close();
156 			
157              out.flush();
158              out.close();			
159 			
160 			
161 
162 		} catch (Exception e) {
163 			e.printStackTrace(System.out);
164 			logger.error(e);
165 		}
166 	}
167 	
168 	public static byte[] geraRelatorioPDF( JasperPrint impressaoJasper ){
169 
170 		try{		
171 			byte[] relFile = JasperExportManager.exportReportToPdf(impressaoJasper); 
172 	
173 			if(relFile.length <= 0){
174 				logger.error( "<ERRO: Relatorio vazio>: Nao foi possivel gerar relatorio no formato PDF" );				
175 				return null;
176 			}
177 			return relFile;
178 			
179 		} catch (JRException e) {
180 			e.printStackTrace();
181 			logger.error( "<ERRO JasperReports>: Nao foi possivel gerar relatorio no formato PDF" , e );
182 			return null;
183 		} catch (Exception ex) {
184 				ex.printStackTrace();
185 				logger.error( "<ERRO>: Nao foi possivel gerar relatorio no formato PDF" , ex );
186 				return null;
187 		}
188 }
189 	
190 	public static byte[] geraRelatorioPDF( JasperReport relatorio, Map parametros, JRBeanCollectionDataSource beanDS ){
191 
192 		logger.info( "Gerando relatorio em formato PDF" );
193 		try {
194 
195 			JasperPrint print = fillReport(relatorio, parametros, beanDS );
196 			byte[] relFile = geraRelatorioPDF(print);
197 
198 			if(relFile.length <= 0){
199 				logger.error( "<ERRO: Relatorio vazio>: Nao foi possivel gerar relatorio no formato PDF" );				
200 				return null;
201 			}
202 			return relFile;
203 			
204 		}  catch (Exception ex) {
205 				ex.printStackTrace();
206 				logger.error( "<ERRO>: Nao foi possivel gerar relatorio no formato PDF" , ex );
207 				return null;
208 		}
209 	}
210 	
211 }