formateur informatique

Lire le contenu PDF d'une page précise à une autre

Accueil  >  Bureautique  >  Access  >  Access VBA  >  Lire le contenu PDF d'une page précise à une autre
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
Sujets que vous pourriez aussi aimer :


Lire une ou plusieurs pages PDF

Lorsque nous avions monté l'application de la visionneuse PDF sur un formulaire Access, nous avions appris à récupérer le contenu complet de ces types de fichiers. Ici, nous souhaitons réaliser des importations sélectives en définissant la page de départ et la page de fin, pour isoler des informations précises.

Base de données Access à télécharger
Pour réaliser ces travaux, nous suggérons d'appuyer l'étude sur une base de données Access offrant un formulaire permettant de désigner un fichier PDF ou Word à importer. Formulaire Access pour importer une portion de fichiers PDF et Word

Vous notez la présence d'une grande zone de texte pour accueillir les contenus des fichiers externes Word et PDF. Sur la droite, deux zones de saisie permettent de définir en valeurs numériques, les pages de départ et de fin, pour borner l'importation. Juste en-dessous, un bouton à l'icône d'un dossier doit permettre à l'utilisateur de sélectionner l'un de ces fichiers à importer depuis le disque dur.

Office et la sécurité des macros
Depuis 2022 et les dernières mises à jour, les logiciels de la gamme Office ne plaisantent plus avec la sécurité des macros. Elles ne peuvent plus s'exécuter en toute impunité. Les fichiers qui les hébergent doivent être stockés dans des emplacements approuvés. En l'occurrence, il s'agit d'un répertoire caché dans les profondeurs des réglages d'Office. Pour que nos macros, absolument inoffensives, puissent s'exécuter, nous devons intervenir sur ces paramétrages.
  • En haut à gauche de la fenêtre Access, cliquer sur le menu Fichier,
  • En bas à gauche de la liste des propositions, choisir la rubrique Options,
  • En bas de la boîte de dialogue, cliquer sur la ligne Centre de gestion de la confidentialité,
  • Cliquer alors sur le bouton Paramètres du Centre de gestion de la confidentialité,
  • Dans la nouvelle boîte de dialogue, cliquer sur la rubrique Emplacements approuvés,
  • En bas de la boîte de dialogue, cliquer sur le bouton Ajouter un nouvel emplacement,
  • Dans la zone Chemin d'accès, définir le dossier dans lequel sont placées vos sources,
Vous pouvez aussi choisir le lecteur parent.

Définir les emplacements approuvés pour l-exécution des macros Access
  • Cliquer sur les boutons Ok des boîtes de dialogue pour valider et revenir sur le formulaire,
Dans cette application, comme nous allons faire appel à une instance de Word pour accéder aux contenus des fichiers Word et PDF, les mêmes réglages, selon le même protocole, doivent être réalisés sous Microsoft Word.

La procédure VBA du bouton
Maintenant, nous pouvons débuter la conception du code. Nous devons commencer par créer la procédure à associer au bouton à l'icône du dossier. Son rôle est de récupérer le contenu d'un fichier Pdf ou Docx désigné par l'utilisateur par le biais d'une boîte de dialogue.
  • A gauche du ruban Accueil, cliquer sur la flèche du bouton Affichage,
  • Dans les propositions, choisir le mode Création,
  • Sur le formulaire en conception, sélectionner le bouton à l'icône d'un dossier,
  • Activer alors l'onglet Evénement de sa feuille de propriétés,
  • Cliquer sur le petit bouton associé à son événement Au clic,
  • Dans la boîte de dialogue, choisir le Générateur de code et valider par Ok,
Nous basculons dans l'éditeur VBA Access, entre les bornes de la procédure parcourir_Click.

Les variables
Nous avons besoin de quelques variables et d'objets notamment pour piloter une instance de Word mais aussi les boîtes de dialogue standards d'Office.
  • Dans les bornes de la procédure, ajouter les déclarations suivantes :
...
Dim boite As FileDialog: Dim chemin As String
Dim laPage As Range
Dim instanceW As Object: Dim doc As Object
...


Le premier objet (boite) doit servir à instancier la classe des boîtes de dialogue. La variable chemin doit mémoriser le chemin d'accès au fichier désigné par l'utilisateur par le biais d'une de ces boîtes de dialogue. L'objet laPage déclaré comme une plage (une zone) doit représenter la sélection du contenu à extraire depuis le fichier choisi. Les deux derniers objets sont prévus pour piloter une instance de Word et un document à l'intérieur, celui correspondant au choix de l'utilisateur.

La classe des boîtes de dialogue
Les objets étant déclarés, nous pouvons maintenant instancier la classe des boîtes de dialogue pour ouvrir celle qui permet de désigner un fichier. Et si un fichier est effectivement spécifié par l'utilisateur, alors nous pourrons choisir de poursuivre le traitement.
  • A la suite du code, ajouter les instructions VBA suivantes :
...
Set boite = Application.FileDialog(msoFileDialogFilePicker)
boite.Filters.Add "Fichiers PDF DocX", "*.pdf; *.docx", 1
If boite.Show Then chemin = boite.SelectedItems(1)

If chemin <> "" Then

End If
...


Nous exploitons la propriété FileDialog de l'objet Application avec le paramètre msoFileDialogFilePicker pour initialiser (Set) notre objet boite sur une boîte de dialogue permettant de sélectionner un fichier du disque. Ensuite, nous l'affichons à l'écran (Show). Nous récupérons le chemin d'accès du fichier désigné dans la variable chemin. C'est la propriété SelectedItems qui renvoie la collection des fichiers sélectionnés. Comme nous n'avons pas autorisé la multi sélection, nous savons que le fichier choisi est en tête de file (1). Enfin, si l'utilisateur a bien spécifié un fichier (If chemin <> "" Then), donc qu'il n'a pas cliqué sur le bouton Annuler, nous choisissons de poursuivre le traitement. Le cas échéant, le code est ainsi avorté.

L'instance de Word
Pour accéder au contenu du fichier désigné, nous devons créer une instance de Word pour l'ouvrir à l'intérieur mais en mémoire.
  • Dans l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
Set instanceW = CreateObject("Word.Application")
instanceW.Visible = False
Set doc = instanceW.Documents.Open(chemin, False, False, Format:=wdOpenFormatAuto)
...


Avec le paramètre Word.Application passé à la fonction VBA CreateObject, nous initialisons (Set) notre objet instanceW sur une nouvelle instance de Word. Grâce à sa propriété héritée Visible réglée à False, nous demandons un traitement en tâche de fond, pour qu'aucune fenêtre de Word ne se déclenche. Dès lors, nous exploitons la méthode Open de sa collection Documents pour initialiser (Set) l'objet doc sur le fichier dont il est question de récupérer une partie du contenu.

Récupérer une partie du contenu
Grâce à cette instance, nous allons maintenant pouvoir exploiter les objets et méthodes classiques du VBA Word pour définir la plage de départ et celle de fin et ainsi prélever le contenu entre ces bornes.
  • A la suite, dans l'instruction conditionnelle, ajouter les nouvelles lignes VBA suivantes :
...
instanceW.Selection.GoTo wdGoToPage, wdGoToAbsolute, depart.Value
Set laPage = instanceW.Selection.Range
instanceW.Selection.GoTo wdGoToPage, wdGoToAbsolute, fin.Value
laPage.End = instanceW.Selection.Bookmarks("\Page").Range.End
laPage.Select
...


Grâce à la méthode GoTo de l'objet Selection, nous demandons d'atteindre une page (wdGoToPage) en partant de la première (wdGoToAbsolute) du document ouvert en mémoire. Cette page est renseignée par le numéro saisi dans la première des deux zones de texte (depart). Dès lors, nous initialisons l'objet laPage sur cet emplacement. Et avec la même méthode, nous rejoignons cette fois la page dont le numéro est indiqué dans la seconde zone de saisie (fin). C'est ainsi que la propriété End de l'objet Range sur le repère de la page (\Page) et non d'une section permet d'étendre la sélection du début de la première page désignée jusqu'à la fin de la dernière. Nous réalisons la sélection en mémoire de cette plage (Select).

Importer la sélection sur le formulaire
Pour restituer la sélection sur le formulaire Access, son contenu doit être importé. Comme il est géré en mémoire, la sélection doit être copiée puis collée dans la zone de texte enrichie du formulaire.
  • A la suite du code de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
laPage.Copy
contenu.SetFocus
DoCmd.RunCommand acCmdPaste
SendKeys ("^{HOME}")
...


C'est la méthode Copy de l'objet laPage qui permet de charger la sélection en mémoire. Pour pouvoir la copier dans la zone de texte enrichie (contenu) sur le formulaire, nous la sélectionnons dans un premier temps (SetFocus). Puis, nous exploitons la méthode RunCommand de l'objet VBA Access DoCmd pour la coller (acCmdPaste). Comme ce contenu est susceptible d'être long, nous organisons une remontée pour recaler l'affichage vers le haut de la zone en simulant le raccourci CTRL + Home.

Libérer la mémoire
Pour finir de coder proprement, nous devons libérer la mémoire de l'ordinateur en fermant et en détruisant les objets de programmation qui ne sont plus utilisés.
  • A la fin et hors de l'instruction conditionnelle, ajouter les lignes VBA suivantes :
...
SendKeys ("^{HOME}")

doc.Close
instanceW.Quit

Set doc = Nothing
Set instanceW = Nothing


End If

Set boite = Nothing
...


Nous exploitons les méthodes Close et Quit pour fermer l'objet du document dans l'instance et l'instance elle-même. Ensuite, nous réinitialisons les objets (Set) à Nothing pour les sortir de la mémoire de l'ordinateur.

Importer la sélection PDF dans Access
Il est temps de tester le code d'importation sélective.
  • Enregistrer les modifications (CTRL + S) et basculer sur le formulaire (ALT + Tab),
  • L'exécuter, par exemple en enfonçant la touche F5 du clavier,
  • Cliquer sur le bouton à l'icône d'un dossier,
  • Dans la boîte de dialogue, double cliquer sur un document Word fait de quelques pages,
Après traitement, le contenu parfaitement borné entre les pages définies dans les zones de saisie pour le départ et l'arrivée, est parfaitement restitué.

Si vous réalisez la même opération sur un document PDF, vous constatez que l'importation est elle aussi réalisée mais pas forcément parfaitement. Il peut exister un décalage de quelques lignes entre le haut de la page de début et le bas de celle de fin. C'est une explication que je ne suis pas en mesure de fournir à ce jour. Le problème reste à l'étude.

Si vous changez les bornes en tapant de nouvelles valeurs numériques dans les zones de texte et que vous tentez de nouvelles importations, vous avez le plaisir de constater que vous maîtrisez l'importation sélective de fichiers externes aux formats PDF et Word dans un formulaire Access.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn