Extjs 4 - Abrir Relatorios PDF sem gravar no servidor

3 respostas
G

Olá pessoal estou utilizando o Ext4 e Struts2 e estou tentando mostrar o pdf de um relatorio gerado no JasperReports. A aplicação até responde corretamente a requisição e me traz o pdf porém em formato de bytes (porque não gravo no servidor, envio direto para o cliente) e não estou sabendo como renderizar esses bytes para visualizar o pdf. Algumas pessoas dizer para utilizar um iframe porém não sei como passar parametros fazendo dessa maneira, por que passar por GET vai me dar problema mais cedo ou mais tarde. Em muita exemplo pela net o pessoal utiliza o uxMedia, mas não há versão para o Ext4. Alguém já implementou alguma solução para resolver isso. Afinal creio que todos q desenvolvam algum tipo de sistema tem de gerar algum PDF em algum momento :slight_smile:

Thanks, galera.

3 Respostas

S

Oi Guilherme, vc consegui resolver o seu problema?
Eu estou querendo fazer a mesma coisa o meu sistema gera arquivos docx, txt e xml, queria enviar do java(server) para ExtJS(client)…

Valeu.

G

Olá Sandro, bom eu resolvi o problema gerando e gravando o arquivo no servidor mesmo em uma pasta temporária dentro do contexto da minha aplicação, algo como /temp, então retorno um String para o Ext e mando ele abrir o arquivo naquela pasta ( /temp/meuarquivo.pdf ).

Ext.Ajax.request({ method: 'POST', scope: this, url: 'meuAction/listaPdf', success: function(response, options) { console.log( Ext.decode(response.responseText).arquivo); var j = new Ext.Window({ title : "iframe", width : 300, height: 300, layout : 'fit', items : [{ xtype : "component", autoEl : { tag : "iframe", src : Ext.decode(response.responseText).arquivo } }] }).show(); }, failure: function() { Ext_example.msg('Erro:', 'Erro ao gerar o arquivo.', './images/cancel3.png'); }, });
No caso o arquivo em:

src : Ext.decode(response.responseText).arquivo

no meu caso é um atributo String dentro da minha Action

Quais frameworks você está utilizando ae?

E

Bom dia, estou tentando gerar um relatorio através do extjs4 , porém não estou conseguindo.

Eu estou tentando fazer assim:

Ext.define('controller.administrativo.Empresa', {
    extend: 'Ext.app.Controller',
	views: [
        'administrativo.cadastros.Empresa', 'administrativo.pesquisas.Empresa'
    ],
    models: [
        'Empresa'
    ],
    stores: [
        'Empresas', 'OrgaoGestorCombo', 'ConsorcioGrupoCombo', 'EstadosCombo', 'CidadesCombo', 'StatusCombo'
    ],
    init: function() {
	this.control({
	'pesquisarEmpresa button[action=gerar_relatorio]': {
    			click: function(){
    				Ext.getCmp('formPesquisarEmpresa').getForm().submit({
    					url: '/sistema/empresa/listarTdasEmpresas',
    					params: {
    						'element.nomeFantasia' : Ext.getCmp('empresaNomeFantasiaPesquisar').getValue()
    					}
    					});
    			}
    		}

});
    }
});

E aqui está meu método para tentar gera-lo.

@ActionList
	public void listarTdasEmpresas(final ServletContext context,HttpServletRequest request,HttpServletResponse response, Empresa element){
		
		try {
		String caminhoRelatorio = context.getRealPath("/app/controller/administrativo/relatorio/empresa.jasper");
		 
		Map<String,Object> map = new HashMap<String, Object>();
		 
		List<Empresa> listaEmpresas = empresaDao.listarEmpresasPorNomeFantasia(element.getNomeFantasia());
		
		JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(listaEmpresas);  
		
		JasperPrint print = JasperFillManager.fillReport(caminhoRelatorio,map,ds);
		
		byte[] bytes = JasperExportManager.exportReportToPdf(print);  
		
		byte[] arquivo = bytes;  
		
		response.setContentType("application/octet-stream");  
		  
	    response.setHeader("Content-Disposition","attachment; filename=relatorio.pdf"); 
	        
	    ServletOutputStream sos = response.getOutputStream();  
	     
	    response.setContentLength(arquivo.length);  
	  
	    sos.write(arquivo, 0, arquivo.length);  
	  
	    sos.flush();  
	  
	    sos.close();  
		
		result.use(Results.nothing());
		
		} catch (JRException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	
	}

Bom, o problema é que gera o relatorio, mas não acontece nada na tela.

Criado 19 de janeiro de 2012
Ultima resposta 19 de mar. de 2012
Respostas 3
Participantes 3