Gerar pdf

7 respostas
knik

Amigos, em minha aplicação swing utilizo o método abaixo para gerar um pdf. Dentro do eclipse ele funciona. Mas quando gero um .jar do programa ele deixa de funcionar.
Alguém sabe porque?

public void gerarPdf(String report, Map<String, Object> params, String fileName) {
		
		try{
						
			//o arquivo deve ser o jrxml
			String path= "bin/br/gov/fazenda/visualizador/apresentacao/relatorios/meuRelatorio.jrxml";
			
			
			JREmptyDataSource emptyDataSource = new JREmptyDataSource();
			
			JasperDesign jdesign = JRXmlLoader.load(path);  
			JasperReport jreport = JasperCompileManager.compileReport(jdesign);  
			JasperPrint jprint = JasperFillManager.fillReport(jreport, params, emptyDataSource);

			JasperExportManager.exportReportToPdfFile(jprint, fileName);

		}catch (Exception e) {  
			e.printStackTrace();  
		} 
	
	}
Acho que o problema está nesta linha:
String path= "bin/br/mil/eb/dgp/daprom/apresentacao/relatorios/meuRelatorio.jrxml";

Porém as soluções que encontrei aqui no fórum são para a WEB e estou usando swing.
Alguém me ajuda?

7 Respostas

G

Talvez o problema seja que o .jars necessários não estão dentro do jar gerado para a sua aplicação.
Tenta gerar o .jar usando o pluging do Eclipse - fatjar, ele adiciona no jar a ser gerado todas as classes do classpath.

Fernando_Generoso_da

Um exemplo, se teu .jrxmlestivesse no diretório META-INF:

this.getClass().getResourceAsStream("/META-INF/meuRelatorio.jrxml");

Verifique dentro do arquivo jar, qual o caminho correto que teu relatório .jrxml ficou e substitui no código acima.

Acho que assim vai funcionar…

Fernando

knik

bom dia,
Com fat-jar também não funciona.

this.getClass().getResourceAsStream("META-INF/meuRelatorio.jrxml");

Este código também nao funcionou, pois aí temos um inputString e não string. Só que pode ser uma pista, visto que o JRXmlLoader aceita um inputString como prâmetro. Aí, ele “parece” que localiza o arquivo, mas dá outro erro “url mal formada”. Só que o arquivo jrxml está perfeito, tanto que funciona com o código que eu passei no primeiro post (funciona dentro do eclipse).
Li em outro post por aí que o java não consegue ler um arquivo dentro de outro jar (isto me parece absurdo, pois os jars são repletos de arquivos).
Alguém mais tem alguma pista< meu prazo tá esgotando, fui até as 4 da manhã e testei inúmeras possibilidades sem sucesso.

gilberto_oliveira

Opa,

não tá faltando o / (barra) antes de bin/br/gov/fazenda/visualizador/apresentacao/relatorios/meuRelatorio.jrxml ficando assim: /bin/br/gov/fazenda/visualizador/apresentacao/relatorios/meuRelatorio.jrxml ?

Porque não coloca rastro da pilha do erro que está acontecendo pra que agente consiga entender melhor?

Fernando_Generoso_da

knik:
bom dia,
Com fat-jar também não funciona.

this.getClass().getResourceAsStream("META-INF/meuRelatorio.jrxml");

Este código também nao funcionou, pois aí temos um inputString e não string. Só que pode ser uma pista, visto que o JRXmlLoader aceita um inputString como prâmetro. Aí, ele "parece" que localiza o arquivo, mas dá outro erro "url mal formada". Só que o arquivo jrxml está perfeito, tanto que funciona com o código que eu passei no primeiro post (funciona dentro do eclipse).
Li em outro post por aí que o java não consegue ler um arquivo dentro de outro jar (isto me parece absurdo, pois os jars são repletos de arquivos).
Alguém mais tem alguma pista< meu prazo tá esgotando, fui até as 4 da manhã e testei inúmeras possibilidades sem sucesso.

Então…
Abre o teu arquivo .jar com um descompactador (zip, winrar) e verifica o caminho onde está o teu .jrxml…eu acho que tu não vai conseguir pegar o arquivo passando uma String, de dentro do jar…teria que ser o InputStream…Pelo eclipse funciona pq existe o diretório bin, onde ele compila e joga os binários…porém quando é gerado o jar, acredito que esse diretório não vá para o empacotamento…O ideal seria tu criar uma pasta, no mesmo nível do META-INF, tipo "reports", e colocar o teu jrxml lá dentro…aí tu utiliza esse código:

this.getClass().getResourceAsStream("/reports/meuRelatorio.jrxml");

Fernando

knik

Parabéns Fernando!
Funcionou dentro do Eclipse e fora dele com o .jar.
Agora tem outra coisa que ainda não testei (mas sei que não vai dar certo).
O relatório principal agora vai ter um subReport que estará apontado (caminho relativo - exatamente a mesma coisa anterior) em um arquivo .jrxml, que também estará dentro do .jar.
Assim: O arquivo principal tem um parâmetro apontando para o subrelatorio:

"/relatorios/subRel.jasper"

Eu lembro a voê que isto funciona dentro do eclipse, mas fora dele vou testar agora.
Obrigado.

Fernando_Generoso_da

Então… é para funcionar…

mas tente fazer a mesma coisa com o relatório…passa um InputStream…

Esse InputStream tu passa para o relatório pai via parâmetro.

Fernando

Criado 27 de agosto de 2009
Ultima resposta 27 de ago. de 2009
Respostas 7
Participantes 4