Besoin de combiner plusieurs fichiers PDF pour n’en faire qu’un seul ? Tout en préservant la confidentialité des fichiers PDF (et donc en évitant les solutions en ligne) ?
Le langage Python peut avantageusement réaliser cette opération de fusion de fichiers. Le propos qui suit va le démontrer avec un script décortiqué pas à pas.
L’exécutable du programme est proposé en libre téléchargement en pied d’article.
Fonctionnement général du script :
Dans un premier temps, le programme demande à l’utilisateur de saisir le nom du fichier PDF qui résultera de la fusion des PDF.
Cette action est réalisée à l’aide de l’instruction Input :
pdf_fusionne = input ("Saisissez le nom du fichier PDF à générer : ")
Le nom du fichier est stocké dans la variable pdf_fusionne.
Le script ajoute l’extension .pdf à la variable pdf_fusionne si l’utilisateur ne l’a pas saisie :
if pdf_fusionne[-4:]!=".pdf": pdf_fusionne=pdf_fusionne + ".pdf"
Ce test est réalisé grâce à la structure conditionnelle if… elif… else et à l’utilisation aux opérateurs de l’arithmétique booléenne :
Opérateur | Définition |
---|---|
== | Permet de tester l’égalité entre deux valeurs |
!= | Permet de tester la différence entre deux valeurs |
< | Permet de tester si une valeur est strictement inférieure à une autre |
> | Permet de tester si une valeur est strictement supérieure à une autre |
<= | Permet de tester si une valeur est inférieure ou égale à une autre |
>= | Permet de tester si une valeur est supérieure ou égale à une autre |
L’utilisateur est ensuite invité à sélectionner le dossier contenant les fichiers PDF à combiner :
Le nom du dossier sélectionné (fonction diropenbox) est stocké dans la variable chemin_PDF :
# Boîte de dialogue de sélection d'un dossier de fichiers PDF chemin_PDF = easygui.diropenbox(title="Sélectionner le dossier contenant les fichiers PDF à fusionner", default=chemin_PDF)
Le script appelle la fonction collecte_fichiers_pdf qui liste tous les fichiers PDF contenu dans le dossier sélectionné par l’utilisateur.
# Appel de la fonction liste_fichiers_pdf liste_fichiers_pdf = collecte_liste_fichiers_pdf(chemin_PDF)
Cette fonction passe en revue tous les fichiers à l’aide d’une boucle compteur (for nom_fichier_en_cours in os.listdir(dossier):) et ne retient que les fichiers PDF (nom_fichier_en_cours.lower().endswith(‘.pdf’):).
Le programme affiche progressivement les fichiers retenus (ou non) :
C’est la commande print() qui permet l’affichage du texte.
print("-" * 85) print("Liste des fichiers PDF inclus dans la fusion :") print()
La commande print(“-” * 85) permet de dessiner une ligne en répétant 85 fois l’affichage du signe moins. Rudimentaire mais efficace.
La tabulation est introduite devant les libellés “Nombre de pages” et Auteur du document” par la séquence d’échappement \t :
print(f"\tNombre de pages : {pages}")
Les opérations de fusion de fichiers PDF sont réalisées à l’aide de l’objet merger créé spécialement à l’aide de PyPDF2.PdfMerger(), de la boucle for pdf_en_cours in liste_fichiers_pdf: qui ajoute tour à tour tous les fichiers PDF (merger.append(chemin_PDF + pdf_en_cours) dans l’instance de fusion). Enfin, merger.write(chemin_projet + pdf_fusionne) fusionne les fichiers présents dans l’instance et merger.close() clôture le fichier PDF rendu ainsi accessible à l’utilisateur.
# Création d'un objet merger (fusion) merger = PyPDF2.PdfMerger() [...] # Boucle sur la liste des fichiers à fusionner for pdf_en_cours in liste_fichiers_pdf: [...] # Ajout du PDF à la chaîne de fusion merger.append(chemin_PDF + pdf_en_cours) # Fusion des fichiers et fermeture de l'objet merger.write(chemin_projet + pdf_fusionne) merger.close()
Enfin, le programme affiche le message “Traitement terminé” indiquant que les opérations sont achevées :
Script complet du projet :
# ------------------------------------------------------------------------------------------- # Fusion de plusieurs PDF # v1 11/2023 # B. RIVIERE # Plus d'infos : https://www.auditsi.eu/?p=12094 # ------------------------------------------------------------------------------------------- # Chargement des bibliothèques additionnelles import PyPDF2 import os import easygui # Liste les fichiers PDF contenus dans un dossier def collecte_liste_fichiers_pdf(dossier): # Déclaration variable stockage noms des fichiers PDF liste_fichiers_pdf = [] print("-" * 85) print("Liste des fichiers présents dans le dossier " + dossier + " :") # Boucle sur les fichiers du dossier for nom_fichier_en_cours in os.listdir(dossier): chemin_fichier = os.path.join(dossier, nom_fichier_en_cours) # Affiche le nom du fichier en cours print("\t" + chemin_fichier + " : ",end="") # Vérifie si le fichier en cours est un fichier PDF if os.path.isfile(chemin_fichier) and nom_fichier_en_cours.lower().endswith('.pdf'): liste_fichiers_pdf.append(nom_fichier_en_cours) print("fichier PDF") else: print("fichier non PDF") print() return liste_fichiers_pdf # Collecte des informations d'un fichier PDF def collecte_infos_pdf(chemin_fichier): # Ouverture du fichier PDF en mode binaire with open(chemin_fichier, 'rb') as fichier_pdf: # Création d'un objet PdfReader lecteur_pdf = PyPDF2.PdfReader(fichier_pdf) # Lecture nombre de pages nombre_pages =len(lecteur_pdf.pages) # Obtention des métadonnées du document metadonnees = lecteur_pdf.metadata # Extraction du nom de l'auteur du PDF (s'il est disponible) auteur = "Auteur non spécifié" # Valeur par défaut if metadonnees is not None and metadonnees.get('/Author'): auteur = metadonnees.author return nombre_pages, auteur print("-" * 85) print("Ce programme fusionne tous les fichiers PDF présents dans un dossier.") print("Développé par Benoît RIVIERE (v1.0 11/2023) - www.auditsi.eu") print() # Obtention du nom du document PDF fusionné pdf_fusionne = input ("Saisissez le nom du fichier PDF à générer : ") if pdf_fusionne=="": pdf_fusionne = "PDF fusionné" if pdf_fusionne[-4:]!=".pdf": pdf_fusionne=pdf_fusionne + ".pdf" print() # Chemin d'accès au projet chemin_projet = os.getcwd() + '\\' # Chemin d'accès par défaut aux fichiers PDF à fusionner chemin_PDF = chemin_projet + 'Dossier des PDF à fusionner' # print("Sélectionnez le dossier contenant les fichiers PDF à fusionner :") # Boîte de dialogue de sélection d'un dossier de fichiers PDF chemin_PDF = easygui.diropenbox(title="Sélectionner le dossier contenant les fichiers PDF à fusionner", default=chemin_PDF) chemin_PDF = chemin_PDF + "\\" # Affichage du nom du dossier sélectionné print("Dossier sélectionné :", chemin_PDF) print() # Appel de la fonction liste_fichiers_pdf liste_fichiers_pdf = collecte_liste_fichiers_pdf(chemin_PDF) # Création d'un objet merger (fusion) merger = PyPDF2.PdfMerger() print("-" * 85) print("Liste des fichiers PDF inclus dans la fusion :") print() # Boucle sur la liste des fichiers à fusionner for pdf_en_cours in liste_fichiers_pdf: # Appel de la fonction collecte_infos_pdf pages, auteur = collecte_infos_pdf(chemin_PDF + pdf_en_cours) # Affichage des infos print("Information du fichier : " + pdf_en_cours) print(f"\tNombre de pages : {pages}") print(f"\tAuteur du document : {auteur}") print() # Ajout du PDF à la chaîne de fusion merger.append(chemin_PDF + pdf_en_cours) # Fusion des fichiers et fermeture de l'objet merger.write(chemin_projet + pdf_fusionne) merger.close() # Appel de la fonction collecte_infos_pdf pages, auteur = collecte_infos_pdf(chemin_projet + pdf_fusionne) # Affichage des infos du PDF fusionné print("-" * 85) print("Information du fichier PDF fusionné : " + pdf_fusionne) print(f"\tNombre de pages : {pages}") print(f"\tAuteur du document : {auteur}") print() print("Traitement terminé")
J’ai rédigé ce script avec l’aide de ChatGPT. Cet outil est une aide appréciable pour apprendre, pour aller plus vite, gagner en productivité. A ce sujet, ChatGPT peut analyser le contenu de fichiers pour nous, à l’image d’une photo :
Bluffant, non ? Qui de mieux que ChatGPT pour parler de chat ? 🙂
Tous les articles en rapport avec le langage Python / les fichiers PDF
___
Pour approfondir le sujet : se former à la programmation en langage Python pour automatiser ses tâches


Derniers articles parBenoît RIVIERE (voir tous)
- Pappers International : Une révolution dans l’accès aux données des entreprises européennes - dimanche 9 mars 2025
- Projet IXP (v1.21beta) : nouvelle version en ligne - mardi 7 janvier 2025
- Excel : conserver les zéros non significatifs à gauche - dimanche 5 janvier 2025
- Excellente année 2025 ! - mercredi 1 janvier 2025
- Projet IXP (v1.21beta) : contrôles de cohérences et gestion MULTIFEC - lundi 30 décembre 2024