commit 612790d4fca8d2c7e04f6d0bdcbc27192aa096cf Author: Alex Date: Mon Mar 18 21:55:18 2024 +0100 First commit diff --git a/config.json b/config.json new file mode 100644 index 0000000..ea8f3a4 --- /dev/null +++ b/config.json @@ -0,0 +1,4 @@ +{ + "tag": "Agence La Foret", + "source_directory": "H:\\Utilisateurs\\Alex\\Maelis\\Maelis - Logement 2024" +} \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..19a9707 --- /dev/null +++ b/main.py @@ -0,0 +1,167 @@ +''' +Ce script Python prend en entrée un répertoire contenant des fichiers image et des PDF. +Pour chaque PDF trouvé, il extrait les pages sous forme d'images. +Il parcourt tous les fichiers de ce répertoire et vérifie s'ils sont au format JPEG. +Pour chaque image JPEG trouvée, le script charge l'image, ajoute un tag et un texte en travers de l'image, puis +enregistre cette nouvelle image modifiée dans un répertoire de sortie spécifique. +Le nom de chaque image modifiée est préfixé par un paramètre spécifié, par défaut "modified_images". +Enfin, le script crée un nouveau répertoire appelé "modified_images" dans le répertoire d'entrée s'il n'existe pas déjà, +et enregistre toutes les images modifiées dans ce répertoire de sortie. +''' +# Press Maj+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. + +import os, json, subprocess +from PIL import Image, ImageDraw, ImageFont +import piexif +from pdf2image import convert_from_path + +def generate_image_with_text(text, font_size=40, line_spacing=50, transparency=0.40): + text = "Document exclusivement destiné à " + text + text = text + " " + text + + # Charger une police de caractères + font = ImageFont.truetype("arial.ttf", font_size) + + # Obtenir les dimensions du texte + nothing, nothing, text_width, text_height = font.getbbox(text) + + # Nombre de lignes de texte à afficher + num_lines = 20 + + # Calculer la hauteur totale de l'image en tenant compte de l'espacement entre les lignes + total_height = text_height * num_lines + line_spacing * (num_lines - 1) + + # Créer une nouvelle image avec fond transparent + text_image = Image.new("RGBA", (text_width, total_height), (0,0,0,0)) + + # Dessiner le texte sur l'image transparente + text_draw = ImageDraw.Draw(text_image) + for i in range(num_lines): + text_draw.text((0, (text_height + line_spacing) * i), text, fill=(150, 150, 150, int(255 * transparency)), font=font) + + # Appliquer une rotation de 45 degrés à l'image masque + rotated_mask = text_image.rotate(45, expand=True) + + return rotated_mask + +def merge_image_with_text(source_directory, destination_directory, text): + prefix = text.replace(" ", "_") + + # Créer le répertoire de destination s'il n'existe pas + os.makedirs(destination_directory, exist_ok=True) + + # Liste tous les fichiers dans le répertoire source + files = os.listdir(source_directory) + + # Générer l'image avec le texte incliné à 45 degrés + text_image = generate_image_with_text(text) + + # Parcourir tous les fichiers du répertoire source + for file in files: + # Vérifier si le fichier est une image + if file.lower().endswith((".jpg", ".jpeg", ".png", ".bmp")): + # Chemin complet de l'image source + source_image_path = os.path.join(source_directory, file) + + # Charger l'image source + source_image = Image.open(source_image_path).convert("RGBA") + + # Calculer les coordonnées de collage pour centrer l'image source sur text_image + paste_x = (source_image.width - text_image.width) // 2 + paste_y = (source_image.height - text_image.height) // 2 + + # Créer une copie de l'image source pour éviter de la modifier + merged_image = source_image.copy() + + # Coller l'image contenant du texte au milieu de l'image source + merged_image.paste(text_image, (paste_x, paste_y), text_image) + + # Convertir l'image en mode RVB avant de l'enregistrer au format JPEG + merged_image = merged_image.convert("RGB") + + # Récupérer les données EXIF de l'image source + exif_data = source_image.info.get("exif") + + # Si des données EXIF existent, les convertir en dictionnaire + if exif_data: + exif_dict = piexif.load(exif_data) + + # Ajouter ou remplacer le tag EXIF "ImageDescription" avec le texte spécifié + exif_dict["0th"][270] = "Document exclusivement destiné à " + text + else: + exif_dict = {} + + # Convertir le dictionnaire EXIF en données binaires + exif_bytes = piexif.dump(exif_dict) + + # Enregistrer l'image fusionnée dans le répertoire de destination + output_image_path = os.path.join(destination_directory, f"{prefix}{file}") + merged_image.save(output_image_path, exif=exif_bytes) + + +def extract_pdf_pages(pdf_path, text): + # Création du répertoire temporaire + destination_directory = os.path.join(os.path.dirname(pdf_path), "temp") + + # Créer le répertoire de destination s'il n'existe pas + os.makedirs(destination_directory, exist_ok=True) + + # Convertir chaque page du PDF en image + pages = convert_from_path(pdf_path) + + # Extraire le nom du fichier PDF sans l'extension + pdf_filename = os.path.splitext(os.path.basename(pdf_path))[0] + for i, page in enumerate(pages): + filename = f"{pdf_filename}_page_{i+1}.jpg" + output_path = os.path.join(destination_directory, filename) + page.save(output_path, "JPEG") + + + +def process_pdf_files(source_directory, text): + # Parcourir tous les fichiers du répertoire source + for file in os.listdir(source_directory): + # Vérifier si le fichier est un PDF + if file.lower().endswith(".pdf"): + # Chemin complet du fichier PDF + pdf_path = os.path.join(source_directory, file) + + # Convertir le PDF en images + extract_pdf_pages(pdf_path, text) + +def load_config(): + with open("./config.json") as f: + config = json.load(f) + return config + +def open_in_file_explorer(directory): + # Vérifier si le répertoire existe + if os.path.exists(directory): + # Ouvrir l'explorateur de fichiers avec le répertoire spécifié + subprocess.Popen(['explorer', directory]) + else: + print("Le répertoire spécifié n'existe pas.") + +if __name__ == '__main__': + # Lecture de la configuraiton + config = load_config() + text = config["tag"] + source_directory = config["source_directory"] + destination_directory = os.path.join(source_directory, text.replace(" ", "_")) + temp_directory = os.path.join(source_directory, "temp") + + # Extrait les pages des pdf + print("Extrait les pages des pdf") + process_pdf_files(source_directory, text) + + # Rajoute le tag dans les images des pages du pdf + print("Rajoute le tag dans les images des pages du pdf") + merge_image_with_text(temp_directory, destination_directory, text) + + # Rajoute le tag sur les images du répertoire courant + print("Rajoute le tag sur les images du répertoire courant") + merge_image_with_text(source_directory, destination_directory, text) + + # Ouverture du répertoire contenant toutes les images tagées + open_in_file_explorer(destination_directory) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..46523ed --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +Pillow>=8.4.0 +piexif +pdf2image \ No newline at end of file diff --git a/tag Files.bat b/tag Files.bat new file mode 100644 index 0000000..0a2381d --- /dev/null +++ b/tag Files.bat @@ -0,0 +1,3 @@ +cd "H:\Utilisateurs\Alex\Programmation\Python\Tag dans JPG" +call ".venv\Scripts\activate" +python main.py \ No newline at end of file diff --git a/tag Files.sh b/tag Files.sh new file mode 100644 index 0000000..393bfa6 --- /dev/null +++ b/tag Files.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd "chemin/absolu/vers/repertoire/du/script" +source .venv/bin/activate +python main.py