First commit

main
Alex 2024-03-18 21:55:18 +01:00
commit 612790d4fc
5 changed files with 181 additions and 0 deletions

4
config.json Normal file
View File

@ -0,0 +1,4 @@
{
"tag": "Agence La Foret",
"source_directory": "H:\\Utilisateurs\\Alex\\Maelis\\Maelis - Logement 2024"
}

167
main.py Normal file
View File

@ -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)

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
Pillow>=8.4.0
piexif
pdf2image

3
tag Files.bat Normal file
View File

@ -0,0 +1,3 @@
cd "H:\Utilisateurs\Alex\Programmation\Python\Tag dans JPG"
call ".venv\Scripts\activate"
python main.py

4
tag Files.sh Normal file
View File

@ -0,0 +1,4 @@
#!/bin/bash
cd "chemin/absolu/vers/repertoire/du/script"
source .venv/bin/activate
python main.py