Abrir arquivo

Olá pessoal!

Estou tentando abrir um arquivo pdf em minha aplicação, da seguinte forma:


File manual = new File("Manual.pdf");
try {   
	    Desktop.getDesktop().open(manual);   
		} catch(Exception ex) {   
  		ex.printStackTrace();
}

E até funciona, mas o problema é quando crio um jar e rodo de outro diretorio, ele não acha mais o arquivo. Como faço para instanciar este objeto, de modo que ele possa ser aberto independentemente do local que executar o jar? Com imagens, eu usava: new ImageIcon(getClass().getResource(“Icones/Ajuda.gif”)); e dava certo. Tem algum método deste para arquivos?

Abraço,

Marcelo.

[quote=Marcelo Reis]Olá pessoal!

Estou tentando abrir um arquivo pdf em minha aplicação, da seguinte forma:


File manual = new File("Manual.pdf");
try {   
	    Desktop.getDesktop().open(manual);   
		} catch(Exception ex) {   
  		ex.printStackTrace();
}

E até funciona, mas o problema é quando crio um jar e rodo de outro diretorio, ele não acha mais o arquivo. Como faço para instanciar este objeto, de modo que ele possa ser aberto independentemente do local que executar o jar? Com imagens, eu usava: new ImageIcon(getClass().getResource(“Icones/Ajuda.gif”)); e dava certo. Tem algum método deste para arquivos?

Abraço,

Marcelo.[/quote]

Se Manual.pdf está dentro do contexto da aplicação você precisa usar algo como getResourceAsStream();

Olá!

Como seria o código? Já tentei parecido e não consegui.

Boa noite pessoal!

Já revirei a net toda, mas não consigo resolver este problema. Estou tentando fazer da seguinte forma:


 try { 
           	                Desktop desktop = Desktop.getDesktop();     
		desktop.open(new File((getClass().getResource("Roteiro.pdf").getFile())));


		} catch(Exception ex) {   	
                                  ex.printStackTrace(); }

Mas o java retorna que o arquivo não existe:

java.lang.IllegalArgumentException: The file: C:\Roteiro.pdf doesn’t exist.
at java.awt.Desktop.checkFileValidation(Desktop.java:191)
at java.awt.Desktop.open(Desktop.java:252)
at Efeito.Ativar$1.actionPerformed(Ativar.java:129)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1225)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1266)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Process completed.

Quando retiro as expressões getClass().getResource, ele abre mas tenho o problema do caminho relativo. Ao executar de outra pasta, ele não encontra.

Já tentei de diversos modos, modificar o caminho, etc. e nada. O que pode estar havendo?

Abraço,

Marcelo.

Boa tarde!

Valeu pela ajuda, mas ainda falta um detalhe, rs!

Fiz da seguinte forma:


	String file = this.getClass().getResource("Doc/Roteiro.pdf").getFile().replaceAll("%20", " ");
       

		java.awt.Desktop desktop = java.awt.Desktop.getDesktop();   
		desktop.open(new File(file));  
		

Ao compilar o programa, funciona certinho mas quando gero o JAR, dá o mesmo problema.

Alguma ideia?

Brother é o seguinte.

Seria interessante você tratar as excessões nesse trecho do file verificando se ele existe antes de abrí-lo.
Espero que esteja tentando ler o arquivo.pdf de fora do .jar (compilado), a sua lógica para abrir o arquivo está correta, porém precisa certificar que o arquivo.pdf está no lugar onde está tentando abrir.

Abraço.

O arquivo pdf no caso, está compactado dentro do jar. Tenho uma estrutura de pastas, todas dentro do jar, onde Doc/Roteiro.pdf, é o caminho. O problema é que quando crio o jar para rodar em qualquer computador, ou seja, distribuir a aplicação para uso, este arquivo não abre mais. Tenho vários arquivos de imagem que configura a tela do programa e funciona normal no jar. O problema está sendo para abrir este pdf. Pode ser um problema na instrução que uso para abrir. Será que existe outra forma sem ser a classe desktop?

Abraço,

Marcelo.

A instrução desktop está certa, mas você não vai conseguir abrir o arquivo compilado dentro do seu jar.

Por um acaso você gera o PDF em tempo de execução (dinâmico)? Se sim, você precisa salvar o arquivo em disco, tipo C:\Temp e depois abrir o arquivo, se for o caso deixar uma opção para limpar o diretório depois de finalizado o processamento da sua aplicação.

Obs.: Se fizer esse esquema de gravar antes de abrir, deve verificar se o usuário que está utlizando a aplicação tem acesso para alteração da past C:\ por exemplo.

Na verdade é algo bem mais simples. Não estou manipulando arquivos; o que gostaria era somente criar um menu de ajuda, que exibisse o manual ao clicar. O arquivo está pronto bastando apenas ser aberto.

Oi cara beleza? Desculpa a demora é que estive sem o Eclipse no serviço daí é só em casa mesmo… Olha fiz um exemplo rápido aqui e funcionou… Lá vai:

[code]package resources;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Main {

/**
 * Principal que invoca o método que possui a lógica de negócio
 * @IOException
 * */
public static void main(String[] args) throws IOException {
	new Main().openPdf();
}

/**
 * Inicializa a pilha de execução
 * @throws IOException
 * */
private void openPdf() throws IOException {
	getThePdfAndPutOnC();
	Desktop.getDesktop().open(new File("c:\\Manual.pdf")); // Hardcode mesmo
}

/**
 * Recebe o arquivo .pdf do classpath e gera um cópia no c:\
 * @throws IOException
 * */
public void getThePdfAndPutOnC() throws IOException{
	InputStream from = getClass().getResourceAsStream("/resources/Manual.pdf"); // Criar pacote e colocar nele o .pdf
	File to = new File("c:\\Manual.pdf"); // Endereço de saída do arquivo .pdf
	OutputStream transferByteByByte = new FileOutputStream(to);
	byte[] bufferTotal = new byte[1024];
	int size = 0;
	while ((size = from.read(bufferTotal)) > 0){
		transferByteByByte.write(bufferTotal, 0, size);
	}
	transferByteByByte.close();
	from.close();
}

}[/code]

Espero que esteja usando Windows caso não e/ou não souber como deixar dinâmico a criação do arquivo no c:\ ou numa pasta temporária e/ou deletar o arquivo sempre
que o usuário fechar o .pdf você fala, ok?

Hope that helps,
André AS.

Boa noite!

Rapaz, nunca pensei que abrir um simples arquivo fosse uma tarefa tão dificil! RS!

Consegui fazer com o código que me enviou, só que teve alguns probleminhas com o W7, que não aceita alterar o c:. Então coloquei o arquivo no local que o jar é executado (só não pode executar na raiz do c!). Mas como faço para deletar o arquivo que é criado? Ele continua lá mesmo quando o programa fecha. É possível ocultar ele?

Cara, muito obrigado pela ajuda. Já estava desesperado com isso!

Abraço,

Marcelo.

Não é difícil vocês estão tentando construir uma solução difícil para uma tarefa fácil,
veja bem, você quer somente que ele abra o mesmo arquivo, se o arquivo ficar no mesmo diretorio da aplicação, obtenha o caminho da raiz da aplicação
com um getPath e concatene com o caminho do seu .PDF, ou seja, em vez de usar o caminho relativo, você usa o absoluto de acordo com o diretorio que sua aplicação estiver.

Caso o PDF fique sempre no mesmo diretorio e o que muda a o diretorio do JAR, basta criar a referencia do PDF com o caminho absoluto:

File arquivo = new File("c:/ajuda/meuArquivo.pdf");

Não sei se consegui ser claro o bastante, espero ter ajudado.

Att. Paulo

Boa tarde Paulo,

Já tentei desta forma e não é possível, pois o arquivo pdf está dentro do JAR. Imagine uma aplicação pronta, em um arquivo JAR para ser executado direto. Fazendo desta forma o arquivo não é encontrado.

Abraço,

Marcelo.

[quote=ganondorfan]Não é difícil vocês estão tentando construir uma solução difícil para uma tarefa fácil,
veja bem, você quer somente que ele abra o mesmo arquivo, se o arquivo ficar no mesmo diretorio da aplicação, obtenha o caminho da raiz da aplicação
com um getPath e concatene com o caminho do seu .PDF, ou seja, em vez de usar o caminho relativo, você usa o absoluto de acordo com o diretorio que sua aplicação estiver.

Caso o PDF fique sempre no mesmo diretorio e o que muda a o diretorio do JAR, basta criar a referencia do PDF com o caminho absoluto:

File arquivo = new File("c:/ajuda/meuArquivo.pdf");

Não sei se consegui ser claro o bastante, espero ter ajudado.

Att. Paulo[/quote]

Verdade, no entanto, acredito que seja pré-requisito do sistema o Manual.pdf estar dentro do .jar, não?!

De qualquer maneira, Marcelão, lá vai o código implementando esta lógica:

/** * Inicializa a pilha de execução * @throws IOException * */ private void openPdf() throws IOException { final String nomeDoJar = "AbrirPdfDiretorioDoJar"; File openFile = new File(System.getProperty("user.dir").replace(nomeDoJar, "") + File.separator + "Manual.pdf"); Desktop.getDesktop().open(openFile); }

Abraços,

Fala ae André!

Mesmo assim não funciona. Ele sempre procura o arquivo fora do jar, precisa estar na pasta que o jar é executado. Aquele código que você mandou antes, embora mais complexo, resolve o problema. O unico problema é sempre deletar o arquivo gerado e impor autorização para gravar. Como fazer estes 2 ultimos parametros?

Abraço,

Marcelo.

Hehe, pelo que vi ainda está com o problema.

Todos os códigos que o pessoal estão te mandando vão funcionar pq estão executando direto pela IDE, e não pelo jar. Já instalou algum programa no seu Windows? Creio que sim, quando instala ele não cria uma pasta no seu disco (Arquivos de Programas) e com um monte de arquivos dentro? Tipo arquivos de configuração, exe, icone e etc.

Levando em consideração que é um arquivo de ajuda, não há necessidade de ser dinâmico (não precisa ficar criando toda vez ou apagando após o uso), sendo assim pode deixá-lo na pasta raiz do seu sistema, junto com os arquivos de banco, log4j e etc. Pq? Sempre que precisar fazer qualquer alteração nas configurações de banco, não vai precisar compilar o seu sistema novamente, mesma coisa para os demais arquivos.

Outra alternativa, caso queira realmente manter dentro do sistema, passa o conteúdo do seu help para uma tela (jsp/jpanel).

Boa tarde!

Entendo o que diz. O problema é que esta aplicação foi feita para ser de simples acesso ao usuario, sem a necessidade de instalar, bastando apenas clicar no jar para rodar. Por isso que tenho este problema. Como fica esta sua sugestão do jsp?

Abraço,

Marcelo.

[quote=Marcelo Reis]Fala ae André!

Mesmo assim não funciona. Ele sempre procura o arquivo fora do jar, precisa estar na pasta que o jar é executado. Aquele código que você mandou antes, embora mais complexo, resolve o problema. O unico problema é sempre deletar o arquivo gerado e impor autorização para gravar. Como fazer estes 2 ultimos parametros?

Abraço,

Marcelo.[/quote]

Oi Marcelão, como vai?

Cara, quanto à gravação, acredito que você sempre conseguirá fazê-lo dentro do temp do sistema operacional, a propósito vai rodar só em Windows ou haverá outras plataformas clientes?

Já em relação à deleção que é um problema, assim como o sugerido acima pelo luisgarcia173 eu pensei em um JSP daí eu saberia como fazer mas tem a questão de servidor por trás o que acredito que fugiria do escopo do seu requisito. Talvez de pudesse abrir este .pdf em um JFrame sei lá algo assim do Swing (conheço zero de aplicação desktop) que possibilitasse ao fechar acionar um evento que invocaria o método que tenha file.delete(); . Sakô?

Alguém que conheça de desktop app pode nos ajudar?

Fala aí rapaz! Beleza!

Entendi. Acho que seria isso mesmo: chamar sempre o arquivo e deletar depois. O que não entendo é que se o java aceita a instrução para copiar o arquivo, porque não pode tambem abrir direto do local do arquivo? RS! Meio complicado isso!
Mas de fato desta forma funciona, o unico problema é apagar ele depois de fechar.

Esta aplicação é somente windows (não sei se roda em linux). Criei tudo com escrita de texto, não usei IDE. É uma aplicação bem simples, para rodar localmente mesmo.

Abraço,

Marcelo.