File size: 6,544 Bytes
2e25654
 
df975e7
2e25654
 
f8e7f65
2e25654
 
 
b6f710a
2e25654
b6f710a
d2ce0c9
b6f710a
d385054
 
d2ce0c9
2e25654
 
 
 
b6f710a
2e25654
f8e7f65
 
2e25654
b6f710a
06524de
df975e7
06524de
 
b6f710a
06524de
 
b6f710a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06524de
 
2e25654
 
 
 
b6f710a
df975e7
2e25654
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df975e7
 
 
 
 
 
2e25654
df975e7
2e25654
 
df975e7
d2ce0c9
 
 
b6f710a
 
 
 
d2ce0c9
 
df975e7
 
06524de
 
 
 
 
 
d2ce0c9
2e25654
 
df975e7
 
 
 
 
 
 
 
 
2e25654
d2ce0c9
2e25654
 
 
d2ce0c9
2e25654
 
 
 
 
 
 
 
b6f710a
 
df975e7
b6f710a
 
df975e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
"""
Module pour la génération des contrats en format PDF.
Module optimisé pour une génération plus rapide et efficace.
"""
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
from reportlab.pdfbase import pdfform
from reportlab.lib.colors import black
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
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

pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf'))
pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))

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

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.
    Version optimisée pour une génération plus rapide.
    
    Args:
        contract_type (list): Liste des types de contrats sélectionnés
        is_free (bool): True si la cession est gratuite, False sinon
        author_type (str): Type d'auteur ("Personne physique" ou "Personne morale")
        author_info (dict): Informations sur l'auteur
        work_description (str): Description de l'œuvre
        image_description (str): Description de l'image
        supports (list): Liste des supports sélectionnés
        additional_rights (list): Liste des droits supplémentaires sélectionnés
        remuneration (str): Modalités de rémunération
        is_exclusive (bool): True si la cession est exclusive, False sinon
        
    Returns:
        str: Chemin vers le fichier PDF généré
    """
    # Conversion des paramètres
    is_free_bool = (is_free == "Gratuite")
    is_exclusive_bool = bool(is_exclusive)
    
    # 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 - version simplifiée pour plus de rapidité
    contract_elements = ContractBuilder.build_contract_elements(
        contract_type, is_free_bool, author_type, author_info,
        work_description, image_description, final_supports,
        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)
    
    # Sauvegarder le PDF
    with open(output_filename, 'wb') as f:
        f.write(buffer.getvalue())
    
    # Ajouter des champs interactifs pour les signatures
    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)
    
    # Finaliser et sauvegarder le PDF
    p.save()
    
    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