{"id":12094,"date":"2024-07-23T11:03:37","date_gmt":"2024-07-23T09:03:37","guid":{"rendered":"https:\/\/www.auditsi.eu\/?p=12094"},"modified":"2024-07-23T16:51:28","modified_gmt":"2024-07-23T14:51:28","slug":"python-et-pdf","status":"publish","type":"post","link":"https:\/\/www.auditsi.eu\/?p=12094","title":{"rendered":"Fusionner plusieurs fichiers PDF avec Python"},"content":{"rendered":"<p style=\"text-align: justify;\">Besoin de <strong>combiner plusieurs fichiers PDF<\/strong> pour n&#8217;en faire qu&#8217;un seul ? Tout <strong>en pr\u00e9servant la confidentialit\u00e9<\/strong> des fichiers PDF (et donc en \u00e9vitant les solutions en ligne) ?<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12476\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Script.png\" alt=\"Fusion PDF - Script\" width=\"733\" height=\"563\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Script.png 733w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Script-300x230.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Script-730x561.png 730w\" sizes=\"auto, (max-width: 733px) 100vw, 733px\" \/><\/p>\n<p style=\"text-align: justify;\">Le <strong>langage Python<\/strong> peut avantageusement r\u00e9aliser cette op\u00e9ration de fusion de fichiers. Le propos qui suit va le d\u00e9montrer avec un <strong>script d\u00e9cortiqu\u00e9 pas \u00e0 pas<\/strong>.<\/p>\n<p style=\"text-align: justify;\">L&#8217;<strong>ex\u00e9cutable<\/strong> du programme est propos\u00e9 <strong>en libre t\u00e9l\u00e9chargement<\/strong> en pied d&#8217;article.<\/p>\n<p style=\"text-align: justify;\"><strong><em>Fonctionnement g\u00e9n\u00e9ral du script :<\/em><\/strong><\/p>\n<p style=\"text-align: justify;\">Dans un premier temps, le programme demande \u00e0 l&#8217;utilisateur de <strong>saisir le nom du fichier PDF<\/strong> qui r\u00e9sultera de la fusion des PDF.<\/p>\n<p style=\"text-align: justify;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12470\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Input.png\" alt=\"Fusion PDF - Input\" width=\"696\" height=\"111\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Input.png 696w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Input-300x48.png 300w\" sizes=\"auto, (max-width: 696px) 100vw, 696px\" \/><\/p>\n<p style=\"text-align: justify;\">Cette action est r\u00e9alis\u00e9e \u00e0 l&#8217;aide de l&#8217;<strong>instruction <em>Input<\/em><\/strong> :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">pdf_fusionne = input (\"Saisissez le nom du fichier PDF \u00e0 g\u00e9n\u00e9rer : \")<\/pre>\n<p>Le nom du fichier est stock\u00e9 dans la variable <em>pdf_fusionne<\/em>.<\/p>\n<p>Le script ajoute l&#8217;<strong>extension <em>.pdf<\/em><\/strong> \u00e0 la variable <em>pdf_fusionne<\/em> si l&#8217;utilisateur ne l&#8217;a pas saisie :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">if pdf_fusionne[-4:]!=\".pdf\":\r\n    pdf_fusionne=pdf_fusionne + \".pdf\"<\/pre>\n<p>Ce test est r\u00e9alis\u00e9 gr\u00e2ce \u00e0 la <strong>structure conditionnelle <a href=\"https:\/\/www.auditsi.eu\/?p=1797\"><em>if&#8230; elif&#8230; else<\/em><\/a><\/strong> et \u00e0 l&#8217;utilisation aux <a href=\"https:\/\/www.auditsi.eu\/?p=10532\">op\u00e9rateurs de l&#8217;arithm\u00e9tique bool\u00e9enne<\/a> :<\/p>\n<table>\n<thead>\n<tr>\n<th>Op\u00e9rateur<\/th>\n<th>D\u00e9finition<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>==<\/td>\n<td>Permet de tester l\u2019\u00e9galit\u00e9 entre deux valeurs<\/td>\n<\/tr>\n<tr>\n<td>!=<\/td>\n<td>Permet de tester la diff\u00e9rence entre deux valeurs<\/td>\n<\/tr>\n<tr>\n<td>&lt;<\/td>\n<td>Permet de tester si une valeur est strictement inf\u00e9rieure \u00e0 une autre<\/td>\n<\/tr>\n<tr>\n<td>&gt;<\/td>\n<td>Permet de tester si une valeur est strictement sup\u00e9rieure \u00e0 une autre<\/td>\n<\/tr>\n<tr>\n<td>&lt;=<\/td>\n<td>Permet de tester si une valeur est inf\u00e9rieure ou \u00e9gale \u00e0 une autre<\/td>\n<\/tr>\n<tr>\n<td>&gt;=<\/td>\n<td>Permet de tester si une valeur est sup\u00e9rieure ou \u00e9gale \u00e0 une autre<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: justify;\">L&#8217;utilisateur est ensuite invit\u00e9 \u00e0 <strong>s\u00e9lectionner le dossier contenant les fichiers PDF \u00e0 combiner<\/strong> :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12471\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-selection-dossier.png\" alt=\"Fusion PDF - s\u00e9lection dossier\" width=\"726\" height=\"507\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-selection-dossier.png 726w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-selection-dossier-300x210.png 300w\" sizes=\"auto, (max-width: 726px) 100vw, 726px\" \/><\/p>\n<p style=\"text-align: justify;\">Le nom du dossier s\u00e9lectionn\u00e9 (fonction <em>diropenbox<\/em>) est stock\u00e9 dans la variable <em>chemin_PDF<\/em> :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Bo\u00eete de dialogue de s\u00e9lection d'un dossier de fichiers PDF\r\nchemin_PDF = easygui.diropenbox(title=\"S\u00e9lectionner le dossier contenant les fichiers PDF \u00e0 fusionner\", default=chemin_PDF)<\/pre>\n<p style=\"text-align: justify;\">Le script appelle la fonction <em>collecte_fichiers_pdf<\/em> qui liste tous les fichiers PDF contenu dans le dossier s\u00e9lectionn\u00e9 par l&#8217;utilisateur.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Appel de la fonction liste_fichiers_pdf\r\nliste_fichiers_pdf = collecte_liste_fichiers_pdf(chemin_PDF)<\/pre>\n<p style=\"text-align: justify;\">Cette fonction passe en revue tous les fichiers \u00e0 l&#8217;aide d&#8217;une boucle compteur (<em>for nom_fichier_en_cours in os.listdir(dossier):<\/em>) et ne retient que les fichiers PDF (<em>nom_fichier_en_cours.lower().endswith(&#8216;.pdf&#8217;):<\/em>).<\/p>\n<p style=\"text-align: justify;\">Le programme affiche progressivement les fichiers retenus (ou non) :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12472\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-PDF-inclus.png\" alt=\"Fusion PDF - PDF inclus\" width=\"931\" height=\"250\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-PDF-inclus.png 931w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-PDF-inclus-300x81.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-PDF-inclus-768x206.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-PDF-inclus-730x196.png 730w\" sizes=\"auto, (max-width: 931px) 100vw, 931px\" \/><\/p>\n<p style=\"text-align: justify;\">C&#8217;est la commande <em>print()<\/em> qui permet l&#8217;<strong>affichage du texte<\/strong>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(\"-\" * 85)\r\nprint(\"Liste des fichiers PDF inclus dans la fusion :\")\r\nprint()<\/pre>\n<p style=\"text-align: justify;\">La commande print(&#8220;-&#8221; * 85) permet de dessiner une ligne en r\u00e9p\u00e9tant 85 fois l&#8217;affichage du signe moins. Rudimentaire mais efficace.<\/p>\n<p style=\"text-align: justify;\">La <strong>tabulation<\/strong> est introduite devant les libell\u00e9s &#8220;Nombre de pages&#8221; et Auteur du document&#8221; par la s\u00e9quence d&#8217;\u00e9chappement \\t :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">print(f\"\\tNombre de pages : {pages}\")\r\n<\/pre>\n<p style=\"text-align: justify;\">Les <strong>op\u00e9rations de fusion de fichiers PDF<\/strong> sont r\u00e9alis\u00e9es \u00e0 l&#8217;aide de l&#8217;objet <em>merger<\/em> cr\u00e9\u00e9 sp\u00e9cialement \u00e0 l&#8217;aide de <em>PyPDF2.PdfMerger()<\/em>, de la boucle <em>for pdf_en_cours in liste_fichiers_pdf:<\/em> qui ajoute tour \u00e0 tour tous les fichiers PDF (<em>merger.append(chemin_PDF + pdf_en_cours)<\/em> dans l&#8217;instance de fusion). Enfin, <em>merger.write(chemin_projet + pdf_fusionne)<\/em> fusionne les fichiers pr\u00e9sents dans l&#8217;instance et <em>merger.close()<\/em> cl\u00f4ture le fichier PDF rendu ainsi accessible \u00e0 l&#8217;utilisateur.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># Cr\u00e9ation d'un objet merger (fusion)\r\nmerger = PyPDF2.PdfMerger()\r\n\r\n[...]\r\n \r\n# Boucle sur la liste des fichiers \u00e0 fusionner\r\nfor pdf_en_cours in liste_fichiers_pdf:\r\n    [...]\r\n\r\n    # Ajout du PDF \u00e0 la cha\u00eene de fusion\r\n    merger.append(chemin_PDF + pdf_en_cours)\r\n\r\n# Fusion des fichiers et fermeture de l'objet\r\nmerger.write(chemin_projet + pdf_fusionne)\r\nmerger.close()\r\n<\/pre>\n<p style=\"text-align: justify;\">Enfin, le programme affiche le message &#8220;Traitement termin\u00e9&#8221; indiquant que les op\u00e9rations sont achev\u00e9es :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12473\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Fin.png\" alt=\"Fusion PDF - Fin\" width=\"708\" height=\"98\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Fin.png 708w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/Fusion-PDF-Fin-300x42.png 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/p>\n<p style=\"text-align: justify;\"><strong><em>Script complet du projet :<\/em><\/strong><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># -------------------------------------------------------------------------------------------\r\n# Fusion de plusieurs PDF\r\n# v1 11\/2023\r\n# B. RIVIERE\r\n# Plus d'infos : https:\/\/www.auditsi.eu\/?p=12094\r\n# -------------------------------------------------------------------------------------------\r\n\r\n\r\n# Chargement des biblioth\u00e8ques additionnelles\r\nimport PyPDF2\r\nimport os\r\nimport easygui\r\n\r\n# Liste les fichiers PDF contenus dans un dossier\r\ndef collecte_liste_fichiers_pdf(dossier):\r\n    # D\u00e9claration variable stockage noms des fichiers PDF\r\n    liste_fichiers_pdf = []\r\n\r\n    print(\"-\" * 85)\r\n    print(\"Liste des fichiers pr\u00e9sents dans le dossier \" + dossier + \" :\")\r\n    \r\n    # Boucle sur les fichiers du dossier\r\n    for nom_fichier_en_cours in os.listdir(dossier):\r\n        chemin_fichier = os.path.join(dossier, nom_fichier_en_cours)\r\n\r\n        # Affiche le nom du fichier en cours\r\n        print(\"\\t\" + chemin_fichier + \" : \",end=\"\")\r\n\r\n        # V\u00e9rifie si le fichier en cours est un fichier PDF\r\n        if os.path.isfile(chemin_fichier) and nom_fichier_en_cours.lower().endswith('.pdf'):\r\n            liste_fichiers_pdf.append(nom_fichier_en_cours)\r\n            print(\"fichier PDF\")\r\n        else:\r\n            print(\"fichier non PDF\")\r\n\r\n    print()\r\n    return liste_fichiers_pdf\r\n\r\n# Collecte des informations d'un fichier PDF\r\ndef collecte_infos_pdf(chemin_fichier):\r\n    # Ouverture du fichier PDF en mode binaire\r\n    with open(chemin_fichier, 'rb') as fichier_pdf:\r\n        # Cr\u00e9ation d'un objet PdfReader\r\n        lecteur_pdf = PyPDF2.PdfReader(fichier_pdf)\r\n\r\n        # Lecture nombre de pages\r\n        nombre_pages =len(lecteur_pdf.pages)\r\n\r\n        # Obtention des m\u00e9tadonn\u00e9es du document\r\n        metadonnees = lecteur_pdf.metadata\r\n        \r\n        # Extraction du nom de l'auteur du PDF (s'il est disponible)\r\n        auteur = \"Auteur non sp\u00e9cifi\u00e9\"  # Valeur par d\u00e9faut\r\n        if metadonnees is not None and metadonnees.get('\/Author'):\r\n            auteur = metadonnees.author\r\n\r\n    return nombre_pages, auteur\r\n\r\nprint(\"-\" * 85)\r\nprint(\"Ce programme fusionne tous les fichiers PDF pr\u00e9sents dans un dossier.\")\r\nprint(\"D\u00e9velopp\u00e9 par Beno\u00eet RIVIERE (v1.0 11\/2023) - www.auditsi.eu\")\r\nprint()\r\n\r\n# Obtention du nom du document PDF fusionn\u00e9\r\npdf_fusionne = input (\"Saisissez le nom du fichier PDF \u00e0 g\u00e9n\u00e9rer : \")\r\nif pdf_fusionne==\"\":\r\n    pdf_fusionne = \"PDF fusionn\u00e9\"\r\nif pdf_fusionne[-4:]!=\".pdf\":\r\n    pdf_fusionne=pdf_fusionne + \".pdf\"\r\n\r\nprint()\r\n\r\n# Chemin d'acc\u00e8s au projet\r\nchemin_projet = os.getcwd() + '\\\\'\r\n\r\n# Chemin d'acc\u00e8s par d\u00e9faut aux fichiers PDF \u00e0 fusionner\r\nchemin_PDF = chemin_projet + 'Dossier des PDF \u00e0 fusionner'\r\n\r\n#\r\nprint(\"S\u00e9lectionnez le dossier contenant les fichiers PDF \u00e0 fusionner :\")\r\n\r\n# Bo\u00eete de dialogue de s\u00e9lection d'un dossier de fichiers PDF\r\nchemin_PDF = easygui.diropenbox(title=\"S\u00e9lectionner le dossier contenant les fichiers PDF \u00e0 fusionner\", default=chemin_PDF)\r\nchemin_PDF = chemin_PDF + \"\\\\\"\r\n\r\n# Affichage du nom du dossier s\u00e9lectionn\u00e9\r\nprint(\"Dossier s\u00e9lectionn\u00e9 :\", chemin_PDF)\r\n\r\nprint()\r\n\r\n# Appel de la fonction liste_fichiers_pdf\r\nliste_fichiers_pdf = collecte_liste_fichiers_pdf(chemin_PDF)\r\n\r\n# Cr\u00e9ation d'un objet merger (fusion)\r\nmerger = PyPDF2.PdfMerger()\r\n\r\nprint(\"-\" * 85)\r\nprint(\"Liste des fichiers PDF inclus dans la fusion :\")\r\nprint()\r\n \r\n# Boucle sur la liste des fichiers \u00e0 fusionner\r\nfor pdf_en_cours in liste_fichiers_pdf:\r\n    # Appel de la fonction collecte_infos_pdf\r\n    pages, auteur = collecte_infos_pdf(chemin_PDF + pdf_en_cours)\r\n\r\n    # Affichage des infos\r\n    print(\"Information du fichier : \" + pdf_en_cours)\r\n    print(f\"\\tNombre de pages : {pages}\")\r\n    print(f\"\\tAuteur du document : {auteur}\")\r\n    print()\r\n\r\n    # Ajout du PDF \u00e0 la cha\u00eene de fusion\r\n    merger.append(chemin_PDF + pdf_en_cours)\r\n\r\n# Fusion des fichiers et fermeture de l'objet\r\nmerger.write(chemin_projet + pdf_fusionne)\r\nmerger.close()\r\n\r\n# Appel de la fonction collecte_infos_pdf\r\npages, auteur = collecte_infos_pdf(chemin_projet + pdf_fusionne)\r\n\r\n# Affichage des infos du PDF fusionn\u00e9\r\nprint(\"-\" * 85)\r\nprint(\"Information du fichier PDF fusionn\u00e9 : \" + pdf_fusionne)\r\nprint(f\"\\tNombre de pages : {pages}\")\r\nprint(f\"\\tAuteur du document : {auteur}\")\r\nprint()\r\nprint(\"Traitement termin\u00e9\")<\/pre>\n<p style=\"text-align: justify;\">J&#8217;ai r\u00e9dig\u00e9 ce script avec l&#8217;aide de <a href=\"https:\/\/www.auditsi.eu\/?p=11605\">ChatGPT<\/a>. Cet outil est une aide appr\u00e9ciable pour apprendre, pour aller plus vite, gagner en productivit\u00e9. A ce sujet, ChatGPT peut analyser le contenu de fichiers pour nous, \u00e0 l&#8217;image d&#8217;une photo :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12467\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/CHATGPT-INTERPRETATION-PHOTO-CHATS.png\" alt=\"CHATGPT INTERPRETATION PHOTO CHATS\" width=\"718\" height=\"1243\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/CHATGPT-INTERPRETATION-PHOTO-CHATS.png 718w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/CHATGPT-INTERPRETATION-PHOTO-CHATS-173x300.png 173w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/07\/CHATGPT-INTERPRETATION-PHOTO-CHATS-591x1024.png 591w\" sizes=\"auto, (max-width: 718px) 100vw, 718px\" \/><\/p>\n<p style=\"text-align: justify;\">Bluffant, non ? Qui de mieux que ChatGPT pour parler de chat ? \ud83d\ude42<\/p>\n<p style=\"text-align: justify;\">Tous les articles en rapport avec le <a href=\"https:\/\/www.auditsi.eu\/?tag=python\">langage Python<\/a> \/ les <a href=\"https:\/\/www.auditsi.eu\/?tag=fichier-pdf\">fichiers PDF<\/a><\/p>\n<p style=\"text-align: justify;\">___<\/p>\n<p style=\"text-align: justify;\">Pour approfondir le sujet :&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?p=12059\">se former \u00e0 la programmation en langage Python pour automatiser ses t\u00e2ches<\/a><\/p>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Fusionner%20plusieurs%20fichiers%20PDF%20avec%20Python\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>Besoin de combiner plusieurs fichiers PDF pour n&#8217;en faire qu&#8217;un seul ? Tout en pr\u00e9servant la confidentialit\u00e9 des fichiers PDF (et donc en \u00e9vitant les solutions en ligne) ? Le langage Python peut avantageusement r\u00e9aliser cette op\u00e9ration de fusion de fichiers. Le propos qui suit va le d\u00e9montrer avec un script d\u00e9cortiqu\u00e9 pas \u00e0 pas. &#8230;<\/p>\n<p><a href=\"https:\/\/www.auditsi.eu\/?p=12094\" class=\"more-link\">Continue reading &lsquo;Fusionner plusieurs fichiers PDF avec Python&rsquo; &raquo;<\/a><\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Fusionner%20plusieurs%20fichiers%20PDF%20avec%20Python\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3087],"tags":[166,2796,2872,307,3136,895,1693,894,723,3257,3088,2050,222],"class_list":["post-12094","post","type-post","status-publish","format-standard","hentry","category-python","tag-analyse-de-donnees","tag-arithmetique-booleenne","tag-chatgpt","tag-fichier-pdf","tag-if-elif-else","tag-input","tag-operateurs-arithmetiques","tag-print","tag-productivite","tag-pypdf2","tag-python","tag-tabulation","tag-tests-conditionnels"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12094","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12094"}],"version-history":[{"count":15,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12094\/revisions"}],"predecessor-version":[{"id":12482,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12094\/revisions\/12482"}],"wp:attachment":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12094"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12094"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12094"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}