Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lancer un pdf avec un .jar

le pdf se trouvant dans l'archive

Sujet résolu
20 juillet 2011 à 10:51:17

Bonjour,

Depuis quelques jours, je cherche sur des forums comment ouvrir un fichier PDF qui se trouve dans l'archive.
J'utilise Eclipse et le PDF se lance quand j’exécute mon programme avec Eclipse, mais plus quand j'exporte mon programme en .jar.
Je souhaite ne pas devoir mettre le fichier "à côté" du .jar.

J'ai essayé divers solutions :
Desktop.getDesktop().open(new File("MonFichier.pdf"));

Runtime.getRuntime().exec("MonFichier.pdf");


J'ai réussi à résoudre le même problème, mais avec les images avec cela :
getClass().getResource("/images/MonImage.png")

Mais je n'arrive pas à utiliser la même méthode pour les pdf.

Merci d'avance pour vos réponses.
  • Partager sur Facebook
  • Partager sur Twitter
20 juillet 2011 à 10:55:11

Salut,
as tu essayés l'API "iText" ?

Document d = new Document (PageSize.A4); 
PdfWriter.getInstance (d, new FileInputStream ("tonFichierPDF.pdf"));
d.open ();
Paragraph p = new Paragraph ("Some sample Text");
d.add (p);
d.close ();


Tu ajoutes l'API a ton JDK, et lorsque tu exporteras cela devrait fonctionné.
  • Partager sur Facebook
  • Partager sur Twitter
20 juillet 2011 à 11:20:41

Non, j'ai pas encore essayé parce que j'ai pas réussi à comprendre comment l'utiliser... (Je fais comment pour l'ajouter à mon JDK ?)
Mais il n'existerait pas une solution plus "simple" ?

Je suis en train d'essayer cette solution :
Runtime.getRuntime().exec("" + this.getClass().getResource("/pdf/MonFichier.pdf"));

Mais il y a une erreur : Cannot run program "file:/C:/Users/Nom/workspace/Logiciel/bin/pdf/MonFichier.pdf": CreateProcess error=2, Le fichier spécifié est introuvable
Pourtant, le fichier se trouve bel et bien sur le chemin spécifié et si je l'exécute ça marche.
  • Partager sur Facebook
  • Partager sur Twitter
20 juillet 2011 à 11:40:39

En java si tu veux utiliser d'autre "technologies", PDF, XML etc.. Tu dois parfois passer par des API, c'est un avantage de Java. Mais oui, encore faut-il savoir les utiliser.

Je t'invite à lire ceci pour ajouter une API a ton JDK via Eclipse. Ce n'est pas du tout compliquer, simplement ajouter un .jar dans la configuration d'Eclipse.
Comme ceci :
Dans eclipse, clic droit sur un projet, menu "Build Path", sous-menu "Configure Build Path". Ensuite, tu fais "Add Jars" ou "Add External Jar".

Edit : Télécharge l'API, ca sera mieux ^^http://itextpdf.com/download.php , donc tu prends le .jar et tu fais ce que je t'ai dis plus haut.
Tiens nous au courant.
  • Partager sur Facebook
  • Partager sur Twitter
20 juillet 2011 à 23:45:38

je ne pense pas que la librairie iText puisse aider Bleuer, car elle ne comporte pas de visionneuse, elle permet de créer ou de manipuler le contenu des fichiers pdf, mais pas d'ouvrir un pdf avec un programme externe.

Le problème posé est plus celui de l'utilisation d'une ressource pdf contenue dans le jar. Or un fichier jar est en quelque sorte un zip, et les fichiers inclus sont compressés. Il faut à mon avis extraire d'abord le pdf puis le lire ensuite.
InputStream pdfInJar = getClass().getClassLoader().getResourceAsStream("pdfDansJar.pdf");
try {
	File pdf = new File("pdf.pdf");
	FileOutputStream fos = new java.io.FileOutputStream(pdf);
	while (pdfInJar.available() > 0) { 
		  fos.write(pdfInJar.read());
	}
	fos.close();
	Desktop.getDesktop().open(pdf);
} catch (IOException e) {
	e.printStackTrace();
}


Ce n'est donc peut être pas une bonne idée d'embarquer une ressource de ce type dans le jar.
  • Partager sur Facebook
  • Partager sur Twitter
21 juillet 2011 à 9:47:15

Ha d'accord, alors oui si tu arrives à l'extraire avec ce que t'as dit hd29, tu peux également lancer le PDF avec un :
Runtime runtime = Runtime.getRuntime();
String[] args = { "C:/Program Files(...)/AcroRd32.exe", "/C", "dir C:\\ >tonFichier.pdf" };
final Process process = runtime.exec(args);


En premier tu met l'emplacement de ton Adobe Reader, ensuite le paramètre : "dir C:\\ >tonFichier.pdf", l'emplacement ou est extrait ton fichier PDF. Voila pourquoi tu n'y arrivais pas hier, parce que le Runtime.exec(); a besoin de savoir qu'elle application ".exe" lancer pour pouvoir lancer ensuite un paramètre. Toi, tu lui demander de lancer un fichier .pdf sans lancer Adobe Reader, tu vois la nuance ? :)

C'est une solution, je suis pas sûr à 100% que sa fonctionne, mais tu peux essayer :)

PS : Perso je viens d'essayer cela fonctionne :
bouton_start.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				Runtime runtime = Runtime.getRuntime();
				String[] args = { "C:/Program Files/Adobe/Reader/Reader/AcroRd32.exe", "/C", "dir C:\\ >Users/A1008348/Desktop/BD.pdf" };
				try {
					final Process process = runtime.exec(args);
				} catch (IOException e) {
		c		// TODO Auto-generated catch block
					e.printStackTrace();
				}


				
			}
			
		});
Apres C'est vrai, mon PDF ne se trouve pas dans un jar...En espéreant t'avoir aidé.
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 11:41:46

Je viens d'essayer vos deux solutions, mais elles génèrent tous les deux des problèmes (peut-être est-ce dû à mon incompétence ?^^).

Pour la solution proposé par pendoRa :
Voici le code que j'ai adapté à ma situation :
Runtime runtime = Runtime.getRuntime();
String[] args = { "C:/Program Files (x86)/Adobe/Reader 10.0/Reader/AcroRd32.exe", "/C", "dir C:\\ >" + this.getClass().getResource("/pdf/MonFichier.pdf")};
try {
	final Process process = runtime.exec(args);
} 
catch (IOException e) {
	e.printStackTrace();
}

A présent, j'arrive à lancer Adobe Reader (merci pour tes explications^^), mais il n'arrive pas à trouver le fichier à ouvrir (c'est sûrement parce que j'ai mal inséré le chemin).

Et pour la solution proposé par hd29 :
Voici mon code :
InputStream pdfInJar = getClass().getClassLoader().getResourceAsStream("/pdf/MonFichier.pdf");
try {
	File pdf = new File("MonFichier.pdf");
	FileOutputStream fos = new java.io.FileOutputStream(pdf);
	while (pdfInJar.available() > 0) { 
		  fos.write(pdfInJar.read());
	}
	fos.close();
	Desktop.getDesktop().open(pdf);
} catch (IOException e) {
	e.printStackTrace();
}

L'exception se trouve au niveau de cette ligne :
while (pdfInJar.available() > 0) {

Mais je ne sais pas du tout comment résoudre ce problème.

Je tiens à préciser que mon fichier pdf se trouve dans un package nommé "pdf".

PS : Merci de m'avoir expliqué le fonctionnement d'un API, mais je ne pense pas essayé cela tout de suite. Je vais garder en mémoire la marche à suivre pour une prochaine utilisation.^^
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 11:53:47

Citation : Blueur


Et pour la solution proposé par hd29 :
Voici mon code :

InputStream pdfInJar = getClass().getClassLoader().getResourceAsStream("/pdf/MonFichier.pdf");
try {
	File pdf = new File("MonFichier.pdf");
	FileOutputStream fos = new java.io.FileOutputStream(pdf);
	while (pdfInJar.available() > 0) { 
		  fos.write(pdfInJar.read());
	}
	fos.close();
	Desktop.getDesktop().open(pdf);
} catch (IOException e) {
	e.printStackTrace();
}


L'exception se trouve au niveau de cette ligne :

while (pdfInJar.available() > 0) {


Mais je ne sais pas du tout comment résoudre ce problème.

Je tiens à préciser que mon fichier pdf se trouve dans un package nommé "pdf".



Quelle est l'exception ?
ton fichier pdf est bien contenu dans un dossier nommé pdf dans le jar ou est situé la classe qui a la fonction Main() ?
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:05:09

Voici l'exception :
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Fenetre$1.actionPerformed(Fenetre.java:201)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Et quand je l'exporte en .jar, le fichier pdf a bel et bien été créé à côté du .jar, mais il pèse 0ko...
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:10:14

Il ne trouve pas ton pdf. Ouvre ton jar avec 7zip ou winrar, et vérifie si il est bien ou il devrait être (dans un fichier nommé pdf dans le jar). J'ai fait un essai, et chez moi ca marche.
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:13:35

Oui, quand j'ouvre le .jar, il y a un dossier "pdf" et dedans, il y a mon fichier "MonFichier.pdf".
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:18:50

bizarre ...
ton log d'exception ne parle pas de la ligne que tu cites ??
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:21:34

Si, "Fenetre.java:201" : la 201ème ligne de ma classe "Fenetre" est
while (pdfInJar.available() > 0) {
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:24:40

dans la String "/pdf/MonFichier.pdf" retire le / --> "pdf/MonFichier.pdf"
ça devrait marcher
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 12:28:33

Ça marche ! Merci infiniment pour votre aide à tous les deux, j'aurais jamais réussi sans vous, encore merci !
  • Partager sur Facebook
  • Partager sur Twitter
22 juillet 2011 à 13:05:02

De rien, bravo hd29 ;) Quand j'y repense, sa m'étais déja arrivé ce genre d'erreur "bête", pour l'affichage de mes images (icones) pour IHM d'une ancienne application.

Et oui conernant les API, tu verras plus tard si tu continus de développer en Java, tu en aura forcément besoin ;)

A bientôt
  • Partager sur Facebook
  • Partager sur Twitter
23 juillet 2011 à 15:30:42

Pour ceux que ça intéresse, voici le code final que j'ai utilisé :
InputStream pdfDansLArchive = getClass().getClassLoader().getResourceAsStream("pdf/MonFichierPDFDansLArchive.pdf");
	
	try {
		File pdfCree = new File("NomDuPDFCree.pdf");
		// Extraction du PDF qui se situe dans l'archive
		FileOutputStream fos = new FileOutputStream(pdfCree);
		while (pdfDansLArchive.available() > 0) { 
			  fos.write(pdfDansLArchive.read());
		}	// while (pdfInJar.available() > 0)
		fos.close();
		// Ouverture du PDF
		Desktop.getDesktop().open(pdfCree);
	}	// try
	
	catch (IOException e) {
		System.out.println("erreur : " + e);
	}	// catch (IOException e)
  • Partager sur Facebook
  • Partager sur Twitter
24 juillet 2011 à 8:04:22

Petite note pour ceux qui retiendraient Runtime.getRuntime pour lancer Adobe Reader ou un autre lecteur externe pour visualiser le PDF: n'oubliez pas que le chemin d'accès à l'application peut changer chez le client...
  • Partager sur Facebook
  • Partager sur Twitter
15 février 2020 à 13:52:00

J'ai connu le même problème et j'ai pu le résoudre en utilisant du HTML. En faite j'ai du créer une chaine de caractères formant tout un code de création d'une page web. Tout de qui était de type PdfCell s'est vu transformé en cellule HTML c'est à dire <th> et <td>. Par la suite je procédait en faisant ceci  :

HtmlEnPDF pdf=new HtmlEnPDF();

pdf.convertisseurHTMLenPDF(chaineDuCodeHTML,new FileOutputStream(chemin), document) ; 

  • Partager sur Facebook
  • Partager sur Twitter
15 février 2020 à 15:33:45

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter