Impressão de relatórios - Ireport

Boa noite, pessoal.

Estou fazendo um trabalho e preciso fazer um relatório com a impressão de figuras. Não quero utilizar banco de dados, apenas fazer passagem de parametros diretamente para o relatório.

A estrutura deve ser como segue:

Uma tela com a opção das escolhas das figuras (5 ao todo). O usuário poderá escolher 1, 2… ou 5).
Ou seja, digamos que ele escolha a 1, a 3 e a 4.
O relatório deverá conter 3 páginas, com uma figura por página.
Se ele escolher todas, serão 5 páginas.

Alguém tem idéia de como fazer isso? As imagens serão gif e estarão no diretório do usuário.

Você conhece iReport?

De qualquer forma, primeiro tente passar uma imagem só. Acredito eu que a melhor forma de fazer isso é usando parâmetros (envia como parâmetro o path da imagem). Aí no iReport, você tem lá a imagem e na expressão da um new File($P{pathDaPrimeiraImagem}).

Depois, sobre as páginas, você pode ver se os parâmetros são nulos. Se forem, não coloca nada e deixa em branco, pra que não saiam páginas em branco (acho que tem que marcar uma opção da band… se não me engano é “Print blank when null”).

Bom dia.

É o seguinte, existe diversas maneiras de fazer.
Vou explicar uma.

Primeiro crie o seu ireport contendo apenas a banda “detail” , adicione nela uma imagem, defina o tamanho que desejar a ela e posteriormente deixe o tamanho da banda + ou - do tamanho de uma folha A4 (Crie este tamanho para q cada figura fique em uma folha diferente!! Existe outros meios, mas este está sendo o mais rápido no momento).

Após, vá em “Visuliar” e clicke em “Campos” crie um novo campo com o nome “imagem” por exemplo e coloque o tipo de classe como “java.io.InputStream”.

Após isso entre na propriedade do elemento image que você criou

Após isso, abra a propriedade do elemento “Image” e coloque na expressão da imagem o “$F{imagem}” e na classe de expressao de imagem coloque “java.io.InputStream”, aconselho selecionar o checkBox “Cache”.

Pronto Finalizamos o Ireport.

Existe outras maneiras de se enviar as imagens para o relatório, por exemplo ao invés de utilizar InputStreamutilizar o diretorio onde se encontra a imagem, assim é só alterar o código e as expressões do relatório para “String”, mas adotei para o exemplo a utilização do InputStream,

Agora precisamos adequar o código.

Podemos criar por exemplo uma classe que conterá as imagens.

public class Fotos {
	InputStream imagem;
	
	public InputStream getImagem() {
		return imagem;
	}
	
	public void setImagem(InputStream imagem) {
		this.imagem = imagem;
	}
	
}

Certo, agora precisamos informar as imagens e demais informações necessárias para a exportação do documento.

Crie uma outra classe que será responsavel pela exportação

                // Recuperando jasper do Relatorio
		FileInputStream layoutRelatorio = new FileInputStream("c:/ColecaoFoto.jasper");
		
		// Criando colecao que conterá as imagens
		Collection <Fotos> fotosList = new ArrayList<Fotos> ();
		
		// Criando a primeira imagem
		Fotos fotos = new Fotos ();
		fotos.setImagem(new FileInputStream("c:/marte.jpg"));
		//Adicionando imagem a colecao
		fotosList.add(fotos);

		// Criando a segunda imagem
		fotos = new Fotos ();
		fotos.setImagem(new FileInputStream("c:/terra.jpg"));
		//Adicionando imagem a colecao 
		fotosList.add(fotos);
				
		//Nenhum paramentro necessario
		Map parameters = null ;
		
		// Executa exportacao para pdf
		JasperUtil.exportPdfOnBrowser(fotosList, parameters, layoutRelatorio ,"teste.pdf", response);

Espero ter ajudado.
Qualquer dúvida e se eu puder ajudar, so falar ae.

Depois posta informando se funcionou ??

Abraço.

Não consegui utilizar o JasperUtil.

[code]# // Executa exportacao para pdf

JasperUtil.exportPdfOnBrowser(fotosList, parameters, layoutRelatorio ,“teste.pdf”, response); [/code]

Não, a classe JasperUtil é uma classe que criei. Pensei q vc ja tinha alguma que faria a exportacao para o pdf.

Entao vo lhe enviar a classe.

public class JasperUtil {

public static void exportPdfOnBrowser(Collection lista, Map parameters, InputStream localJasper, String nomeRelatorio, HttpServletResponse response) {

		// Bytes que serao exportados
		// Recupera JasperPrint

		try {
			ServletOutputStream servletOutputStream = response.getOutputStream();
			
						
			JasperPrint jasperPrint = JasperFillManager.fillReport(localJasper, parameters, new JRBeanCollectionDataSource(lista));
			jasperPrint.setName(nomeRelatorio);
			
			// create a PDF file
			byte bytes[] = JasperExportManager.exportReportToPdf(jasperPrint);
			
			response.setContentType("application/pdf");   
			response.setContentLength(bytes.length);   
			ServletOutputStream ouputStream = response.getOutputStream();   
			ouputStream.write(bytes, 0, bytes.length);   
			ouputStream.flush();   
			ouputStream.close();
						
		}  catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Esperto que funcione, abraço.

Obrigado, pessoal. Funcionou certinho.

Agora somente mais uma questao.

Como eu faço para colocar uma legenda dinâmica junto com a imagem?
Não dá para eu utilizar o mesmo parâmetro.

Pessoal, segue um bom tutorial sobre o assunto: http://www.furutani.com.br/2009/02/usando-o-jrbeancollectiondatasource/

Utilizar o mesmo parâmetro da imagem não;

Você pode adicionar uma String no parameters e no ireport vc recupera ele e adiciona onde quiser.

Abraço.

Cara como vc fez pra testar esse pequeno exemplo?
Criou um servlet, uma jsp…

[quote=Lord_Byron]Obrigado, pessoal. Funcionou certinho.

Agora somente mais uma questao.

Como eu faço para colocar uma legenda dinâmica junto com a imagem?
Não dá para eu utilizar o mesmo parâmetro.[/quote]

Dúvida URGENTE!

Bom desenvolvi um relatório no IReport 3.5.0 para uma aplicação Desktop com NetBeans.
O esquema é o seguinte, o usuário irá digitar no campo a letra e depois o inicio do Número e o final da contagem
Ex: A de 1 até 80…
Isso vai ser impresso em uma impressora de Etiquetas com 3 colunas no qual cada uma vai ter a sua numeração definida pela contagem do usuário de 1 até 80 Ex: etiqueta 1,2,3…
O Relatório está beleza até uma certa parte o que falta é isso…
Estou passando por parametro cada campo para o Netbeans…

Aguardo Retorno

Leandro