IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Accelerer lecture fichier PDF


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut Accelerer lecture fichier PDF
    Bonjour,
    J'ai un programme qui ouvre des fichiers pdf, et qui affiche des miniatures de ceux ci.
    J'utilise pdfRenderer pour afficher les images.
    je problème c'est que l'affichage des images est relativement long, je pense que cela provient de la lecture des fichier pdf.

    j’essaie d'utiliser AsynchronousFileChannel pour lire le fichier (il parait que c'est plus rapide) mais je parviens pas a dimensionner le bytebuffer.

    Si quelqu'un a une idée pour accélérer le chargement des PDF, je suis preneur. Je n'ai peut être pas la bonne approche.

    méthode lente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
      private Image getImageFromPdf(String fileUrl) throws IOException {
     
     
     
      //load a pdf from a byte buffer
     
           File file = new File(fileUrl);
     
           @SuppressWarnings("resource")
     
                    RandomAccessFile raf = new RandomAccessFile(file, "r");
     
           FileChannel channel = raf.getChannel();
     
           ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
     
           PDFFile pdffile = new PDFFile(buf);
     
     
     
           // draw the first page to an image
     
           PDFPage page = pdffile.getPage(0);
     
           //get the width and height for the doc at the default zoom
     
           Rectangle rect = new Rectangle(0,0, (int)page.getWidth(),(int)page.getHeight());
     
           //generate the image
     
           Image result = page.getImage(
     
                   rect.width, rect.height, //width & height
     
                   rect, // clip rect
     
                   null, // null for the ImageObserver
     
                   true, // fill background with white
     
                   true  // block until drawing is done
     
                   ).getScaledInstance(largeur, hauteur, BufferedImage.SCALE_SMOOTH);// redimentionne l'image au format de la jpanel
     
           return result;
     
    }
    méthode supposée plus rapide mais qui ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     private Image getImageFromPdf(String fileUrl) throws Exception {
     
            //load a pdf from a byte buffer
     
           AsynchronousFileChannel channel = AsynchronousFileChannel.open(new File(fileUrl).toPath(), StandardOpenOption.READ);
     
           ByteBuffer buf = null;  // ou ByteBuffer.allocate(int) mais je ne connais pas la taille du buffer
     
           Future<Integer> fut = channel.read(buf, 0L);
     
                                   fut.get();
     
           PDFFile pdffile = new PDFFile(buf);
     
     
     
           // draw the first page to an image
     
           PDFPage page = pdffile.getPage(0);
     
           //get the width and height for the doc at the default zoom
     
           Rectangle rect = new Rectangle(0,0, (int)page.getWidth(),(int)page.getHeight());
     
           //generate the image
     
           Image result = page.getImage(
     
                   rect.width, rect.height, //width & height
     
                   rect, // clip rect
     
                   null, // null for the ImageObserver
     
                   true, // fill background with white
     
                   true  // block until drawing is done
     
                   ).getScaledInstance(largeur, hauteur, BufferedImage.SCALE_SMOOTH);// redimentionne l'image au format de la jpanel
     
           return result;
     
                    }
    en m'inspirant de ca :
    http://www.java2s.com/Code/Java/JDK-...turetoread.htm

    Merci.

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2011
    Messages : 50
    Points : 42
    Points
    42
    Par défaut
    Bonjour, j'ai avancé un peu.
    j'ai réussi a définir la taille du buffer, avec une combine du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AsynchronousFileChannel channel = AsynchronousFileChannel.open(new File(fileUrl).toPath(), StandardOpenOption.READ);
           ByteBuffer buf =ByteBuffer.allocate((int) channel.size()*8);
    de plus j'ai rajouté un timestamp avant la lecture du fichier, après la lecture et après la création de l'image par PdfRenderer. La lecture du fichier est rapide (pratiquement aucune différence avec AsynchronousFileChannel) c'est PDFRenderer qui est lent.

    Je vais tester une autre librairie.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/10/2014, 22h31
  2. Lecture fichier PDF et extraction de données avec Java
    Par le_misterioso dans le forum Général Java
    Réponses: 2
    Dernier message: 03/04/2011, 01h32
  3. Lecture fichier pdf
    Par kkajout dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 09/04/2008, 16h57
  4. Lecture des fichiers PDF
    Par dstppt dans le forum 4D
    Réponses: 3
    Dernier message: 14/05/2007, 13h55
  5. Réponses: 22
    Dernier message: 26/09/2006, 01h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo