Lo Furòl

... de l'ouverture (en occitan)

Vous êtes ici : Accueil / Logiciels Libres / Extraire les données structurées (un tableau par exemple) d'un document PDF

Extraire les données structurées (un tableau par exemple) d'un document PDF

Il peut arriver qu'on ait besoin d'extraire rapidement des données d'un tableau contenu dans un document .pdf afin de pouvoir s'en servir dans un tableur classique pour faire de nouveaux calculs ou du publipostage par exemple. Ça peut aussi être utile pour récupérer des données disposées régulièrement sur une page (comme par exemple des cartes de codes de connexion contenues sur une page A4... parce qu'un export .csv n'est pas proposé... pour de mauvaises raisons sécuritaires compliquant la vie des gestionnaires... la preuve).

Comme très souvent, il existe une application libre (merci à ses développeurs) fonctionnant avec JAVA permettant de nous simplifier la vie. Cette application s'appelle Tabula et fonctionne sous GNU/Linux mais aussi sous des OS privateurs. Au départ, elle est destinée aux journalistes pour leur permettre, dans le cadre de leurs investigations, d'exploiter plus facilement des tableaux de données qu'ils pourraient récupérer...


Ce qui peut paraître surprenant, c'est que Tabula fonctionne à travers le navigateur Web comme Mozilla Firefox mais en local (il n'y a aucun échange avec le monde extérieur).

Avertissement : Il faut que le fichier de départ soit un fichier .pdf de type texte (c'est à dire un .pdf sur lequel on peut sélectionner le texte). Tabula ne fonctionnera pas avec un .pdf de type image obtenu via un scanner par exemple (il faudra trouver une autre solution ...).

I- Téléchargement, installation et lancement de Tabula

Vous pouvez télécharger Tabula ici en choisissant la version correspondant à votre système d'exploitation (OS) : http://tabula.technology/

Une fois le téléchargement terminé, il faut décompresser (extraire) le fichier et se placer dans le répertoire "Tabula" nouvellement créé contenant le programme.

 Voici les instructions permettant d'utiliser Tabula :

### Windows (tabula-win.zip)
Open tabula.exe and a browser should automatically open to http://127.0.0.1:8080/ . If not, open your web browser of choice and visit that URL.

### Mac OS X (tabula-mac.zip)
Open the Tabula app and a browser should automatically open to http://127.0.0.1:8080/ . If not, open your web browser of choice and visit that URL.

### JAR file for Linux/Other (tabula-jar.zip)
Open a terminal window, and `cd` to inside this `tabula` directory, then run the following command :
  java -Dfile.encoding=utf-8 -Xms256M -Xmx1024M -jar tabula.jar
Then, manually open your web browser to http://127.0.0.1:8080/ to access the Tabula interface. Tabula binds to port 8080 by default. You can change it with the `warbler.port` option; for example, if you want to use port 9999:
  java -Dfile.encoding=utf-8 -Xms256M -Xmx1024M -Dwarbler.port=9999 -jar tabula.jar
(You can enable the old "automatically open browser" behavior by using the `-Dtabula.openBrowser=true` option.)

Pour les rétifs à l'anglais Wink , voici des explications compréhensibles permettant de lancer Tabula sous GNU/Linux (j'omets les "subtilités" qui n'intéresseront que les "experts"... qui devraient arriver à se dépatouiller avec la langue de Shakespeare ci-dessus) :

Il vous faut ouvrir un terminal dans le dossier "Tabula" : sous Ubuntu, ça se fait très rapidement en faisant un clic droit sur le répertoire de Tabula et en choisissant "Ouvrir dans un terminal". Ensuite, il suffit de taper cette commande :

  java -Dfile.encoding=utf-8 -Xms256M -Xmx1024M -jar tabula.jar

II- Utilisation de Tabula

Après quelques instants (il faut quelques secondes pour que le programme se lance), il ne vous reste plus qu'à ouvrir votre navigateur Internet et de taper dans la barre d'adresse (ou de cliquer sur le lien suivant)  http://localhost:8080 (ou http://127.0.0.1:8080, ce qui est la même chose) et de suivre les instructions.

Tabula pdf1

Pour mes cartes, sur la première page, j'ai tracé 2 zones (car j'avais 2 colonnes de 4 cartes chacune). Il est ensuite possible de reproduire le même tracé sur toutes les autres pages en cliquant en bas de chaque cadre sur "Repeat this Selection" (gain de temps).
Il est aussi possible de réajuster par la suite ces cadres individuellement.
Amélioration : en fait, il est encore plus simple de tracer 8 zones ne contenant que les parties qui nous intéressent et de les reproduire sur toutes les pages (moins de données inutiles à éliminer par la suite).

Ensuite on lance le processus en cliquant sur le bouton vert en haut "Preview & Export Extracted Data".
On pourra obtenir un fichier .csv exploitable dans un tableur ou des données dans notre presse-papier pour les coller par la suite.

Parfois, il sera toutefois nécessaire de faire quelques ajustements...

Remarque : pour fermer le programme Tabula, il faut se replacer dans le terminal et d'utiliser le raccourci clavier (combinaison de touches) CTRL-C

III- Nettoyage, restructuration des données dans le tableur LibreOffice Calc :

Préambule : Il n'y a aucune macro à activer, tout se fait à partir de fonctions intégrées.

Nous avons donc obtenu les informations qui nous intéresse sur une seule colonne, la colonne A avec des données structurées de la sorte :
- Prénom Nom
- Identifiant
- Mot de passe
- Prénom Nom
- Identifiant
- Mot de passe
-etc.

Ce n'est pas encore exploitable en l'état. Mais là aussi, il existe des fonctions formidables dans le tableur LibreOffice Calc permettant de simplifier la tâche.

a) Suppression des espaces indésirables

Tabula pdf2

Malheureusement, l'extraction des données n'est pas parfaite : par exemple dans mon cas, les logins et les codes contiennent des espaces qui n'existent pas au départ.
Par contre, il ne faudrait pas que ce nettoyage se produise pour les cellules contenant le prénom et le nom qui doivent avoir toujours un espace entre eux. Donc on affichera dans la cellule B1, la même chaîne que dans la cellule A1.
Pour cela, on écrira dans la cellule B1, la formule : =A1 .

Par contre, Il faut supprimer tous les espaces introduits pour l'identifiant. On le fera grâce à la fonction "SUBSTITUE" (ou SUBSTITUTE dans la version en anglais) qui permet de substituer une chaîne de caractères par une autre.
Qu'à cela ne tienne, il suffit d'utiliser dans la cellule B2, la formule : =SUBSTITUE(A2;" ";"")
qui affiche dans la cellule B2, la chaîne de caractères contenue dans la cellule A2 en supprimant les espaces.
On fera la même chose dans la cellule B3 pour le mot de passe : pour cela, on recopie la formule grâce à la poignée de recopie (petit carré noir au coin en bas à droite de la cellule B2, qu'il faut faire glisser vers la cellule B3). De cette façon, la formule est recopiée ET actualisée : les coordonnées de la cellule utilisée dans la formule s'adaptent à cette nouvelle ligne (on voit que A2 est devenu A3).

Toutes ces manipulations sont bien belles mais elles ne portent que sur les 3 premières lignes (le 1er élève). Il faudrait le refaire pour tous les élèves suivants.
Tabula pdf3C'est là où on voit toute la puissance de la poignée de recopie qui va comprendre "toute seule" quelle formule utiliser : soit simplement copier, soit copier en supprimant les espaces. La régularité des données fait que l'on doit faire la même chose toutes les 3 lignes.

On va donc sélectionner les 3 premières cellules de la colonne B qui contiennent les formules permettant d'afficher maintenant correctement les données extraites du pdf de départ.
Puis, on va utiliser la poignée de recopie (encore elle) en bas à droite de la sélection en la faisant glisser jusqu'à la dernière ligne contenant les données à traiter.
Et là, par magie, lorsque l'on relâche la souris, notre colonne B contient désormais des données utilisables.

 Maintenant ça serait bien que ces données soient réparties sur 3 colonnes...

b) Distribuer les informations sur plusieurs colonnes (fonction TRANSPOSE)

Là aussi, nous allons utiliser une fonction intégrée dans LibreOffice Calc qui est "TRANSPOSE" et qui permet de passer d'un tableau organisé en colonnes en un tableau organisé par lignes ou vice-versa. J'ai trouvé cette information sur le forum français de LibreOffice sur le fil "Transposer des groupes de lignes" ici : https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=52444

Tabula pdf4

 On sélectionne les 3 cellules adjacentes D1:F1. On écrit dans la barre de formule la formule matricielle suivante (on le voit car la formule est encadrée par des accolades { } ) :

=TRANSPOSE(DECALER(B1:B3;2*(LIGNE(B1)-1);0))

IMPORTANT : On doit valider la formule avec la combinaison des 3 touches "Maj-CTRL-Entrée" (cela indique que l'on utilise une fonction matricielle).

On a maintenant sur 1 même ligne les informations du 1er élève.

Tabula pdf5

 

En réutilisant encore la poignée de recopie du bloc de cellules sélectionnées D1:F1, en la faisant glisser vers le bas mais cette fois-ci en maintenant enfoncée en même temps la touche CTRL (très important sinon vous obtiendrez des erreurs), on va obtenir les informations pour les élèves suivants.

Les données sont à présent exploitables ou presque ( il faut recopier la partie qui nous intéresse sur une autre feuille en collant uniquement les données, pas les formules, ...) pour du publipostage par exemple.Tabula pdf6

Vous êtes ici : Accueil / Logiciels Libres / Extraire les données structurées (un tableau par exemple) d'un document PDF