Ouvrir fichier pdf en java

Fermé
Gamso - Modifié par Gamso le 11/07/2012 à 15:01
 Utilisateur anonyme - 26 juil. 2012 à 14:14
Bonjour,

Je dispose d'un fichier pdf qui correspond au manuel du programme que j'améliore actuellement.
Ce fichier est placer dans mon JAR et j'aimerais pouvoir l'ouvrir lorsque je clique sur "aide" dans mon programme.
Le listener sur "aide" est déjà implémenté mais j'arrive pas à ouvrir le pdf. J'ai cherché sur le net mais sans succès.

La "meilleur" solution trouvée actuellement est la suivante :

InputStream pdfInJar = getClass().getResourceAsStream("/manual.pdf"); 
  System.out.println("pdfInJar : " +pdfInJar); 
  try { 
   File pdf = new File("NomDuPDFCree.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) { 
   System.out.println("erreur : " + e); 
          } // catch (IOException e)


Le problème avec cette solution c'est qu'elle ne m'ouvre pas le fichier pdf et elle m'en fait une copie sur le bureau (La copie du fichier est obligatoire pour le lire ensuite ?).

J'ai également vu qu'il existait plusieurs librairies pour gérer les pdf mais je ne sais pas laquelle utilisée si jamais je doit en utiliser une.

J'ai aussi vu qu'on pouvait utiliser Runtime.getRuntime().exec() mais cette solution nécessite de donner le chemin d'accès d'adobe (par exemple). J'aimerais trouver une solution ne nécessitant pas cette contrainte.

Merci d'avance :)

A voir également:

2 réponses

Utilisateur anonyme
26 juil. 2012 à 14:14
Salut!

Utilise IText.

Il te fera cela en quelques lignes de code.

;-)
1
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 juil. 2012 à 15:54
Pour ouvrir un fichier tu as Desktop.getDesktop().open(File file); le fichier sera alors ouvert avec l'application par défaut, quel que soit le type de fichier, ou l'OS utilisé.

Par contre est-ce que la copie du fichier est obligatoire je ne sais pas, en tout cas je ne sais pas faire autrement. Exemple avec "Fichier.pdf" à la racine "/" du fichier JAR :

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

public class Test
{    
    public static File access(String fileNameInJAR, String extension) throws IOException
    {
        InputStream in = Test.class.getClass().getResourceAsStream(fileNameInJAR);
        File f = File.createTempFile("JAR_", extension);
        FileOutputStream out = new FileOutputStream(f);
        
        byte[] buf = new byte[1024];
        for (int n; (n=in.read(buf))!=-1; out.write(buf, 0, n));
        
        out.close();
        in.close();
        return f;
    }
    
    public static void main(String...args) throws IOException
    {
        Desktop.getDesktop().open(access("/Fichier.pdf",".pdf"));
    }
}
-1
Merci, la solution du fichier temporaire me parait plus propre ^^.
Par contre mon fichier pdf ne s'ouvre pas. Tout s'exécute correctement (vérifier grâce à des println) mais après le traitement de la ligne Desktop.getDesktop().open(File file); rien ne se passe.
Une idée ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
16 juil. 2012 à 00:17
Desktop.getDesktop().open(File file) est la version "courte" sans aucune vérification.
La version longue c'est :

if (Desktop.isDesktopSupported())
{
    Desktop desktop = Desktop.getDesktop();
    if (desktop.isSupported(Desktop.action.OPEN)
    {
        try
        {
            desktop.open(file);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    else
        System.err.println("OPEN not supported");
}
else
    System.err.println("Desktop not supported");

Cependant, j'avoue avoir parfois vu cette commande échouer (en particulier sous Windows) ou être assez longue avant que l'opération ne soit exécutée... mais sans trop de raison :(
0
J'ai effectivement ajouté les vérifications comme tu viens de me le montrer mais toujours aucune ouverture et j'ai aucune levé d'exception ...
Après pas mal de recherche j'ai effectivement trouvé sur des forums anglais ce problème mais malheureusement personne qui explique d'où ça vient.
0