View Javadoc

1   package ecar.servlet.relatorio;
2   
3   import java.awt.Color;
4   import java.io.ByteArrayInputStream;
5   import java.io.File;
6   import java.io.FileOutputStream;
7   import java.io.IOException;
8   import java.util.ArrayList;
9   import java.util.Iterator;
10  import java.util.List;
11  
12  import javax.servlet.http.HttpServletRequest;
13  import javax.servlet.http.HttpServletResponse;
14  import javax.xml.parsers.*;
15  
16  import org.apache.poi.hslf.model.AutoShape ;
17  import org.apache.poi.hslf.model.Picture;
18  import org.apache.poi.hslf.model.ShapeTypes;
19  import org.apache.poi.hslf.model.Slide;
20  import org.apache.poi.hslf.model.TextBox;
21  import org.apache.poi.hslf.usermodel.SlideShow;
22  import org.apache.poi.hslf.usermodel.RichTextRun;
23  import org.w3c.dom.*;
24  import org.xml.sax.InputSource;
25  
26  import ecar.dao.ConfiguracaoDao;
27  import ecar.dao.EmpresaDao;
28  import ecar.pojo.ConfiguracaoCfg;
29  import ecar.pojo.EmpresaEmp;
30   
31  
32  public class MontaPPT { 
33  		
34       //public static void main(String[] args) throws IOException {
35       public void parserXMLPPT(StringBuffer xml, String caminhoImagens, HttpServletRequest request, HttpServletResponse response) throws IOException {
36  
37        // Carrega o XML
38        //File docFile = new File("/home/03017428478/Desktop/RelatorioAcompanhamento.xml");
39        InputSource docFile = new InputSource(new ByteArrayInputStream(xml.toString().getBytes()));
40               
41        // Realizando o parser do XML do relatório 
42        Document doc = null;
43         try {
44              DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
45              DocumentBuilder db = dbf.newDocumentBuilder();
46              doc = db.parse(docFile);
47        } catch (Exception e) {
48             System.out.print("Problem parsing the file.");
49        }
50       
51        // Obtendo o elemento raiz do XML
52        Element root = doc.getDocumentElement();
53        
54        // Iniciando a criação do PPT
55               
56        //Criando o arquivo PPT
57        SlideShow ppt;
58        ppt = new SlideShow();    
59           
60        // Determinando o caminho e o nome do arquivo de saída
61        String raizUpload = request.getParameter("raizUpload");
62        String caminho = raizUpload + "/relatorioPpt";
63        String nomeArquivo = "relatorioAcompanhamento.ppt";
64  	
65        if(!caminho.endsWith("/"))
66  			caminho = caminho + "/";
67  		
68        String caminhoCompleto = caminho + nomeArquivo;
69       
70        // Cria o diretorio se nao existir
71        File diretorio = new File(caminho);
72  	
73        if(!diretorio.isDirectory()) 
74  		diretorio.mkdirs();
75  	
76        FileOutputStream out = new FileOutputStream(caminhoCompleto);
77        
78                     
79        // ************** Montagem do Item ****************** //
80           
81        String nomeItem = null;
82        String coordenador = null;
83        
84        // Caso não existam itens a serem exibidos,
85        // O slide é exibido apenas com a informação de que nenhum item foi encontrado.
86        if (root.getElementsByTagName("semItens").getLength() > 0) {
87      	  Slide s = ppt.createSlide();
88      	  adicionaTitulo(request, root, s, ppt, caminhoImagens);
89      	  TextBox semItens = adicionaTextBox(s, "Nenhum item foi encontrado para os parâmetros deste relatório.", 
90      			  null, 5, 102, 600, 20, 0);
91      	  formataFonte(semItens, 14, "Arial", true, false, false, Color.blue, TextBox.AlignLeft);
92      	  adicionaRodape(root, s);
93      	  ppt.write(out);
94            exibePPT(request, response, out, caminhoCompleto);    	  
95        }
96       
97        NodeList itens = root.getElementsByTagName("item");
98              
99        ArrayList slides = new ArrayList();
100       
101       Slide s1;
102       int quantidadeSlides = 0;
103       int posicaoYQuebraSlide = 548;
104       int incrementoParaOutroParecer = 0;
105       int desceEtapas = 0;
106           
107       for (int i = 0; i < itens.getLength(); i++) {
108           Node item = itens.item(i);
109           NodeList filhosItemCorrente = item.getChildNodes();
110           Node nd = null;
111           NamedNodeMap map = item.getAttributes();
112           nd = map.getNamedItem("nomeItem");
113           
114           
115           if (!nd.getNodeValue().equals("")) {
116         	  nomeItem = nd.getNodeValue();
117           }
118                   
119           // Obtendo a tag ocorrencias do item corrente
120           // Obtendo os pareceres do item corrente
121           Node noOcorrenciaCorrente = null;
122           Node noParecerCorrente = null;
123           ArrayList pareceres = new ArrayList();
124           String nomeNo;
125           
126           for (int o = 0; o < filhosItemCorrente.getLength(); o++) {
127         	  nomeNo = filhosItemCorrente.item(o).getNodeName();
128         	  if (nomeNo.equals("ocorrencias")) {
129         		  noOcorrenciaCorrente = filhosItemCorrente.item(o);        		  
130         	  } else if (nomeNo.equals("parecer")) {
131         		  noParecerCorrente = filhosItemCorrente.item(o);
132         		  pareceres.add(noParecerCorrente);
133         		  desceEtapas++;
134         	  }
135           }
136           
137           // Se a tag item corrente tem o atributo nomeItem != "", cria-se um novo slide
138           if (!nd.getNodeValue().equals("")) {        	  
139         	   // Criando o slide
140 	          s1 = null;
141 	          incrementoParaOutroParecer = 0;
142 	          slides.add(quantidadeSlides, ppt.createSlide());
143 	          s1 = (Slide)slides.get(quantidadeSlides);
144 	          quantidadeSlides++;  
145           // Caso contrário, continuamos a escrever no mesmo slide
146           } else {  
147         	  s1 = (ppt.getSlides()[ppt.getSlides().length - 1]);        	  
148           } 
149           
150           // ************** Montagem do Título ****************** //         
151           
152           adicionaTitulo(request, root, s1, ppt, caminhoImagens);
153               
154           // ************** Montagem do Órgao ****************** //
155          
156           // Obtendo o Órgão no XML
157           String orgao = pegarAtributo(doc, "itens", "orgao");       
158         
159           // Obtendo o Responsável Técnico no XML                   
160           nd = map.getNamedItem("labelRespTecnicoIett");
161           if (!nd.getNodeValue().trim().equals("")) {
162 	          coordenador = nd.getNodeValue();
163 	          nd = map.getNamedItem("valorRespTecnicoIett");
164 	          coordenador += "" + nd.getNodeValue();
165           }
166          
167           //Texto do label DR1 - Número de Ocorrencias (label)          
168           nd = map.getNamedItem("labelDR1");
169           String labelDR1 = nd.getNodeValue() + ":";
170          
171           //Texto do valor DR1 - Número de Ocorrencias (valor)
172           nd = map.getNamedItem("valorDR1");
173           String valorDR1 = nd.getNodeValue();
174           
175           adicionaOrgao (s1, orgao, nomeItem, coordenador);
176           
177           if (valorDR1 != "") {          
178 	          //montagem do label DR1
179 	          TextBox ctLabelDR1 = adicionaTextBox(s1, labelDR1, null, 0, 156, 198, 16, 1);
180 	          ctLabelDR1.setVerticalAlignment(1);
181 	          formataFonte(ctLabelDR1, 12, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
182 	          
183 	          //montagem do valor DR1
184 	          TextBox ctValorDR1 = adicionaTextBox(s1, valorDR1, null, 160, 155, 198, 16, 1);
185 	          ctValorDR1.setVerticalAlignment(1);
186 	          formataFonte(ctValorDR1, 12, "Arial", false, false, false, Color.black, TextBox.AlignLeft);
187           }
188           
189           // ************** Pareceres (Situação) **************** //
190           
191           Iterator pareceresItem = pareceres.iterator();
192           
193           while(pareceresItem.hasNext()) { 
194           
195         	  noParecerCorrente = (Node)pareceresItem.next();
196         	  
197         	  // adicionando novo slide caso o parecer corrente não caiba no slide atual:
198               if ((174 + incrementoParaOutroParecer) >= posicaoYQuebraSlide) {
199             	  
200             	  adicionaRodape(root, s1);
201             	  
202             	  incrementoParaOutroParecer = 0;
203             	  
204             	  // criando o novo slide
205             	  s1 = ppt.createSlide();
206             	  slides.add(quantidadeSlides, s1);
207             	  quantidadeSlides++;
208             	  
209             	  // a partir daqui estamos escrevendo num novo slide            	  
210             	  adicionaTitulo(request, root, s1, ppt, caminhoImagens);
211             	  adicionaOrgao (s1, orgao, nomeItem, coordenador);
212               }
213         	                
214 	          //montagem do label situação
215 	          TextBox ctSituacao = adicionaTextBox(s1, "Situação:", null, 0, 174 + incrementoParaOutroParecer, 99, 17, 1);
216 	          ctSituacao.setVerticalAlignment (1);
217 	          formataFonte(ctSituacao, 12, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
218 	
219 	          //Texto da situação
220 	          String situacao = noParecerCorrente.getAttributes().getNamedItem("situacaoParecer").getNodeValue().toString();
221 	          //Deve-se remover as quebras de linha das strings exibidas para que não percam a formatação de fonte.
222 	          situacao = situacao.replace("\n", " ");
223 	          
224 	          //montagem do valor Situação
225 	          TextBox ctValorSituacao = adicionaTextBox(s1, situacao, null, 58, 174 + incrementoParaOutroParecer, 99, 17, 1);
226 	          ctValorSituacao.setVerticalAlignment(1);
227 	          formataFonte(ctValorSituacao, 12, "Arial", false, false, false, Color.black, TextBox.AlignLeft);
228 	         
229 	          String pathImagemParecer = "";
230 	          //imagem da situação
231 	          try {
232 		          pathImagemParecer = noParecerCorrente.getAttributes().getNamedItem("caminhoImagem").getNodeValue().toString();
233 		          int beginIndex = pathImagemParecer.lastIndexOf("/");
234 		          pathImagemParecer = caminhoImagens + pathImagemParecer.substring(beginIndex, pathImagemParecer.length());
235 		          int idImagemParecer = ppt.addPicture(new File(pathImagemParecer), Picture.PNG);
236 		          Picture imagemParecer = new Picture(idImagemParecer);
237 		          imagemParecer.setAnchor(new java.awt.Rectangle(12, 190 + incrementoParaOutroParecer, 21,21));          
238 		          s1.addShape(imagemParecer);
239 	          } catch (Exception e) {
240 	        	  System.out.println("Imagem não econtrada:" + pathImagemParecer);
241 	          }
242 	         
243 	          //Texto do Label Parecer
244 	          String labelParecer = noParecerCorrente.getAttributes().getNamedItem("labelParecer").getNodeValue().toString()
245 	          						+ noParecerCorrente.getAttributes().getNamedItem("dataUltParecer").getNodeValue().toString() + ":";
246 	         
247 	          //montagem do labelParecer
248 	          TextBox ctLabelParecer = adicionaTextBox(s1, labelParecer, null, 48, 193 + incrementoParaOutroParecer, 330, 16, 1);
249 	          ctLabelParecer.setVerticalAlignment(1);
250 	          formataFonte(ctLabelParecer, 12, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
251 	
252 	          //Descrição do parecer          
253 	          String descricaoParecer = noParecerCorrente.getAttributes().getNamedItem("descricao").getNodeValue().toString();
254 	          //Deve-se remover as quebras de linha das strings exibidas para que não percam a formatação de fonte.
255 	          descricaoParecer = descricaoParecer.replace("\n", " ");
256 	         
257 	          //montagem do labelParecer	          
258 	          TextBox ctDescricaoParecer = adicionaTextBox(s1, descricaoParecer, null, 0, 214 + incrementoParaOutroParecer, 390, 36, 1);	          	          
259 	          formataFonte(ctDescricaoParecer, 10, "Arial", false, false, false, Color.black, TextBox.AlignLeft);
260 	         
261 	          //montagem do label observações
262 	          TextBox ctLabelObservacoes = adicionaTextBox(s1, "Observações:", null, 0, 235 + incrementoParaOutroParecer, 99, 17, 1);
263 	          ctLabelObservacoes.setVerticalAlignment (1);
264 	          formataFonte(ctLabelObservacoes, 12, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
265 	         
266 	          //observações          
267 	          String observacoes = noParecerCorrente.getAttributes().getNamedItem("observacoes").getNodeValue().toString();
268 	          //Deve-se remover as quebras de linha das strings exibidas para que não percam a formatação de fonte.
269 	          observacoes = observacoes.replace("\n", " ");
270 	         
271 	          //montagem do textbox de observacoes
272 	          TextBox ctObservacoes = adicionaTextBox(s1, observacoes, null, 0, 250 + incrementoParaOutroParecer, 390, 36, 1);
273 	          ctObservacoes.setVerticalAlignment(0);
274 	          formataFonte(ctObservacoes, 12, "Arial", false, false, false, Color.black, TextBox.AlignLeft);
275           
276 	          incrementoParaOutroParecer = incrementoParaOutroParecer + 100;
277           }
278 	          
279           //************** Lado Direito - tag labelFuncao *************************//
280          
281           //Texto do label Função
282           if (noOcorrenciaCorrente != null) {
283 	          String labelFuncao = noOcorrenciaCorrente.getAttributes().getNamedItem("labelFuncao").getNodeValue().toString();
284 	
285 	          //Montagem do label Função
286 	          TextBox ctLabelFuncao = adicionaTextBox(s1, labelFuncao, null, 397, 156, 198, 16, 1);
287 	          ctLabelFuncao.setVerticalAlignment(1);
288 	          formataFonte(ctLabelFuncao, 12, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
289 	        
290 	          //Preenchimento da função
291 	          TextBox ctCabecalhoFuncao = adicionaTextBox(s1, "Data", Color.LIGHT_GRAY, 396, 173, 70, 14, 1);
292 	          ctCabecalhoFuncao.setVerticalAlignment (1);
293 	          formataFonte(ctCabecalhoFuncao, 8, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
294 	         
295 	          TextBox ctCabecalhoFuncao2 = adicionaTextBox(s1, "Descrição", Color.LIGHT_GRAY, 456, 173, 333, 14, 1);
296 	          ctCabecalhoFuncao2.setVerticalAlignment(1);
297 	          formataFonte(ctCabecalhoFuncao2, 8, "Arial", true, false, false, Color.black, TextBox.AlignLeft);
298 	          
299 	          // tag ocorrencia         
300 	                          
301 	          NodeList ocorrenciaNodeList = noOcorrenciaCorrente.getChildNodes();
302 	                    
303 	          int posicaoYOcorrencia = 187;
304 	          
305 	          for (int o = 0; o < ocorrenciaNodeList.getLength(); o++) {
306 	              Node ocorrenciaNode = ocorrenciaNodeList.item(o);
307 	             
308 	              NamedNodeMap mapOcorrencia = ocorrenciaNode.getAttributes();
309 	              
310 	              if (mapOcorrencia != null) {
311 	            	  Node ndOcorrenciaData = mapOcorrencia.getNamedItem("data");              
312 		              Node ndOcorrenciaDescricao = mapOcorrencia.getNamedItem("descricao");
313 		              String dataOcorrencia = ndOcorrenciaData.getNodeValue();
314 		              String descricaoOcorrencia = ndOcorrenciaDescricao.getNodeValue();		            
315 		              //Deve-se remover as quebras de linha das strings exibidas para que não percam a formatação de fonte.
316 		              descricaoOcorrencia = descricaoOcorrencia.replace("\n", " ");
317 		              
318 		              // Caixa de texto de cada "ocorrencia" - Data
319 		              TextBox ctOcorrenciaData = adicionaTextBox(s1, dataOcorrencia, null, 396, posicaoYOcorrencia, 70, 12, 1);
320 		              ctOcorrenciaData.setVerticalAlignment(1);
321 		              formataFonte(ctOcorrenciaData, 10, "Arial", false, false, false, Color.BLACK, TextBox.AlignLeft);
322 		                            
323 		              // Caixa de texto de cada "ocorrencia" - Descrição
324 		              TextBox ctOcorrenciaDescricao = adicionaTextBox(s1, descricaoOcorrencia, null, 456, posicaoYOcorrencia, 333, 12, 1);
325 		              ctOcorrenciaDescricao.setVerticalAlignment(1);
326 		              formataFonte(ctOcorrenciaDescricao, 10, "Arial", false, false, false, Color.BLACK, TextBox.AlignLeft);
327 		             
328 		              posicaoYOcorrencia = posicaoYOcorrencia + new Double(ctOcorrenciaData.getAnchor().getHeight()).intValue();
329 	              }
330 	          }
331 	          
332 	          // Caso exista um outro slide com Diário de Bordo, resetamos a posicaoYOcorrencia 
333 	          posicaoYOcorrencia = 187;
334       		}
335          
336           // ************ ETAPAS *************** //
337           
338           // tag etapas
339           int posicaoYEtapas = 320;
340           
341           // caso tenhamos mais de 1 parecer, devemos deslocar as etapas para baixo:
342           // (4 é a quantidade máxima de pareceres que cabem em um slide)
343           if (pareceres.size() > 1 && pareceres.size() <= 4) {          
344         	  posicaoYEtapas = posicaoYEtapas + (pareceres.size() * 58);        	  
345           } else if (desceEtapas > 0) {
346         	  posicaoYEtapas = posicaoYEtapas + (desceEtapas * 58);
347         	  desceEtapas = 0;
348           }
349                               
350           int espacoEntreTextBox = 20;
351           Color corColuna = new Color(238,233,233); // cinza clarinho  
352           NodeList etapasNodeList = root.getElementsByTagName("etapas");          
353           NodeList etapaNodeList = root.getElementsByTagName("etapa");
354                     
355           for (int x = 0; (etapaNodeList.getLength() > 0) && (x < etapasNodeList.getLength()); x++) {
356               
357         	  Node etapasNode = etapasNodeList.item(x);
358              
359               NamedNodeMap mapEtapas = etapasNode.getAttributes();
360               
361               if (mapEtapas != null && (etapasNode.getParentNode().equals(item) )) {
362 	              Node ndEtapas = mapEtapas.getNamedItem("labelFuncao");
363 	              String nomeEtapa = ndEtapas.getNodeValue();
364 	              
365 	              // adicionando novo slide caso as Etapas não caibam no slide atual:
366 	              if (posicaoYEtapas >= posicaoYQuebraSlide) {
367 	            	  
368 	            	  adicionaRodape(root, s1);
369 	            	  
370 	            	  // resetando a posicaoYEtapas para ser utlizada no próximo slide
371 	            	  posicaoYEtapas = 174;
372 	            	  
373 	            	  // criando novo slide
374 	            	  s1 = ppt.createSlide();
375 	            	  slides.add(quantidadeSlides, s1);
376 	            	  quantidadeSlides++;
377 	            	  
378 	            	  // a partir de agora escrevemos em outro slide
379 	            	  adicionaTitulo(request, root, s1, ppt, caminhoImagens);
380 	            	  adicionaOrgao (s1, orgao, nomeItem, coordenador);
381 	              }
382 	              	             
383 	              // Caixa de texto do Label "Etapas:"
384 	              TextBox ctNomeEtapa = adicionaTextBox(s1, nomeEtapa, null, 3, posicaoYEtapas, 403, 15, 1);
385 	              ctNomeEtapa.setVerticalAlignment(1);
386 	              formataFonte(ctNomeEtapa, 12, "Arial", true, false, false, Color.BLACK, TextBox.AlignLeft);
387 	              posicaoYEtapas = posicaoYEtapas + espacoEntreTextBox;
388 	              
389 	              // tag etapa    
390 	              for (int p = 0; p < etapaNodeList.getLength(); p++) {
391 	            	  
392 	                  Node etapaNode = etapaNodeList.item(p);             
393 	                  NamedNodeMap mapEtapa = etapaNode.getAttributes();
394 	                  
395 	                  // dentre as tags etapa do xml, queremos apenas as que são filhas do nó
396 	                  // etapas corrente:
397 	                  if (mapEtapa != null && etapaNode.getParentNode().equals(etapasNode)) {	                	  
398 	                  	                  
399 		                  Node ndEtapa = mapEtapa.getNamedItem("nomeEtapa");
400 		                  String nomeEtapas = ndEtapa.getNodeValue();
401 		                 
402 		                  // Caixa de texto do Nome da Etapa
403 		                  TextBox ctNomeEtapas = adicionaTextBox(s1, nomeEtapas, null, 3, posicaoYEtapas, 403, 15, 1);
404 		                  ctNomeEtapas.setVerticalAlignment(1);
405 		                  formataFonte(ctNomeEtapas, 12, "Arial", true, false, false, Color.BLACK, TextBox.AlignLeft);
406 		                  posicaoYEtapas = posicaoYEtapas + (espacoEntreTextBox - 6);
407 		                  
408 		                  // tag etapasColuna          
409 		                  NodeList etapasColunaNodeList = etapaNode.getChildNodes();
410 		                  String nomeEtapasColuna = "";                  
411 		                  ArrayList linhasValor = new ArrayList();
412 		                  String valor = "";
413 		              
414 		                  for (int q = 0; q < etapasColunaNodeList.getLength(); q++) {                  
415 		                	  
416 		                	  Node etapasColunaNode = etapasColunaNodeList.item(q);
417 		                	  
418 		                	  valor = "";
419 		                	                	  
420 		                	  if (etapasColunaNode.getNodeName().equals("etapasColuna")) {
421 		    	                  NamedNodeMap mapEtapasColuna = etapasColunaNode.getAttributes();
422 		    	                  Node ndEtapasColuna = mapEtapasColuna.getNamedItem("label");
423 		    	                  nomeEtapasColuna = nomeEtapasColuna + 
424 		    	                  						ndEtapasColuna.getNodeValue() + "\t ";
425 		    	                  
426 		                	  } else if (etapasColunaNode.getNodeName().equals("itemEtapa")) {
427 		                		  
428 		                		  NodeList estapasValorNodeList = etapasColunaNode.getChildNodes();              		                		  
429 		                		                 		  
430 		                		  for (int s = 0; s < estapasValorNodeList.getLength(); s++) {		                			  
431 		                			  Node noEtapaValor = estapasValorNodeList.item(s);
432 		                			  NamedNodeMap mapEtapaValores = noEtapaValor.getAttributes();		                			  
433 		                			  if (mapEtapaValores != null){
434 		                				  Node ndEtapasValor = mapEtapaValores.getNamedItem("valor");
435 		            	                  valor = valor + ndEtapasValor.getNodeValue().replace("\n", "") + "\t ";                				   
436 		                			  }
437 		                		  }
438 		                		  
439 		                		  linhasValor.add(valor);		                		  
440 		                	  }  
441 		                  }                 
442 		                
443 		                  // Caixa de texto com Labels de coluna da Etapa
444 		                  TextBox ctEtapasColuna = adicionaTextBox(s1, nomeEtapasColuna, Color.LIGHT_GRAY, 5, posicaoYEtapas, 783, 15, 1);
445 		                  ctEtapasColuna.setVerticalAlignment(1);
446 		                  formataFonte(ctEtapasColuna, 8, "Arial", true, false, false, Color.BLACK, TextBox.AlignLeft);
447 		                  posicaoYEtapas = posicaoYEtapas + new Double(ctEtapasColuna.getAnchor().getHeight()).intValue();
448 		                  
449 		                  // Adiciona as linhas com valores das etapas:
450 		                  for (int posi = 0; posi < linhasValor.size(); posi++) {
451 		                	  
452 		                	  // Determinando a cor da linha atual (pode ser cinzinha claro ou branco)
453 		                	  corColuna = new Color(238,233,233);
454 		                	  if (posi % 2 != 0) corColuna = null;
455 		                	  
456 		                	  // adicionando novo slide caso a linha de valor da etapa não caiba no slide atual:
457 			                  if (posicaoYEtapas >= posicaoYQuebraSlide) {
458 			                	  
459 			                	  adicionaRodape(root, s1);
460 			                	  
461 			                	  // resetando a posicaoYEtapas para o outro slide 
462 			                	  posicaoYEtapas = 174;
463 			                	  
464 			                	  // criando o novo slide
465 			                	  s1 = ppt.createSlide();
466 			                	  slides.add(quantidadeSlides, s1);
467 			                	  quantidadeSlides++;
468 			                	  
469 			                	  // a partir de agora estamos escrevendo no novo slide
470 			                	  adicionaTitulo(request, root, s1, ppt, caminhoImagens);
471 			                	  adicionaOrgao (s1, orgao, nomeItem, coordenador);
472 			                  }
473 		            		                  	  
474 		                	  TextBox ctColunasValor = adicionaTextBox(s1, linhasValor.get(posi).toString(), corColuna, 5, posicaoYEtapas, 783, 12, 1);
475 		                      ctColunasValor.setVerticalAlignment(1);
476 		                      formataFonte(ctColunasValor, 9, "Arial", false, false, false, Color.BLACK, TextBox.AlignLeft);
477 		                      posicaoYEtapas = posicaoYEtapas + new Double(ctColunasValor.getAnchor().getHeight()).intValue();
478 		                      valor = "";                      
479 		                  }
480 		                  
481 		                  // espaço entre linhas do conteúdo de cada etapa (linhas brancas e cinzinha claro);
482 		                  // 5 = altura de cada linha dessas.
483 		                  posicaoYEtapas = posicaoYEtapas + 5;
484 		                  linhasValor.clear();
485 		                  
486 		              }
487 	              }
488               }                                 
489                            
490           }          
491          
492           adicionaRodape(root, s1);
493       }
494                       
495       ppt.write(out);
496       exibePPT(request, response, out, caminhoCompleto);
497        
498     }
499      
500 	// Método para formatar a fonte do texto de um TextBox
501 	public static void formataFonte(TextBox ct, int tamanho, String nome, 
502 							 boolean ehNegrito, boolean ehItalico,
503 							 boolean ehSublinhado, Color cor, int alinhamento) {
504 	    	      	  
505 		  RichTextRun rt = ct.getTextRun().getRichTextRuns()[0];
506 		  rt.setFontSize(tamanho);
507 		  rt.setFontName(nome);
508 		  rt.setBold(ehNegrito);
509 		  rt.setItalic(ehItalico);
510 		  rt.setUnderlined(ehSublinhado);
511 		  rt.setFontColor(cor);
512 		  rt.setAlignment(alinhamento);
513 		      	  	  
514 	}
515      
516     // Método que adiciona um TextBox em um Slide
517     public static TextBox adicionaTextBox(Slide s1, String texto, Color cor, int posicaoX, 
518     								   int posicaoY, int largura, int altura, int formato) {
519     	TextBox ct = new TextBox();           
520         ct.setText(texto);
521         ct.setShapeType(formato);
522         ct.setMarginBottom(0);
523         ct.setMarginTop(0);
524         ct.setAnchor(new java.awt.Rectangle(posicaoX, posicaoY, largura, altura));
525         if (cor != null) ct.setFillColor(cor);
526         s1.addShape(ct); 
527         
528         return ct;
529     }
530     
531     // Método que adiciona uma Linha em um Slide
532     public static void adicionaLinha (Slide s, int posicaoX, int posicaoY, int largura, 
533     								  int altura,Color cor) {
534     	
535         AutoShape sh = new AutoShape(ShapeTypes.Line);
536         sh.setAnchor(new java.awt.Rectangle(posicaoX, posicaoY, largura, altura));           
537         sh.setLineColor(cor);            
538         s.addShape(sh);
539     	
540     }
541    
542     // Método que retorna o atributo desejado do nó
543     public static String pegarAtributo(Document xml, String noh, String atributo) {
544         String valorAtributo = null;
545         // Obtendo o elemento raiz do XML
546         Element root = xml.getDocumentElement();
547         valorAtributo = root.getElementsByTagName(noh).item(0).getAttributes().getNamedItem(atributo).getNodeValue();
548        
549         return valorAtributo;
550     }
551             
552     // Método que adiciona o Rodapé a um Slide
553     public static void adicionaRodape(Element root, Slide s1) {
554     
555 	    // Obtendo o Rodape no XML
556 	    String rodape = root.getAttributeNode("rodape").getNodeValue();
557 	                  
558 	    // Adicionado o TextBox do Rodapé
559 	    TextBox ctRodape = adicionaTextBox(s1, rodape, null, 4, 590, 400, 15, 1);
560 	    ctRodape.setVerticalAlignment(1);
561 	    formataFonte(ctRodape, 10, "Arial", false, false, false, Color.BLACK, TextBox.AlignLeft);
562 	    
563     }
564     
565     // Método que adiciona o Título a um Slide
566     public static void adicionaTitulo(HttpServletRequest request, Element root, Slide s1, SlideShow ppt, String caminhoImagens) {
567     	
568     	try {
569     		
570     		ConfiguracaoDao configDao = new ConfiguracaoDao(request);
571 			ConfiguracaoCfg config = configDao.getConfiguracao();;
572 			String pathRaiz = config.getRaizUpload();
573 			EmpresaDao empresaDao = new EmpresaDao(request);
574 			List confg = empresaDao.listar(EmpresaEmp.class, null);
575 			EmpresaEmp empresa = new EmpresaEmp();
576 			if(confg != null && confg.size() > 0){
577 				empresa = (EmpresaEmp) confg.iterator().next();
578 			}
579     		
580     		try {
581 
582     			// Inserindo a imagem do cabeçalho do PPT
583 		        int idx = ppt.addPicture(new File(pathRaiz + empresa.getLogotipoRelatorioEmp()), Picture.PNG);
584 		        Picture pict = new Picture(idx);
585 		        pict.setAnchor(new java.awt.Rectangle(0, 0, 790,69));           
586 		        s1.addShape(pict);
587     		} catch (Exception e) {
588 				System.out.println("Imagem não econtrada: "+ pathRaiz + empresa.getLogotipoRelatorioEmp());
589 			}
590 	    	
591 	    	// Obtendo o título do PPT no XML (root.getAttribute("mesReferencia"))
592 	        String titulo = "Relatório de Acompanhamento - " + root.getAttribute("mesReferencia");
593 	      
594 	        // Caixa de texto do Título do Relatório
595 	        TextBox ctTitulo = adicionaTextBox(s1, titulo, null, 0, 78, 468, 24, 0);
596 	        formataFonte(ctTitulo, 14, "Arial", false, false, false, Color.black, TextBox.AlignLeft);
597 	             
598 	        // Obtendo o modelo no XML
599 	        String codModelo = root.getAttribute("codModelo");
600 	      
601 	        // Caixa de texto do Modelo do Relatório     
602 	        TextBox ctModelo = adicionaTextBox(s1, codModelo.toString(), null, 425, 82, 340, 18, 0);
603 	        formataFonte(ctModelo, 9, "Arial", true, false, false, Color.black, TextBox.AlignRight);
604 	       
605 	        // Linha do Título do Relatório
606 	        adicionaLinha(s1, 0, 100, 790, 0, Color.LIGHT_GRAY);
607     	
608     	} catch (Exception e) {
609     		
610     	}
611     }
612     
613     // Método que adiciona as informações sobre o Órgão e Coordenador
614     public static void adicionaOrgao (Slide s1, String orgao, String nomeItem, String coordenador) {
615 
616     	Color corOrgao = new Color(0,0,139);
617     	
618         // Caixa de texto do Órgao
619         TextBox ctOrgao = adicionaTextBox(s1, orgao, null, 0, 102, 519, 20, 0);
620         formataFonte(ctOrgao, 12, "Arial", true, false, false, corOrgao, TextBox.AlignLeft);
621       
622         TextBox ctItem = adicionaTextBox(s1, nomeItem, Color.LIGHT_GRAY, 5, 122, 390, 30, 1);
623         ctItem.setVerticalAlignment(1);
624         formataFonte(ctItem, 12, "Arial", false, false, false, corOrgao, TextBox.AlignLeft);
625       
626         //Caixa de texto do coordenador         
627         TextBox ctCoordenador = adicionaTextBox(s1, coordenador, Color.LIGHT_GRAY, 396, 122, 392, 30, 1);
628         ctCoordenador.setVerticalAlignment(1);
629         formataFonte(ctCoordenador, 8, "Arial", false, false, false, corOrgao, TextBox.AlignLeft);      
630         
631     }
632     
633     // Método responsável pelo download do Powerpoint na tela do cliente
634     public static void exibePPT (HttpServletRequest request, HttpServletResponse response, 
635     							 FileOutputStream out, String caminho) {
636     	   
637     	try {
638     	
639 	    	response.setHeader("Content-Disposition","inline");
640 	        response.setContentType("application/ppt");        
641 	        response.sendRedirect(request.getContextPath() + "/DownloadFile?RemoteFile=" + caminho);
642         	    	
643         } catch (Exception e) {
644         	System.out.println("Ocorreu um erro na exibição do Powerpoint.");
645         }
646     }
647 }
648 
649