Update pdf_generator.py
Browse files- pdf_generator.py +49 -139
pdf_generator.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
"""
|
2 |
Module pour la génération des contrats en format PDF.
|
3 |
-
Module optimisé pour une génération plus
|
4 |
"""
|
5 |
import io
|
6 |
import reportlab
|
@@ -26,7 +26,7 @@ pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))
|
|
26 |
|
27 |
def get_simplified_styles():
|
28 |
"""
|
29 |
-
Retourne des styles simplifiés pour
|
30 |
|
31 |
Returns:
|
32 |
dict: Dictionnaire des styles simplifiés
|
@@ -54,7 +54,7 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
|
|
54 |
additional_rights, remuneration, is_exclusive):
|
55 |
"""
|
56 |
Génère un PDF du contrat avec des champs interactifs.
|
57 |
-
Version optimisée pour une génération plus rapide
|
58 |
|
59 |
Args:
|
60 |
contract_type (list): Liste des types de contrats sélectionnés
|
@@ -81,13 +81,17 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
|
|
81 |
# Créer un nom de fichier temporaire pour le PDF
|
82 |
output_filename = create_temp_file(prefix="contrat_cession_", suffix=".pdf")
|
83 |
|
84 |
-
#
|
85 |
-
|
|
|
|
|
|
|
|
|
86 |
|
87 |
-
# Créer un
|
88 |
buffer = io.BytesIO()
|
89 |
|
90 |
-
#
|
91 |
doc = SimpleDocTemplate(
|
92 |
buffer,
|
93 |
pagesize=A4,
|
@@ -97,135 +101,8 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
|
|
97 |
bottomMargin=15*mm
|
98 |
)
|
99 |
|
100 |
-
#
|
101 |
-
|
102 |
-
|
103 |
-
# Titre du contrat
|
104 |
-
elements.append(Paragraph(ContractTemplates.get_title(contract_type), styles['ContractTitle']))
|
105 |
-
|
106 |
-
# Préambule
|
107 |
-
elements.append(Paragraph("ENTRE LES SOUSSIGNÉS :", styles['ContractArticle']))
|
108 |
-
|
109 |
-
# Informations sur l'auteur/modèle (Section inspirée du fichier preview)
|
110 |
-
if author_type == "Personne physique":
|
111 |
-
gentille = author_info.get("gentille", "M.")
|
112 |
-
nom = author_info.get("nom", "")
|
113 |
-
prenom = author_info.get("prenom", "")
|
114 |
-
date_naissance = author_info.get("date_naissance", "")
|
115 |
-
nationalite = author_info.get("nationalite", "")
|
116 |
-
adresse = author_info.get("adresse", "")
|
117 |
-
contact = author_info.get("contact", "")
|
118 |
-
|
119 |
-
author_description = f"{gentille} {prenom} {nom}"
|
120 |
-
if date_naissance:
|
121 |
-
author_description += f", né(e) le {date_naissance}"
|
122 |
-
if nationalite:
|
123 |
-
author_description += f", de nationalité {nationalite}"
|
124 |
-
author_description += f", domicilié(e) au {adresse}"
|
125 |
-
if contact:
|
126 |
-
author_description += f", joignable à {contact}"
|
127 |
-
|
128 |
-
elements.append(Paragraph(author_description, styles['ContractText']))
|
129 |
-
else:
|
130 |
-
# Personne morale
|
131 |
-
nom_societe = author_info.get("nom_societe", "")
|
132 |
-
statut = author_info.get("statut", "")
|
133 |
-
rcs = author_info.get("rcs", "")
|
134 |
-
siege = author_info.get("siege", "")
|
135 |
-
contact = author_info.get("contact", "")
|
136 |
-
|
137 |
-
entity_description = f"La société {nom_societe}, {statut}, immatriculée sous le numéro {rcs} au Registre du Commerce et des Sociétés, dont le siège social est situé {siege}"
|
138 |
-
if contact:
|
139 |
-
entity_description += f", joignable à {contact}"
|
140 |
-
|
141 |
-
elements.append(Paragraph(entity_description, styles['ContractText']))
|
142 |
-
|
143 |
-
# Dénomination de l'auteur
|
144 |
-
if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type:
|
145 |
-
denomination = "ci-après dénommé(e) \"l'Auteur et le Modèle\","
|
146 |
-
elif "Auteur (droits d'auteur)" in contract_type:
|
147 |
-
denomination = "ci-après dénommé(e) \"l'Auteur\","
|
148 |
-
else:
|
149 |
-
denomination = "ci-après dénommé(e) \"le Modèle\","
|
150 |
-
|
151 |
-
elements.append(Paragraph(denomination, styles['ContractText']))
|
152 |
-
|
153 |
-
# Informations sur Tellers
|
154 |
-
elements.append(Paragraph("Tellers, société par actions simplifiée unipersonnelle au capital de 1000 €, " +
|
155 |
-
"immatriculée sous le numéro 932 553 266 R.C.S. Lyon, et dont le siège social est situé au : " +
|
156 |
-
"12 RUE DE LA PART-DIEU, 69003 LYON, représentée par son Président en exercice dûment habilité à l'effet des présentes, " +
|
157 |
-
"ci-après dénommée \"le Cessionnaire\",", styles['ContractText']))
|
158 |
-
|
159 |
-
# Introduction
|
160 |
-
elements.append(Paragraph("Ci-après dénommées ensemble \"les Parties\" ou individuellement \"la Partie\",", styles['ContractText']))
|
161 |
-
elements.append(Paragraph("CECI EXPOSÉ, IL A ÉTÉ CONVENU CE QUI SUIT :", styles['ContractArticle']))
|
162 |
-
|
163 |
-
# ARTICLE 1 - OBJET DU CONTRAT
|
164 |
-
elements.append(Paragraph("ARTICLE 1 – OBJET DU CONTRAT", styles['ContractArticle']))
|
165 |
-
|
166 |
-
# Œuvre concernée si droits d'auteur
|
167 |
-
if "Auteur (droits d'auteur)" in contract_type:
|
168 |
-
elements.append(Paragraph("1.1 Œuvre concernée", styles['ContractText']))
|
169 |
-
elements.append(Paragraph("L'Auteur déclare être le créateur et titulaire exclusif des droits d'auteur sur l'œuvre suivante :",
|
170 |
-
styles['ContractText']))
|
171 |
-
elements.append(Paragraph(work_description, styles['ContractText']))
|
172 |
-
|
173 |
-
# Image concernée si droit à l'image
|
174 |
-
if "Image (droit à l'image)" in contract_type:
|
175 |
-
elements.append(Paragraph("1.2 Images concernées", styles['ContractText']))
|
176 |
-
elements.append(Paragraph("Le Modèle autorise l'utilisation de son image telle qu'elle apparaît dans :",
|
177 |
-
styles['ContractText']))
|
178 |
-
elements.append(Paragraph(image_description, styles['ContractText']))
|
179 |
-
|
180 |
-
# ARTICLE 2 - DROITS CÉDÉS
|
181 |
-
elements.append(Paragraph("ARTICLE 2 – ÉTENDUE DES DROITS CÉDÉS", styles['ContractArticle']))
|
182 |
-
|
183 |
-
# Détails de la cession
|
184 |
-
cession_details = "L'Auteur cède au Cessionnaire, "
|
185 |
-
cession_details += "à titre exclusif, " if is_exclusive_bool else "à titre non exclusif, "
|
186 |
-
cession_details += "gratuitement et pour la durée précisée à l'article 4, les droits patrimoniaux suivants :" if is_free_bool else "pour la durée précisée à l'article 4 et moyennant rémunération, les droits suivants :"
|
187 |
-
|
188 |
-
elements.append(Paragraph(cession_details, styles['ContractText']))
|
189 |
-
|
190 |
-
# Droits patrimoniaux
|
191 |
-
elements.append(Paragraph("- Droit de reproduction", styles['ContractText']))
|
192 |
-
elements.append(Paragraph("- Droit de représentation", styles['ContractText']))
|
193 |
-
|
194 |
-
# Droits supplémentaires
|
195 |
-
if not is_free_bool and additional_rights:
|
196 |
-
elements.append(Paragraph("Droits supplémentaires inclus :", styles['ContractText']))
|
197 |
-
for right in additional_rights:
|
198 |
-
short_name = right.split(" - ")[0] if " - " in right else right
|
199 |
-
elements.append(Paragraph(f"- {short_name}", styles['ContractText']))
|
200 |
-
|
201 |
-
# Générer le reste du document avec les articles standards
|
202 |
-
# (durée, territoire, supports, rémunération, etc.)
|
203 |
-
remaining_articles = [
|
204 |
-
("Durée et Territoire", "La cession est consentie pour une durée d'un (1) an, renouvelable par tacite reconduction. Elle est valable pour le monde entier."),
|
205 |
-
("Supports d'Exploitation", "Les supports sont : " + ", ".join(final_supports)),
|
206 |
-
("Rémunération", remuneration if not is_free_bool else "La cession est consentie à titre gratuit.")
|
207 |
-
]
|
208 |
-
|
209 |
-
for i, (title, content) in enumerate(remaining_articles, start=3):
|
210 |
-
elements.append(Paragraph(f"ARTICLE {i} – {title.upper()}", styles['ContractArticle']))
|
211 |
-
elements.append(Paragraph(content, styles['ContractText']))
|
212 |
-
|
213 |
-
# Signature
|
214 |
-
elements.append(Paragraph("Fait à ________________, le ________________", styles['ContractText']))
|
215 |
-
elements.append(Paragraph("En deux exemplaires originaux.", styles['ContractText']))
|
216 |
-
|
217 |
-
# Lignes de signature
|
218 |
-
if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type:
|
219 |
-
signature_text = "Pour l'Auteur et Modèle : Pour le Cessionnaire :"
|
220 |
-
elif "Auteur (droits d'auteur)" in contract_type:
|
221 |
-
signature_text = "Pour l'Auteur : Pour le Cessionnaire :"
|
222 |
-
else:
|
223 |
-
signature_text = "Pour le Modèle : Pour le Cessionnaire :"
|
224 |
-
|
225 |
-
elements.append(Paragraph(signature_text, styles['ContractText']))
|
226 |
-
|
227 |
-
# Construire le document
|
228 |
-
doc.build(elements)
|
229 |
|
230 |
# Sauvegarder le PDF
|
231 |
with open(output_filename, 'wb') as f:
|
@@ -235,7 +112,15 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
|
|
235 |
p = canvas.Canvas(output_filename, pagesize=A4)
|
236 |
form = p.acroForm
|
237 |
|
238 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
239 |
form.textfield(name='lieu', tooltip='Lieu de signature',
|
240 |
x=80, y=120, width=100, height=15,
|
241 |
borderWidth=0, forceBorder=True)
|
@@ -252,7 +137,32 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
|
|
252 |
x=350, y=95, width=150, height=15,
|
253 |
borderWidth=0, forceBorder=True)
|
254 |
|
255 |
-
#
|
256 |
p.save()
|
257 |
|
258 |
-
return output_filename
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
"""
|
2 |
Module pour la génération des contrats en format PDF.
|
3 |
+
Module optimisé pour une génération plus rapide et efficace.
|
4 |
"""
|
5 |
import io
|
6 |
import reportlab
|
|
|
26 |
|
27 |
def get_simplified_styles():
|
28 |
"""
|
29 |
+
Retourne des styles simplifiés pour une génération plus rapide.
|
30 |
|
31 |
Returns:
|
32 |
dict: Dictionnaire des styles simplifiés
|
|
|
54 |
additional_rights, remuneration, is_exclusive):
|
55 |
"""
|
56 |
Génère un PDF du contrat avec des champs interactifs.
|
57 |
+
Version optimisée pour une génération plus rapide.
|
58 |
|
59 |
Args:
|
60 |
contract_type (list): Liste des types de contrats sélectionnés
|
|
|
81 |
# Créer un nom de fichier temporaire pour le PDF
|
82 |
output_filename = create_temp_file(prefix="contrat_cession_", suffix=".pdf")
|
83 |
|
84 |
+
# Générer le contenu du contrat - version simplifiée pour plus de rapidité
|
85 |
+
contract_elements = ContractBuilder.build_contract_elements(
|
86 |
+
contract_type, is_free_bool, author_type, author_info,
|
87 |
+
work_description, image_description, final_supports,
|
88 |
+
additional_rights, remuneration, is_exclusive_bool
|
89 |
+
)
|
90 |
|
91 |
+
# Créer un document PDF avec moins d'options pour accélérer la génération
|
92 |
buffer = io.BytesIO()
|
93 |
|
94 |
+
# Utiliser des marges plus petites et des réglages plus simples
|
95 |
doc = SimpleDocTemplate(
|
96 |
buffer,
|
97 |
pagesize=A4,
|
|
|
101 |
bottomMargin=15*mm
|
102 |
)
|
103 |
|
104 |
+
# Construire le document en une seule passe
|
105 |
+
doc.build(contract_elements)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
|
107 |
# Sauvegarder le PDF
|
108 |
with open(output_filename, 'wb') as f:
|
|
|
112 |
p = canvas.Canvas(output_filename, pagesize=A4)
|
113 |
form = p.acroForm
|
114 |
|
115 |
+
# Déterminer le nom du cédant en fonction du type de contrat
|
116 |
+
if "Auteur (droits d'auteur)" in contract_type and "Image (droit à l'image)" in contract_type:
|
117 |
+
cedant_label = "l'Auteur et Modèle"
|
118 |
+
elif "Auteur (droits d'auteur)" in contract_type:
|
119 |
+
cedant_label = "l'Auteur"
|
120 |
+
else:
|
121 |
+
cedant_label = "le Modèle"
|
122 |
+
|
123 |
+
# Ajouter seulement les champs essentiels
|
124 |
form.textfield(name='lieu', tooltip='Lieu de signature',
|
125 |
x=80, y=120, width=100, height=15,
|
126 |
borderWidth=0, forceBorder=True)
|
|
|
137 |
x=350, y=95, width=150, height=15,
|
138 |
borderWidth=0, forceBorder=True)
|
139 |
|
140 |
+
# Finaliser et sauvegarder le PDF
|
141 |
p.save()
|
142 |
|
143 |
+
return output_filename
|
144 |
+
|
145 |
+
def get_simplified_styles():
|
146 |
+
"""
|
147 |
+
Retourne des styles simplifiés pour une génération plus rapide.
|
148 |
+
|
149 |
+
Returns:
|
150 |
+
dict: Dictionnaire des styles simplifiés
|
151 |
+
"""
|
152 |
+
styles = getSampleStyleSheet()
|
153 |
+
# Utiliser des styles plus simples avec moins d'options
|
154 |
+
styles.add(ParagraphStyle(name='ContractTitle',
|
155 |
+
fontName='VeraBd',
|
156 |
+
fontSize=14,
|
157 |
+
alignment=TA_CENTER,
|
158 |
+
spaceAfter=10))
|
159 |
+
styles.add(ParagraphStyle(name='ContractText',
|
160 |
+
fontName='Vera',
|
161 |
+
fontSize=10,
|
162 |
+
alignment=TA_JUSTIFY,
|
163 |
+
spaceAfter=5))
|
164 |
+
styles.add(ParagraphStyle(name='ContractArticle',
|
165 |
+
fontName='VeraBd',
|
166 |
+
fontSize=11,
|
167 |
+
spaceAfter=5))
|
168 |
+
return styles
|