commit
612790d4fc
5 changed files with 181 additions and 0 deletions
-
4config.json
-
167main.py
-
3requirements.txt
-
3tag Files.bat
-
4tag Files.sh
@ -0,0 +1,4 @@ |
|||
{ |
|||
"tag": "Agence La Foret", |
|||
"source_directory": "H:\\Utilisateurs\\Alex\\Maelis\\Maelis - Logement 2024" |
|||
} |
|||
@ -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) |
|||
@ -0,0 +1,3 @@ |
|||
Pillow>=8.4.0 |
|||
piexif |
|||
pdf2image |
|||
@ -0,0 +1,3 @@ |
|||
cd "H:\Utilisateurs\Alex\Programmation\Python\Tag dans JPG" |
|||
call ".venv\Scripts\activate" |
|||
python main.py |
|||
@ -0,0 +1,4 @@ |
|||
#!/bin/bash |
|||
cd "chemin/absolu/vers/repertoire/du/script" |
|||
source .venv/bin/activate |
|||
python main.py |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue