Ajuda com diretório de imagens no JasperReport

7 respostas
Tchello

Bom dia pessoal!

Fiz uma loooonga pesquisa no google (conseqüentemente no guj e no resto do universo tbm) pra isso e não me ficou muito claro o que irei lhes perguntar.

Pois bem, tenho um sistema rodando aqui e em alguns momentos ele gera relatórios com o jasper (montados no iReport) e ou os envia por e-mail no formato pdf ou abrem novas abas no navegador exibindo-o em html.
Acontece que esse relatório possue algumas imagens (na verdade uma só, mas whatever) que estão com os paths setados a um diretório incluido no projeto.
O problema é quando eu vou rodar essa aplicação em outro servidor, o path da imagem que adicionei ao relatório corresponde a minha home e lá ele não o reconhece mais.

Adicionei um ImageServlet pra criar o relatório, que resolveu o problema dos espaços em branco (todo espaço em branco no jasperreport é uma imagem em branco) mas ainda assim não resolveu o meu problema das imagens que eu criei.

Alguém tem alguma sugestão de como resolver isso?!
Li em um lugar que poderia passar a imagem como um stream por parâmetro, na criação do relatório, como configuro isso na imagem no iReport?

Muito obrigado pela ajuda pessoal, isso está me comendo um tempo danado!

Abraços!

7 Respostas

Mero_Aprendiz

Olá Tchello.
Bem, acredito que o que está acontecendo é que você tenha informado no iReport o caminho completo da imagem, algo como C:\Tomcat\webapps\suaaplicacao\imgens\img.img. O problema dessa solução é que o caminho do tomcat no servidor pode estar diferente. E esse é apenas um dos problema que pode acontecer.

Para solucionar o problema (se for esse), informe o caminho da aplicação por parametro, por exemplo:

String caminhoCompletoAteDiretorioImagens = request.getSession().getServletContext().getRealPath("/imagens");
parametros.put("parametroDoDiretorioDeImagens", caminhoCompletoAteDiretorioImagens);

E no iReport, onde você informa o caminho da imagem, faça:

Acredito que isso deve solucionar seu problema.

[]'s
JL

Tchello

É exatamente por aí, Aprendiz!

Farei uns testes aqui.
No caso uso Ubuntu, NetBeans 6.5 e JBoss 4.2.2
O projeto se divide em duas partes, a visualização web (projeto web) e a parte de negocios, um projeto diferente.
No projeto web consigo usar o “getRealPath” mas na aplicação não.
Alguma sugestão de como consigo pegar o “realpath” na aplicação “comum”, já que não disponho do “request.getSession().getServletContext().getRealPath(”/imagens");" ?

Grato pela ajuda, creio que isso resolverá boa parte dos meus problemas.

Abraços!

Mero_Aprendiz

Tchello:
É exatamente por aí, Aprendiz!

Farei uns testes aqui.
No caso uso Ubuntu, NetBeans 6.5 e JBoss 4.2.2
O projeto se divide em duas partes, a visualização web (projeto web) e a parte de negocios, um projeto diferente.
No projeto web consigo usar o “getRealPath” mas na aplicação não.
Alguma sugestão de como consigo pegar o “realpath” na aplicação “comum”, já que não disponho do “request.getSession().getServletContext().getRealPath(”/imagens");" ?

Grato pela ajuda, creio que isso resolverá boa parte dos meus problemas.

Abraços!

Já passei por um problema semelhante.
A solução que encontrei foi criar em uma classe que trabalhava com arquivos (manipulação, gravação, exclusão, etc) um atributo readonly com o caminho completo da aplicação. Como o objeto da classe é singleton, quando a aplicação web iniciar, um listener é chamado e preenchia um atributo da readonly da classe com o caminho da aplicação.
Assim, de qualquer lugar da aplicação é possível manipular arquivo sem me preocupar com o path (já que todos os metódos de manipulação de arquivos estão contidos dentro dessa classe).

[]'s
JL

Tchello

Solução interessante, embora eu acredite que eu deva tomar muito cuidado com singletons e métodos estáticos =Z
Mas me diga, como ficou esse listener que roda no começo da aplicação?
Talvez ele me tenha a resposta de que preciso.

Muito obrigado pela ajuda, já foi de grande valia!

Abraços.

Mero_Aprendiz

Tchello:
Solução interessante, embora eu acredite que eu deva tomar muito cuidado com singletons e métodos estáticos =Z
Mas me diga, como ficou esse listener que roda no começo da aplicação?
Talvez ele me tenha a resposta de que preciso.
Muito obrigado pela ajuda, já foi de grande valia!
Abraços.

Bem, com singletons e métodos estáticos todos nós devemos tomar cuidado. Mas se usado com cuidado e sem abusos, acretido que são de excelênte ajuda.
Sobre minha classe ficou assim (vou tomar com verdade que você conhece sobre listeners, rs!):
Listener.java

public void contextInitialized(ServletContextEvent contextEvent) {
	UtilArquivos.createInstance(contextEvent.getServletContext().getRealPath(""));
                //outros fora do contexto do exemplo. Omitidos.
}

UtilArquivo.java

private String CAMINHO_DA_APLICACAO;
private static UtilArquivo INSTANCE;

private UtilArquivo(String caminhoDaAplicacao){
       CAMINHO_DA_APLICACAO = caminhoDaAplicacao;
}

public static void createInstance(String caminhoDaAplicacao){
        if(StringUtil.isNotEmpyt(caminhoDaAplicacao)){
                INSTANCE = new UtilArquivo(caminhoDaAplicacao);
        } else {
                throw new InstantiationException("Caminho da aplicação não é valido!");
        }
}

public static UtilArquivo getInstance(){
        if(INSTANCE != null){
                return INSTANCE;
        }
        throw new NullPointerExcepion("Não existe uma instância de UtilArquivo.");
}

public String getCaminhoDaAplicacao(){
        return CAMINHO_DA_APLICACAO;
}

O que eu postei aqui foi apenas um modelo de como está aqui, já que assinei um documento de sigilo do código. Mas acho que deu pra entender a ideia.

[]'s
JL

Tchello

Aprendiz, entendo perfeitamente e concordo com os comentários feitos.

Creio que eu não tenha sido claro em um ponto.
O meu sistema está dividido em duas aplicações, uma WEB e uma aplicação java “comum”.
A aplicação web trata a camada de apresentação e a “comum” cuida da camada de negócios, separadamente.

Enfim, na camada web consigo usar a listener e tudo mais, porém na outra camada já não disponho desses mesmos recursos, uma vez que não existe o “getServletContext()” e tudo mais. Daí não consigo usar o método getRealPath.
Sendo assim, como posso conseguir o diretório real das minhas imagens?
Queria algo do tipo:

contextEvent.getServletContext().getRealPath("/img");

Isso funciona perfeitamente na camada web, mas não na de negócios.
Ambas possuem pacotes de imagens diferentes.

Muito obrigado pela ajuda!

Mero_Aprendiz

Tchello:
Aprendiz, entendo perfeitamente e concordo com os comentários feitos.

Creio que eu não tenha sido claro em um ponto.
O meu sistema está dividido em duas aplicações, uma WEB e uma aplicação java “comum”.
A aplicação web trata a camada de apresentação e a “comum” cuida da camada de negócios, separadamente.

Enfim, na camada web consigo usar a listener e tudo mais, porém na outra camada já não disponho desses mesmos recursos, uma vez que não existe o “getServletContext()” e tudo mais. Daí não consigo usar o método getRealPath.
Sendo assim, como posso conseguir o diretório real das minhas imagens?
Queria algo do tipo:

contextEvent.getServletContext().getRealPath("/img");

Isso funciona perfeitamente na camada web, mas não na de negócios.
Ambas possuem pacotes de imagens diferentes.

Muito obrigado pela ajuda!

Bom… Duas visões sobre o que me disse:
Ou… Os dois projetos estão ligados com dependências (projeto web depende do projeto comum). Se isso for verdade, o UtilArquivo.java é criado no projeto comum, podendo ser usando tanto no projeto WEB como no projeto comum.
Ou… Os dois projetos são totalmente separados. Se for assim, a melhor estrategia seja guardar a informação do caminho da aplicação(arquivo properties, arquivos xml, registro no banco da dados, etc).

[]'s
JL

Criado 22 de junho de 2009
Ultima resposta 22 de jun. de 2009
Respostas 7
Participantes 2