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

Android Discussion :

comment parser un fichier PDF pour y lire des data à stocker avec sqlite?


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut comment parser un fichier PDF pour y lire des data à stocker avec sqlite?
    Hello, les spécialistes.

    Je reviens vers vous pour une petite info.

    Je voudrais extraire des data d'un fichier PDF (sans l'ouvrir à l'écran, pas besoin d'un viewer donc), pour trouver celles qui me sont utiles, et les stocker dans la base sqlite de mon device.

    Je suppose qu'il doit exister des classes pour faire ça, donc pouvez-vous m'en conseiller une.

    Plus concrètement, si vous avez besoin de comprendre ma démarche:
    -> je me fais une appli perso, basée sur des horaires de trains
    -> pour l'instant, ma V1 fonctionne avec les data de ma base, data que j'ai entrées à la mano via sqlite database browser

    Problème:
    -> les horaires changent 2 fois par an
    -> donc si je peux éviter de me palucher l'opération de màj des horaires à la main...........

    Hors, je peux télécharger le fichier PDF de la ligne TER en question.

    Je dois donc pouvoir:
    -> accéder à ce pdf
    -> repérer les lignes qui m'intéressent
    -> lire les data
    -> stocker ça dans ma base sqlite

    Voilà, j'espère avoir été suffisamment clair pour que vous saisissiez ma démarche.

    En plus d'avoir une vraie utilité personnelle (trop longue à expliquer), ça me permet aussi de reprendre le dév android, puisque je n'y ai plus touché depuis 2 ans.

    Merci.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Apache propose pdfbox qui semble capable d'extraire des données de PDF. Jamais testé pour ma part.

    Ceci dit il serait à mon avis plus simple de parser ces données directement depuis une page web si elles existent.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Merci pour cette piste, je vais creuser!
    Après, si qq'un à d'autres solutions, je reste à l'écoute.

    Concernant le mode web, pourquoi pas, mais:
    -> il y a des critères à remplir dans un formulaire, donc sais pas comment passer ça

    -> je pourrais remplir les critères sur mon PC, valider et copier/coller l'URL généré...... mais est-elle valide tout le temps, OU auto regénérée à chaque recherche?

    -> ensuite l'affichage se fait sur différentes pages, en fonction des tranches horaires, donc sais pas si toutes les data sont accessible globalement dès la 1ère page OU si l'actualisation se fait à chaque page

    Et, question subsidiaire:
    -> avec une appli "normale", mon phone se met en veille après 20 secondes (comportement normal!)
    -> avec la mienne, la mise ne veille ne se fait pas(??).......

    Donc:
    -> pourquoi?
    -> en rapport peut être avec un mode débbug?
    -> comment corriger la chose?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Pour la mise en veille ca peut être plusieurs choses :

    - Un wakelock configuré dans le code source
    - Le téléphone configuré pour pas se couper quand branché (options développeur)

    Pour les pages web il est tout à fait possible de remplir des formulaires , ca demande juste de savoir quel paramètre envoyer. Après faut peser les deux solutions , si les données ne sont pas accessible simplement en web , ca peut être plus rapide de développer un parser de pdf
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    - pas de wakelock dans mon code
    - phone branché ou pas en USB sur PC/Eclipse, c'est la même chose!
    Bon, ce n'est pas super vital, ce n'est mon appli perso, seul user, donc s'il n'y a rien à faire, tant pis.
    Mais comme j'aime comprendre le pourquoi du comment, s'il y avait une solution, j'aimerais autant.

    Et oui, le PDF me semble plus simple comme datasource, car, par exemple, le PDF comprend aussi les horaires de tramtrain... que ne fournit logiquement pas la sncf!
    Il faudrait de toute façon faire le boulot en double sur le site de l'exploitant du tram.
    Bref, tout un bordel!

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Pas gagné en effet: j'ai bien trouvé des exemples sur le net... mais qui ne passent pas à la compil'

    Je continue.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, on avance, on avance!

    J'ai fini par trouver un bon exemple, et fonctionnel surtout!

    http://radixcode.com/pdfbox-example-...ile-with-java/

    Par contre, se pose maintenant un autre problème: comment repérer un pattern particulier dans le fichier PDF pour ne ramener que ces data là, et pas la globalité du fichier, ou de la page?

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    New York:   06:30  /  07:00  /  10:15  /  12:30
    Boston:     07:30  /  08:00  /  11:15  /  01:30
    Chicago:    08:30  /  09:00  /  12:15  /  02:30
    Dans mon cas, je voudrais ne récupérer QUE les horaires de Boston, par exemple..........
    Soit:
    • 07:30
    • 08:00
    • 11:15
    • 01:30


    EDIT:
    je parle là évidemment de méthodes natives de pdfbox, si elles existent...
    sinon, il y a toujours la bonne veille recherche manuelle du pattern, ligne lue par ligne lue, mais je suppose pas top niveau optimisation

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 224
    Points
    20 224
    Par défaut
    Vue que tu es sur un traitement ponctuel je me casserais pas trop la tête en terme d'optimisation.
    Tu récupère le contenu de ta page puis tu cherche via une regex la ligne qui t'intéresse.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Ok, merci.

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    dernière petite chose, à propos d'un Collections.ReplaceAll()

    -> je récupère donc dans un buffer la page complète de mon pdf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String buffer = pdfManager.ToText();
    -> je split ce buffer pour analyser ligne par ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String lines[] = buffer.split("\\r?\\n");
    -> je parcours toutes les lignes et si la courante contient mon pattern, je la stocke dans un ArrayList (linesOK), pour en extraire les colonnes ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    linesOK.add(lines[indice]);
    jusqu'ici, tout est nickel!

    le dernier point de blocage étant que dans le PDF les horaires sont sous la forme xx.xx alors que je voudrais stocker dans ma base un format xx:xx, question pratique!
    -> convertir 07.30 en 07:30

    MAIS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Collections.replaceAll(linesOK, ".", ":");
    me renvoie false, et par conséquent le remplacement ne se fait pas!


    EDIT:

    bien sûr, je pourrais le faire à chaque extraction de colonne (ce que j'ai fait pour le moment) MAIS ce serait plus propre d'appliquer le remplacement globalement et directement au niveau de l'ArrayList.

    et puis j'aime bien comprendre pourquoi un truc marche/ne marche pas...

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    Une autre question à 1000 francs:

    -> comment un code peut-il passer à la compil....... et planter à l'exécution à cause d'une class, soit disant, introuvable??

    Mon projet java standard marche très bien (le .jar de pdfbox dans le build path), mais l'exécution de la version intégrée à mon appli android (le .jar de pdfbox aussi dans le build path et libs/, of course), elle, plante(?)!

    08-13 17:48:03.894: E/dalvikvm(6171): Could not find class 'org.apache.pdfbox.pdmodel.PDDocument', referenced from method PdfManager.ToText

    08-13 17:48:03.954: E/dalvikvm(6171): Could not find class 'org.apache.pdfbox.pdmodel.PDDocument', referenced from method org.apache.pdfbox.pdfparser.PDFParser.getPDDocument

    08-13 17:48:04.731: E/dalvikvm(6171): Could not find class 'org.apache.pdfbox.pdmodel.PDDocument', referenced from method org.apache.pdfbox.util.PDFTextStripper.getText

    08-13 17:48:04.743: E/dalvikvm(6171): Could not find class 'org.apache.pdfbox.pdmodel.PDPage', referenced from method org.apache.pdfbox.util.PDFTextStripper.processPages

    08-13 17:48:04.762: E/dalvikvm(6171): Could not find class 'org.apache.pdfbox.pdmodel.PDDocument', referenced from method org.apache.pdfbox.util.PDFTextStripper.writeText


    Si besoin, voilà les codes.
    Parce que de deux cotés, tous les includes y figurent bien... et si c'était bien un problème d'includes, la compil' ne passerait pas!

    DONC: un problème de config plutôt, non?

    PdfManager java standard
    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
    48
    49
    50
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.pdfbox.cos.COSDocument;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.util.PDFTextStripper;
     
    public class PdfManager {
     
       private PDFParser parser;
       private PDFTextStripper pdfStripper;
       private PDDocument pdDoc ;
       private COSDocument cosDoc ;
     
       private String Text ;
       private String filePath;
       private File file;
     
        public PdfManager() {
     
        }
       public String ToText(int pageDebut, int pageFin) throws IOException
       {
           this.pdfStripper = null;
           this.pdDoc = null;
           this.cosDoc = null;    
     
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
     
           parser.parse();
           cosDoc = parser.getDocument();
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
           pdfStripper.setStartPage(pageDebut);
           pdfStripper.setEndPage(pageFin);
     
           Text = pdfStripper.getText(pdDoc);
     
           return Text;
       }
     
        public void setFilePath(String filePath)
       {
            this.filePath = filePath;
        }
     
    }

    PdfManager android
    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
    48
    49
    50
    51
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import org.apache.pdfbox.cos.COSDocument;
    import org.apache.pdfbox.pdfparser.PDFParser;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.util.PDFTextStripper;
     
    import android.util.Log;
     
    public class PdfManager
    {
     
       private PDFParser parser;
       private PDFTextStripper pdfStripper;
       private PDDocument pdDoc ;
       private COSDocument cosDoc ;
     
       private String Text ;
       private String filePath;
       private File file;
     
     
       public PdfManager() { /* TODO Auto-generated constructor stub */ }
       public void setFilePath(String filePath) { this.filePath = filePath; }
     
     
       public String ToText(int pageDebut, int pageFin) throws IOException
       {
           this.pdfStripper = null;
           this.pdDoc = null;
           this.cosDoc = null;    
     
           file = new File(filePath);
           parser = new PDFParser(new FileInputStream(file));
     
           parser.parse();
           cosDoc = parser.getDocument();
           pdfStripper = new PDFTextStripper();
           pdDoc = new PDDocument(cosDoc);
           pdDoc.getNumberOfPages();
           pdfStripper.setStartPage(pageDebut);
           pdfStripper.setEndPage(pageFin);
     
           Text = pdfStripper.getText(pdDoc);
     
           return Text;
     
       }    //END ToText()
     
    }    //END class PdfManager

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 523
    Points : 147
    Points
    147
    Par défaut
    OK, alors SI ça peut aider qq'un d'autre:



    j'ai testé pour ma part la dernière version (pdfbox-android-1.8.7.jar), et je retrouve bien mes data!

    par contre, me retrouve avec une OutOfMemoryError (Out of memory on a 65034-byte allocation) avec mon AsyncTask.... mais ça c'est une autre histoire Android standard que je dois encore creuser!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-97] Comment récupérer les données d'un fichier PDF pour renseigner un tableau Excel
    Par jehhej dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2010, 09h04
  2. Réponses: 0
    Dernier message: 05/11/2009, 18h12
  3. Comment imprimer un fichier Pdf directement à partir de Delphi ?
    Par toumoham dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 07/12/2005, 15h28
  4. [C#] Comment imprimer un fichier .pdf ?
    Par petoulachi dans le forum C#
    Réponses: 9
    Dernier message: 05/10/2005, 15h30
  5. Réponses: 9
    Dernier message: 20/06/2005, 16h47

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