Partage
  • Partager sur Facebook
  • Partager sur Twitter

Effacer des mot et prix particuliers dans un pdf

    9 janvier 2024 à 11:36:09

    Bonjour, j'essaie de créer un programme python qui efface des "détails de factures" de la partie droite de chaque page des pdf concernés:

     import fitz
    import tkinter as tk
    from tkinter import filedialog, messagebox
    from PIL import Image, ImageTk
    import os
    
    def delete_words():
        pdf_document = filedialog.askopenfilename(title="Sélectionnez un fichier PDF ")
    
        mots_a_supprimer = [
            # Ajoutez ici les mots que vous souhaitez supprimer dans le PDF
        "mot1",
        "mot2",
        "mot3",
        "mot4"
        ]
    
        try:
            pdf = fitz.open(pdf_document)
    
            for page in pdf:
                for mot in mots_a_supprimer:
                    text_instances = page.search_for(mot)
                    for inst in text_instances:
                        annot = page.add_redact_annot(inst)
                        page.apply_redactions()
    
            # Obtenez le dossier de téléchargement par défaut sur Windows
            download_folder = os.path.join(os.path.expanduser("~"), "Downloads")
    
            # Nom du fichier modifié
            pdf_output = os.path.join(download_folder, "PDF_modifié.pdf")
    
            # Sauvegarder le fichier modifié dans le dossier de téléchargement par défaut
            pdf.save(pdf_output)
            pdf.close()
            messagebox.showinfo("Succès", "Fichier modifié enregistré dans le dossier de téléchargement!")
        except Exception as e:
            messagebox.showerror("Erreur", f"Une erreur s'est produite : {e}")
    
    root = tk.Tk()
    root.title("Effaceur de mots dans un PDF")
    
    # Charger l'image en arrière-plan
    bg_image = Image.open("loda.jpg")
    bg_image = bg_image.resize((1280, 853))
    tk_image = ImageTk.PhotoImage(bg_image)
    
    # Créer un Canvas pour placer l'image en arrière-plan
    canvas = tk.Canvas(root, width=1280, height=853)
    canvas.pack()
    
    canvas.create_image(0, 0, image=tk_image, anchor="nw")
    
    # Créer un cadre à l'intérieur du Canvas
    frame = tk.Frame(canvas, bg='white', width=300, height=100)
    frame.place(relx=0.5, rely=0.1, anchor=tk.CENTER)
    
    # Créer un bouton pour sélectionner le fichier PDF
    button = tk.Button(frame, text="Sélectionnez un fichier PDF", command=delete_words)
    button.pack(padx=10, pady=10)
    
    root.mainloop()



    Malheureusement, je ne sais pas comment on fait pour supprimer seulement les mots de la partie droite des pages de pdf ?  J'essaie d'établir ceci avec un cadrage rectangulaire mais impossible. 

    Merci si des gens m'aident. Bonne journée.

    -
    Edité par LODA_77_ 9 janvier 2024 à 11:37:33

    • Partager sur Facebook
    • Partager sur Twitter
      9 janvier 2024 à 11:59:05

      Bonjour,

      Je connais pas ce module fitz, je me suis renseigné rapidement, mais tu pourrais t'appuyer sur sa documentation et la gestion des pages, en particulier pour récupérer les dimensions de la page.

      Ces dimensions permettent ensuite de définir un rectangle de recherche qui se limite à la moitié droite de la page, si j'ai bien compris ton problème...

      Et comme c'est pour chaque page il faut que chaque partie droite soit définies et j'imagine que tes pages n'ont pas forcément toutes le même format, je définirai les dimensions et la partie droite dans ta boucle. Si toutes tes pages ont le même format, dans ce cas on peut définir les dimensions et la partie droite en dehors de la boucle.

      Pour la méthode search_for, en suivant mon idée, tu utiliserais le paramètre clip.

      -
      Edité par fred1599 9 janvier 2024 à 12:01:01

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        10 janvier 2024 à 20:30:55

        D'accord, merci beaucoup pour votre réponse . Mon code actuel ressemble à ceci pour l'instant mais il n'est pas au point:

        import fitz
        import tkinter as tk
        from tkinter import filedialog, messagebox
        import os
        
        def delete_words():
            pdf_document = filedialog.askopenfilename(title="Sélectionnez un fichier PDF ")
            mots_a_supprimer = [
                # Liste des mots à supprimer
          "mot1",
        "mot2",
        "mot3"
            ]
        
            try:
                pdf = fitz.open(pdf_document)
        
                for page_num in range(pdf.page_count):
                    page = pdf.load_page(page_num)
                    width = page.rect.width
                    height = page.rect.height
        
                    for mot in mots_a_supprimer:
                        text_instances = page.search_for(mot)
                        for inst in text_instances:
                            # Coordonnées relatives pour ajuster le décalage vers la droite
                            x0_relative = 0.60  # Commence à supprimer à 28% de la largeur
                            x1_relative = 1.0  # Supprimer jusqu'à la fin de la page (100%)
        
                            # Calcul des coordonnées absolues en fonction des coordonnées relatives
                            x0 = width * x0_relative
                            x1 = width * x1_relative
        
                            if inst.x0 > x0 and inst.x1 < x1:
                                annot = page.add_redact_annot(inst)
                                page.apply_redactions()
        
                download_folder = os.path.join(os.path.expanduser("~"), "Downloads")
                pdf_output = os.path.join(download_folder, "PDF_modifié.pdf")
                pdf.save(pdf_output)
                pdf.close()
                messagebox.showinfo("Succès", "Fichier modifié enregistré dans le dossier de téléchargement!")
            
            except Exception as e:
                messagebox.showerror("Erreur", f"Une erreur s'est produite : {e}")
        
        root = tk.Tk()
        root.title("Effaceur de mots dans un PDF")
        
        def select_pdf():
            delete_words()
        
        bg_color = "white"
        root.configure(bg=bg_color)
        
        canvas = tk.Canvas(root, bg=bg_color, width=1280, height=853)
        canvas.pack()
        
        frame = tk.Frame(canvas, bg=bg_color, width=300, height=100)
        frame.place(relx=0.5, rely=0.1, anchor=tk.CENTER)
        
        button = tk.Button(frame, text="Sélectionnez un fichier PDF", command=select_pdf)
        button.pack(padx=10, pady=10)
        
        root.mainloop()



        • Partager sur Facebook
        • Partager sur Twitter
          10 janvier 2024 à 20:55:08

          Bonjour,

          Peut-être que je lis mal, mais je ne trouve pas le rectangle créé et représentant la partie droite de la page où l'on va rechercher les mots.

          J'ai l'impression que vous cherchez toujours les mots sur l'ensemble de la page (pourtant il me semble avoir parlé de l'argument clip).

          Sinon vous appelez votre fonction delete_words sans y mettre l'argument représentant la liste des mots.

          Peut-être que la partie suivante,

          x0_relative = 0.60
          x1_relative = 1.0
          
          x0 = width * x0_relative
          x1 = width * x1_relative
           
          if inst.x0 > x0 and inst.x1 < x1:
              annot = page.add_redact_annot(inst)
              page.apply_redactions()

          fait le travail, tu as dû tester, ça fonctionne ? Ça me semble moins efficace que de sélectionner une fois le rectangle, puis sur cette petite partie faire ta recherche de mots pour chaque pdf.

          Mon code actuel ressemble à ceci pour l'instant mais il n'est pas au point

          Tu peux préciser ? Message d'erreur, ... ?

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            12 janvier 2024 à 14:54:43

            Bonjour,

            oui je n'ai pas utilisé le paramètre clip pour l'instant, j'ai opté pour le code suivant à l'aide de chatgpt :

            import fitz
            import tkinter as tk
            from tkinter import filedialog, messagebox
            import os
            
            def delete_words():
                pdf_document = filedialog.askopenfilename(title="Sélectionnez un fichier PDF ")
                mots_a_supprimer = [
            "mot1",
            "mot2",
            "mot3",
            "mot4",
            "mot5",
            "mot6",
            "mot7",
            "mot8",
            "mot9",
            "mot10",
            "0.00€",
            "0.01€",
            "0.02€",
            "0.03€",
            "0.04€",
            "0.05€",
            "0.06€",
            "0.07€",
            "0.08€",
            "0.09€",
            "0.10€",
            "0.11€",
            "0.12€",
            "0.13€",
            "0.14€",
            "0.15€",
            "0.16€",
            "0.17€",
            "0.18€",
            "0.19€",
            "0.20€",
            "0.21€",
            "0.22€",
            "0.23€",
            "0.24€",
            "0.25€",
            "0.26€",
            "0.27€",
            "0.28€",
            "0.29€",
            "0.30€",
            "0.31€",
            "0.32€",
            "0.33€",
            "0.34€",
            "0.35€",
            "0.36€",
            "0.37€",
            "0.38€",
            "0.39€",
            "0.40€",
            "0.41€",
            "0.42€",
            "0.43€",
            "0.44€",
            "0.45€",
            "0.46€",
            "0.47€",
            "0.48€",
            "0.49€",
            "0.50€",
            "0.51€",
            "0.52€",
            "0.53€",
            "0.54€",
            "0.55€",
            "0.56€",
            "0.57€",
            "0.58€",
            "0.59€",
            "0.60€",
            "0.61€",
            "0.62€",
            "0.63€",
            "0.64€",
            "0.65€",
            "0.66€",
            "0.67€",
            "0.68€",
            "0.69€",
            "0.70€",
            "0.71€",
            "0.72€",
            "0.73€",
            "0.74€",
            "0.75€",
            "0.76€",
            "0.77€",
            "0.78€",
            "0.79€",
            "0.80€",
            "0.81€",
            "0.82€",
            "0.83€",
            "0.84€",
            "0.85€",
            "0.86€",
            "0.87€",
            "0.88€",
            "0.89€",
            "0.90€",
            "0.91€",
            "0.92€",
            "0.93€",
            "0.94€",
            "0.95€",
            "0.96€",
            "0.97€",
            "0.98€",
            "0.99€",
            "1.00€",
            "1.01€",
            "1.02€",
            "1.03€",
            "1.04€",
            "1.05€",
            "1.06€",
            "1.07€",
            "1.08€",
            "1.09€",
            "1.10€",
            "1.11€",
            "1.12€",
            "1.13€",
            "1.14€",
            "1.15€",
            "1.16€",
            "1.17€",
            "1.18€",
            "1.19€",
            "1.20€",
            "1.21€",
            "1.22€",
            "1.23€",
            "1.24€",
            "1.25€",
            "1.26€",
            "1.27€",
            "1.28€",
            "1.29€",
            "1.30€",
            "1.31€",
            "1.32€",
            "1.33€",
            "1.34€",
            "1.35€",
            "1.36€",
            "1.37€",
            "1.38€",
            "1.39€",
            "1.40€",
            "1.41€",
            "1.42€",
            "1.43€",
            "1.44€",
            "1.45€",
            "1.46€",
            "1.47€",
            "1.48€",
            "1.49€",
            "1.50€",
            "1.51€",
            "1.52€",
            "1.53€",
            "1.54€",
            "1.55€",
            "1.56€",
            "1.57€",
            "1.58€",
            "1.59€",
            "1.60€",
            "1.61€",
            "1.62€",
            "1.63€",
            "1.64€",
            "1.65€",
            "1.66€",
            "1.67€",
            "1.68€",
            "1.69€",
            "1.70€",
            "1.71€",
            "1.72€",
            "1.73€",
            "1.74€",
            "1.75€",
            "1.76€",
            "1.77€",
            "1.78€",
            "1.79€",
            "1.80€",
            "1.81€",
            "1.82€",
            "1.83€",
            "1.84€",
            "1.85€",
            "1.86€",
            "1.87€",
            "1.88€",
            "1.89€",
            "1.90€",
            "1.91€",
            "1.92€",
            "1.93€",
            "1.94€",
            "1.95€",
            "1.96€",
            "1.97€",
            "1.98€",
            "1.99€",
            "2.00€",
            "2.01€",
            "2.02€",
            "2.03€",
            "2.04€",
            "2.05€",
            "2.06€",
            "2.07€",
            "2.08€",
            "2.09€",
            "2.10€",
            "2.11€",
            "2.12€",
            "2.13€",
            "2.14€",
            "2.15€",
            "2.16€",
            "2.17€",
            "2.18€",
            "2.19€",
            "2.20€",
            "2.21€",
            "2.22€",
            "2.23€",
            "2.24€",
            "2.25€",
            "2.26€",
            "2.27€",
            "2.28€",
            "2.29€",
            "2.30€",
            "2.31€",
            "2.32€",
            "2.33€",
            "2.34€",
            "2.35€",
            "2.36€",
            "2.37€",
            "2.38€",
            "2.39€",
            "2.40€",
            "2.41€",
            "2.42€",
            "2.43€",
            "2.44€",
            "2.45€",
            "2.46€",
            "2.47€",
            "2.48€",
            "2.49€",
            "2.50€",
            "2.51€",
            "2.52€",
            "2.53€",
            "2.54€",
            "2.55€",
            "2.56€",
            "2.57€",
            "2.58€",
            "2.59€",
            "2.60€",
            "2.61€",
            "2.62€",
            "2.63€",
            "2.64€",
            "2.65€",
            "2.66€",
            "2.67€",
            "2.68€",
            etc...
            ]
             try:
                    pdf = fitz.open(pdf_document)
            
                    for page_num in range(pdf.page_count):
                        page = pdf.load_page(page_num)
                        width = page.rect.width
                        height = page.rect.height
            
                        # Ajustez les coordonnées relatives pour commencer plus haut
                        rect = fitz.Rect(width * 0.6, height * 0.418, width * 0.95, height * 0.95)
            
                        for mot in mots_a_supprimer:
                            text_instances = page.search_for(mot, clip=rect)
                            for inst in text_instances:
                                annot = page.add_redact_annot(inst)
                                page.apply_redactions()
            
                    download_folder = os.path.join(os.path.expanduser("~"), "Downloads")
                    pdf_output = os.path.join(download_folder, "PDF_modifié.pdf")
                    pdf.save(pdf_output)
                    pdf.close()
                    messagebox.showinfo("Succès", "Fichier modifié enregistré dans le dossier de téléchargement!")
                
                except Exception as e:
                    messagebox.showerror("Erreur", f"Une erreur s'est produite : {e}")
            
            root = tk.Tk()
            root.title("Effaceur de mots dans un PDF")
            
            def select_pdf():
                delete_words()
            
            bg_color = "white"
            root.configure(bg=bg_color)
            
            canvas = tk.Canvas(root, bg=bg_color, width=1280, height=853)
            canvas.pack()
            
            frame = tk.Frame(canvas, bg=bg_color, width=300, height=100)
            frame.place(relx=0.5, rely=0.1, anchor=tk.CENTER)
            
            button = tk.Button(frame, text="Sélectionnez un fichier PDF", command=select_pdf)
            button.pack(padx=10, pady=10)
            
            root.mainloop()
            

            Ce dernier fonctionne seulement pour un type de pdf : celui qui contient la suppression des factures au milieu à droite de chaque page du pdf,

            Le problème c'est qu'en réalité:

            -j'ai deux types de pdf, l'endroit où je souhaite effectuer la suppression des factures n'est pas la même dans ces deux cas. Le premier cas contient ceci au milieu à droite de chaque page du pdf, l'autre contient ceci entre le début et le milieu de la 2ème page du pdf.

            -une possibilité de prix à effacer entre 0euros et 5000 euros (comprenant chaque centimes) ce qui créer un programme lourd avec la liste de mots à supprimer et une exécution du programme impossible.



            Donc j'ai vu qu'on pouvait effacer n'importe quel prix avec "\d+,\d{2}€"

            le problème c'est que ça fonctionnait pas quand j'ai essayé .



            J'ai donc essayé de faire le code suivant :

            import fitz
            import tkinter as tk
            from tkinter import filedialog, messagebox
            import os
            import re
            
            def delete_words():
                pdf_document = filedialog.askopenfilename(title="Sélectionnez un fichier PDF ")
            
                # Liste des motifs de texte à supprimer (exprimés en expressions régulières)
                motifs_a_supprimer = [
                    r"mot1",
                    r"1\.00€",
                    r"mot2",
                    r"1\.01€",
                    # Ajoutez les termes suivants avec le même modèle (mot, prix, mot, prix, ...)
                ]
            
                # Utilisez une expression régulière pour trouver les montants en euros
                motif_prix = r"\d+,\d{2}€"
                prix_pattern = re.compile(motif_prix)
            
                try:
                    pdf = fitz.open(pdf_document)
            
                    for page_num in range(pdf.page_count):
                        print(f"Traitement de la page {page_num + 1}/{pdf.page_count}")
            
                        page = pdf.load_page(page_num)
                        width = page.rect.width
                        height = page.rect.height
            
                        # Ajustez les coordonnées relatives pour commencer plus haut
                        rect = fitz.Rect(width * 0.6, height * 0.418, width * 0.95, height * 0.95)
            
                        # Recherche des motifs de texte à supprimer
                        for motif in motifs_a_supprimer:
                            text_instances = page.search_for(motif, clip=rect)
                            for inst in text_instances:
                                annot = page.add_redact_annot(inst)
                                page.apply_redactions()
            
                        # Recherche des montants en euros
                        text_instances = page.search_for(prix_pattern, clip=rect)
                        for inst in text_instances:
                            annot = page.add_redact_annot(inst)
                            page.apply_redactions()
            
                    download_folder = os.path.join(os.path.expanduser("~"), "Downloads")
                    pdf_output = os.path.join(download_folder, "PDF_modifié.pdf")
                    pdf.save(pdf_output)
                    pdf.close()
                    messagebox.showinfo("Succès", "Fichier modifié enregistré dans le dossier de téléchargement!")
            
                except Exception as e:
                    messagebox.showerror("Erreur", f"Une erreur s'est produite : {e}")
            
            root = tk.Tk()
            root.title("Effaceur de mots pour billets")
            
            def select_pdf():
                delete_words()
            
            bg_color = "white"
            root.configure(bg=bg_color)
            
            canvas = tk.Canvas(root, bg=bg_color, width=1280, height=853)
            canvas.pack()
            
            frame = tk.Frame(canvas, bg=bg_color, width=300, height=100)
            frame.place(relx=0.5, rely=0.1, anchor=tk.CENTER)
            
            button = tk.Button(frame, text="Sélectionnez un fichier de billet ", command=select_pdf)
            button.pack(padx=10, pady=10)
            
            root.mainloop()
            


            mais toujours ce problème avec les prix.


            Merci pour votre aide, bonne journée.

            -
            Edité par LODA_77_ 12 janvier 2024 à 15:01:45

            • Partager sur Facebook
            • Partager sur Twitter
              13 janvier 2024 à 4:47:36

              Salut,

              Pour les prix, j'utiliserai NumPy de manière à pouvoir itérer sur des floats même en allant jusqu'à 5 000, ça reste assez rapide.

              import numpy as np
              
              prix = "5000.00€"
              
              for value in np.arange(0.00, 5000.01, 0.01):
                  if f"{value:.2f}€" == prix:
                      print(prix)
                      break



              • Partager sur Facebook
              • Partager sur Twitter
                13 janvier 2024 à 13:20:16

                je n'ai pas utilisé le paramètre clip pour l'instant

                Si vous l'utilisez, mais comme vous utilisez chatGPT de manière bête et méchante, vous ne comprenez pas la lecture de son code, voir même vous ne cherchez pas à lire le code qu'il vous propose.

                Je vous ai expliqué aussi que les mots à supprimer ne devraient pas se trouver à cet endroit, mais en argument de la fonction.

                Pour vos deux types de PDF, vous construisez vos rectangles en fonction du type, chatGPT, vous a donné la manière de créer ce rectangle et comment l'utiliser avec clip.

                • Partager sur Facebook
                • Partager sur Twitter

                Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                  16 janvier 2024 à 11:21:23

                  Bonjour, veuillez m'excuser pour mes erreurs d'utilisation, j'ai depuis fais le code suivant :

                  import fitz
                  import tkinter as tk
                  from tkinter import filedialog, messagebox
                  import os
                  import numpy as np
                  
                  def delete_words_and_prices(pdf_document, words_to_delete, prices_to_delete):
                      try:
                          pdf = fitz.open(pdf_document)
                  
                          for page_num in range(pdf.page_count):
                              page = pdf.load_page(page_num)
                  
                              # Ajustez les coordonnées relatives pour couvrir toute la page
                              rect = page.rect
                  
                              # Supprime les mots
                              for word in words_to_delete:
                                  text_instances = page.search_for(word, clip=rect)
                                  for inst in text_instances:
                                      annot = page.add_redact_annot(inst)
                                      annot.set_color(1, 1, 1)  # Définissez la couleur de réduction à blanc
                  
                              # Supprime les prix
                              for price in prices_to_delete:
                                  text_instances = page.search_for(price, clip=rect)
                                  for inst in text_instances:
                                      annot = page.add_redact_annot(inst)
                                      annot.set_color(1, 1, 1)  # Définissez la couleur de réduction à blanc
                              
                              page.apply_redactions()
                  
                          download_folder = os.path.join(os.path.expanduser("~"), "Downloads")
                          pdf_output = os.path.join(download_folder, "PDF_modifié.pdf")
                          pdf.save(pdf_output)
                          pdf.close()
                  
                          messagebox.showinfo("Succès", "Fichier modifié enregistré dans le dossier de téléchargement!")
                      
                      except Exception as e:
                          messagebox.showerror("Erreur", f"Une erreur s'est produite : {e}")
                  
                  def select_pdf():
                      pdf_document = filedialog.askopenfilename(title="Sélectionnez un fichier PDF ")
                  
                      if pdf_document:
                          mots_a_supprimer = [
                  "mot1",
                  "mot2",
                  "mot3",
                  "mot4",
                  "mot5",
                  etc...
                          ]
                          
                          # Utilisation de numpy pour générer des valeurs entre 0.00 et 5000.00 avec un pas de 0.01
                          prix_a_supprimer = [f"{value:.2f}€" for value in np.arange(0.00, 5000.01, 0.01)]
                          
                          delete_words_and_prices(pdf_document, mots_a_supprimer, prix_a_supprimer)
                  
                          print("Opération terminée. Vérifiez la console pour d'éventuels messages de débogage.")
                  
                  root = tk.Tk()
                  root.title("Effaceur de mots et de prix dans un PDF")
                  
                  bg_color = "white"
                  root.configure(bg=bg_color)
                  
                  frame = tk.Frame(root, bg=bg_color)
                  frame.pack(padx=20, pady=20)
                  
                  button = tk.Button(frame, text="Sélectionnez un fichier PDF", command=select_pdf)
                  button.pack(padx=10, pady=10)
                  
                  root.mainloop()
                  

                  Il contient l'erreur suivante : 

                  PS C:\Users\dist\billet> python main.py
                  Exception in Tkinter callback
                  Traceback (most recent call last):
                    File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.3568.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1892, in __call__
                      return self.func(*args)
                    File "C:\Users\dist\billet\main.py", line 173, in select_pdf
                      prix_a_supprimer = [f"{value:.2f}€" for value in np.arange(0.00, 5000.01, 0.01)]
                  AttributeError: partially initialized module 'main' has no attribute 'arange' (most likely due to a circular import)
                  
                  

                  Je ne sais pas ce qu'il a avec le nom du fichier, j'ai beau le changer à chaque fois cela ne fonctionne pas..

                  Veuillez excusez mon niveau, bonne journée à vous.




                  -
                  Edité par LODA_77_ 16 janvier 2024 à 11:21:44

                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 janvier 2024 à 11:48:16

                    change le nom de ton fichier script (de main.py en modif_pdf.py par exemple)

                    Edit: je n'avais pas bien lu la fin du message

                    -
                    Edité par umfred 16 janvier 2024 à 15:09:31

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 janvier 2024 à 14:40:29

                      @LODA_77,

                      Vous avez déjà suffisamment de difficultés avec du python standard, pourquoi compliquez l'exercice avec numpy ?

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                      Effacer des mot et prix particuliers dans un pdf

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      • Editeur
                      • Markdown