[Resolvido]Visualizar Relatório iReport via Servlet chamada pelo Flex

5 respostas
Ivan_Alves

Alguém ai saberia como visualizar meu relátorio .pdf através da Servlet chamada do Flex?

Estava tentando tentando uma biblioteca do flex para visualizar chamada adobe xViewer até então tudo certo só que precisei colocar uma imagem no relatório e percebi que o esse biblioteca não tem suporte a esse componente do iReport então baixei outra biblioteca de visualização para o Flex chamada JasperReports Flash Viewer 4.0.0 porém também não consigui visualizar, agora quero apenas passar a tarefa para o Browser para ele mostrar o pdf ou baixar se não tiver suporte ao pdf, estou utilizando um exemplo de outro relatório aqui da empresa feito em JSP e Servlet. Segue código da Servlet:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		

		ServletOutputStream servletOutputStream = response.getOutputStream();
        String caminhoRelatorio = "/relatorios/report2.jasper";
        InputStream reportStream = getServletConfig().getServletContext().getResourceAsStream(caminhoRelatorio);

		JasperPrint reportPrint = null;
		String reportXML = null; //String que guardará o xml do relatório
		Connection conn = null;
		HashMap parametros = new HashMap(); //Parametos necessários ao relatório
		/* Parametro passado do java para o relatório sendo que no argumento desse método e um
		 * parametro flex passado para o java através do método "POST" 
		 */	
		
		parametros.put("PAR_ID_OS", Integer.parseInt(request.getParameter("id_os")));
               parametros.put("PAR_IMAGEM", getServletContext().getRealPath("/relatorios/imagem.jpg"));
		
		try{
			//cria a conexão com o banco de dados
			conn = ConnectionFactory.getConnection();			
                        // envia o relatório em formato PDF para o browser
                        response.setContentType("application/pdf");
                        //para gerar o relatório em PDF
                        // o método runReportToPdfStream foi usado
                        JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parametros, conn);
			
		}catch(JRException e){
			e.printStackTrace();
		}finally{
			servletOutputStream.flush();
                        servletOutputStream.close();
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
para o flex uso a chamada abaixo
<!--Serviço HTTP usando metodo POST -->
        <mx:HTTPService id="httServiceAux" method="POST" 
	 url="relatorios" 
	 
	 fault="failRequest(event)" resultFormat="e4x">
		 <mx:request>
		   <id>{numId}</id> <!-- parametro passado para a servlet-->
		 </mx:request>
	</mx:HTTPService>

        <mx:Script>
		<![CDATA[

                        import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			import mx.rpc.http.HTTPService;
			
			[Bindable]
			private var numId:Number = 5;

                        //manda requisição para servlet
                        public function gerarNovoRelatorio(numId:Number):void
			{
				this.numId = numId; //atribui código
				httServiceAux.send();
			}

                        /*
                        * Outros métodos...
                        */
                  ]]>
	</mx:Script>

Esse código executam tudo direitinho porém não mostra o relatório ele continua na mesma tela do Flex!

5 Respostas

Ivan_Alves

Recompilando o projeto agora eu está caindo no metodo failRequest(event) que me retornando o erro no Flex cujo a mensagem é a seguinte

(mx.messaging.messages::AcknowledgeMessage)#0
  body = "%PDF-1.4
%âãÏÓ
3 0 obj
<</Alternate/DeviceRGB/Length 2595/N 3/Filter/FlateDecode>>stream
x&#156;?&#150;wTT×&#135;&#1021;wz¡Í0)Cï½
 ½7©ÒDa&#152;`(34±!¢EDA&#130;"&#140;&#134;"±"&#138;&#133;&#128;`Á?  Ä`QQy3²Vtå&#24407;&#151;ßg}k&#159;½÷=}&#1466;

No java até agora executa tudo beleza!

Só preciso visualizar o relatório e ter a opção de imprimir ou fazer o download quem souber de alguma coisa avisa ai!

Ivan_Alves

Consegui resolver depois de muito pesquisa descobrir que o HTTPService recebe um dados como XML mas nesse caso eu não precisava que ele pegasse esses dados retornados da Servlet então em vez de usar HTTPService usei URLRequest ai no método que chama a servlet e todo o resto fica assim bem mais simples:

public function gerarNovoRelatorio(numId:Number):void
{
	var urlReq:URLRequest = new URLRequest("relatorioos");
	var param:URLVariables = new URLVariables();
	param.id = numId_os; //passagem de parametro
		
	urlReq.data = param; //passa parametros
	urlReq.method = "POST"; //usando método POST
	navigateToURL(urlReq, "_blank"); //chama Servlet em uma nova página
}

apesar de alguns bugs no pdf que provavelmente é pelo iReport agora ele é visualizado pelo navegador!

D

Ótimo, exatamente o que eu estava procurando e estava difícil de encontrar ‘ireport visualização do pdf com flex’. Fiz a mudança de httpservice para urlRequest e funcionou sem problemas.

Valeu ae!

J

poderia postar o projeto todo para download?

jbwesley

Ivan Alves vc poderia me ajudar ?
Estou com o mesmo problema que você teve, e até não consegui resolver.

Criado 4 de junho de 2011
Ultima resposta 24 de out. de 2012
Respostas 5
Participantes 4