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 |