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.
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
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)
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()
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, ... ?
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)
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()
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.
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)
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.
Vous avez déjà suffisamment de difficultés avec du python standard, pourquoi compliquez l'exercice avec numpy ?
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é.
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)
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)
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)
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)