""" Module pour la génération des contrats en format PDF. Module optimisé pour une génération plus complète et détaillée. """ import io import reportlab from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle from reportlab.pdfbase import pdfform from reportlab.lib.colors import black, white from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY, TA_LEFT from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.lib.styles import getSampleStyleSheet import time from config import PDF_CONFIG from contract_builder import ContractBuilder from utils import create_temp_file, ensure_default_supports from contract_templates import ContractTemplates # Import this to use title generation pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf')) pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf')) def generate_pdf(contract_type, is_free, author_type, author_info, work_description, image_description, supports, additional_rights, remuneration, is_exclusive): """ Génère un PDF du contrat avec des champs interactifs. """ # Conversion des paramètres is_free_bool = (is_free == "Gratuite") # L'exclusivité n'est possible que si la cession est onéreuse is_exclusive_bool = bool(is_exclusive) and not is_free_bool # Filtrer les droits supplémentaires si la cession est gratuite final_additional_rights = [] if is_free_bool else additional_rights # Ajouter les supports par défaut final_supports = ensure_default_supports(supports) # Créer un nom de fichier temporaire pour le PDF output_filename = create_temp_file(prefix="contrat_cession_", suffix=".pdf") # Générer le contenu du contrat avec les paramètres mis à jour contract_elements = ContractBuilder.build_contract_elements( contract_type, is_free_bool, author_type, author_info, work_description, image_description, final_supports, final_additional_rights, remuneration, is_exclusive_bool ) # Créer un document PDF avec moins d'options pour accélérer la génération buffer = io.BytesIO() # Utiliser des marges plus petites et des réglages plus simples doc = SimpleDocTemplate( buffer, pagesize=A4, rightMargin=15*mm, leftMargin=15*mm, topMargin=15*mm, bottomMargin=15*mm ) # Construire le document en une seule passe doc.build(contract_elements) # Ajouter des champs interactifs pour les signatures buffer.seek(0) # Version simplifiée des champs interactifs dans un second fichier p = canvas.Canvas(output_filename, pagesize=A4) form = p.acroForm # Déterminer le nom du cédant en fonction du type de contrat if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type: cedant_label = "l'Auteur et Modèle" elif "Auteur (droits d'auteur)" in contract_type: cedant_label = "l'Auteur" else: cedant_label = "le Modèle" # Ajouter seulement les champs essentiels form.textfield(name='lieu', tooltip='Lieu de signature', x=80, y=120, width=100, height=15, borderWidth=0, forceBorder=True) form.textfield(name='date', tooltip='Date de signature', x=230, y=120, width=100, height=15, borderWidth=0, forceBorder=True) form.textfield(name='mention_cedant', tooltip='Mention "Lu et approuvé"', x=70, y=95, width=150, height=15, borderWidth=0, forceBorder=True) form.textfield(name='mention_cessionnaire', tooltip='Mention "Lu et approuvé"', x=350, y=95, width=150, height=15, borderWidth=0, forceBorder=True) form.textfield(name='signature_cedant', tooltip=f'Signature de {cedant_label}', x=70, y=60, width=150, height=30, borderWidth=0, forceBorder=True) form.textfield(name='signature_cessionnaire', tooltip='Signature du Cessionnaire', x=350, y=60, width=150, height=30, borderWidth=0, forceBorder=True) # Ne pas essayer d'ajouter des champs de paraphe sur chaque page # Cela causait une erreur car SimpleDocTemplate n'a pas d'attribut page_count # Finaliser et sauvegarder le PDF p.save() # Sauvegarder le PDF dans un fichier with open(output_filename, 'wb') as f: f.write(buffer.getvalue()) return output_filename def get_simplified_styles(): """ Retourne des styles simplifiés pour une génération plus rapide. Returns: dict: Dictionnaire des styles simplifiés """ styles = getSampleStyleSheet() # Utiliser des styles plus simples avec moins d'options styles.add(ParagraphStyle(name='ContractTitle', fontName='VeraBd', fontSize=14, alignment=TA_CENTER, spaceAfter=10)) styles.add(ParagraphStyle(name='ContractText', fontName='Vera', fontSize=10, alignment=TA_JUSTIFY, spaceAfter=5)) styles.add(ParagraphStyle(name='ContractArticle', fontName='VeraBd', fontSize=11, spaceAfter=5)) return styles