Woziii commited on
Commit
688e447
·
verified ·
1 Parent(s): 3b4194e

Update pdf_generator.py

Browse files
Files changed (1) hide show
  1. pdf_generator.py +12 -71
pdf_generator.py CHANGED
@@ -1,10 +1,8 @@
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
- Version corrigée pour l'encodage des caractères accentués et UTF-8.
5
  """
6
  import io
7
- import os
8
  from reportlab.pdfgen import canvas
9
  from reportlab.lib.pagesizes import A4
10
  from reportlab.lib.units import mm
@@ -22,49 +20,6 @@ from contract_builder import ContractBuilder
22
  from utils import create_temp_file, ensure_default_supports
23
 
24
 
25
- # Définir le chemin vers le répertoire des polices
26
- # Vous devrez ajuster ce chemin selon votre installation
27
- FONT_DIR = os.path.join(os.path.dirname(__file__), 'fonts')
28
-
29
- # Vérifier si le répertoire des polices existe, sinon le créer
30
- if not os.path.exists(FONT_DIR):
31
- os.makedirs(FONT_DIR)
32
-
33
- # Fonction pour enregistrer une police si le fichier existe
34
- def register_font_if_exists(font_name, font_file):
35
- font_path = os.path.join(FONT_DIR, font_file)
36
- if os.path.exists(font_path):
37
- pdfmetrics.registerFont(TTFont(font_name, font_path))
38
- return True
39
- return False
40
-
41
- # Essayer d'enregistrer les polices personnalisées, sinon utiliser les polices par défaut
42
- use_custom_fonts = False
43
-
44
- # Tentative d'enregistrement des polices personnalisées
45
- if register_font_if_exists('Helvetica', 'Helvetica.ttf') and \
46
- register_font_if_exists('Helvetica-Bold', 'Helvetica-Bold.ttf'):
47
- use_custom_fonts = True
48
- else:
49
- # Utiliser la police DejaVu qui est souvent disponible sur les systèmes Linux et supporte l'UTF-8
50
- dejavu_fonts = {
51
- 'DejaVuSans': 'DejaVuSans.ttf',
52
- 'DejaVuSans-Bold': 'DejaVuSans-Bold.ttf'
53
- }
54
-
55
- for font_name, font_file in dejavu_fonts.items():
56
- register_font_if_exists(font_name, font_file)
57
-
58
- # Si on ne trouve pas DejaVu, on peut essayer avec Liberation qui est aussi courante
59
- liberation_fonts = {
60
- 'LiberationSans': 'LiberationSans-Regular.ttf',
61
- 'LiberationSans-Bold': 'LiberationSans-Bold.ttf'
62
- }
63
-
64
- for font_name, font_file in liberation_fonts.items():
65
- register_font_if_exists(font_name, font_file)
66
-
67
-
68
  def generate_pdf(contract_type, is_free, author_type, author_info,
69
  work_description, image_description, supports,
70
  additional_rights, remuneration, is_exclusive):
@@ -104,7 +59,7 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
104
  additional_rights, remuneration, is_exclusive_bool
105
  )
106
 
107
- # Créer un document PDF avec encodage UTF-8
108
  buffer = io.BytesIO()
109
 
110
  # Utiliser des marges plus petites et des réglages plus simples
@@ -114,8 +69,7 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
114
  rightMargin=15*mm,
115
  leftMargin=15*mm,
116
  topMargin=15*mm,
117
- bottomMargin=15*mm,
118
- encoding='UTF-8' # Spécifier l'encodage UTF-8 pour les caractères accentués
119
  )
120
 
121
  # Construire le document en une seule passe
@@ -124,10 +78,6 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
124
  # Ajouter des champs interactifs pour les signatures
125
  buffer.seek(0)
126
 
127
- # Réduire la complexité des champs interactifs
128
- with open(output_filename, 'wb') as f:
129
- f.write(buffer.getvalue())
130
-
131
  # Version simplifiée des champs interactifs dans un second fichier
132
  p = canvas.Canvas(output_filename, pagesize=A4)
133
  form = p.acroForm
@@ -165,9 +115,16 @@ def generate_pdf(contract_type, is_free, author_type, author_info,
165
  x=350, y=60, width=150, height=30,
166
  borderWidth=0, forceBorder=True)
167
 
 
 
 
168
  # Finaliser et sauvegarder le PDF
169
  p.save()
170
 
 
 
 
 
171
  return output_filename
172
 
173
 
@@ -179,35 +136,19 @@ def get_simplified_styles():
179
  dict: Dictionnaire des styles simplifiés
180
  """
181
  styles = getSampleStyleSheet()
182
-
183
- # Déterminer quelles polices utiliser en fonction de ce qui est disponible
184
- if use_custom_fonts:
185
- base_font = 'Helvetica'
186
- bold_font = 'Helvetica-Bold'
187
- elif register_font_if_exists('DejaVuSans', 'DejaVuSans.ttf'):
188
- base_font = 'DejaVuSans'
189
- bold_font = 'DejaVuSans-Bold'
190
- elif register_font_if_exists('LiberationSans', 'LiberationSans-Regular.ttf'):
191
- base_font = 'LiberationSans'
192
- bold_font = 'LiberationSans-Bold'
193
- else:
194
- # Utiliser les polices par défaut de ReportLab
195
- base_font = 'Helvetica'
196
- bold_font = 'Helvetica-Bold'
197
-
198
  # Utiliser des styles plus simples avec moins d'options
199
  styles.add(ParagraphStyle(name='ContractTitle',
200
- fontName=bold_font,
201
  fontSize=14,
202
  alignment=TA_CENTER,
203
  spaceAfter=10))
204
  styles.add(ParagraphStyle(name='ContractText',
205
- fontName=base_font,
206
  fontSize=10,
207
  alignment=TA_JUSTIFY,
208
  spaceAfter=5))
209
  styles.add(ParagraphStyle(name='ContractArticle',
210
- fontName=bold_font,
211
  fontSize=11,
212
  spaceAfter=5))
213
  return styles
 
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
  from reportlab.pdfgen import canvas
7
  from reportlab.lib.pagesizes import A4
8
  from reportlab.lib.units import mm
 
20
  from utils import create_temp_file, ensure_default_supports
21
 
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  def generate_pdf(contract_type, is_free, author_type, author_info,
24
  work_description, image_description, supports,
25
  additional_rights, remuneration, is_exclusive):
 
59
  additional_rights, remuneration, is_exclusive_bool
60
  )
61
 
62
+ # Créer un document PDF avec moins d'options pour accélérer la génération
63
  buffer = io.BytesIO()
64
 
65
  # Utiliser des marges plus petites et des réglages plus simples
 
69
  rightMargin=15*mm,
70
  leftMargin=15*mm,
71
  topMargin=15*mm,
72
+ bottomMargin=15*mm
 
73
  )
74
 
75
  # Construire le document en une seule passe
 
78
  # Ajouter des champs interactifs pour les signatures
79
  buffer.seek(0)
80
 
 
 
 
 
81
  # Version simplifiée des champs interactifs dans un second fichier
82
  p = canvas.Canvas(output_filename, pagesize=A4)
83
  form = p.acroForm
 
115
  x=350, y=60, width=150, height=30,
116
  borderWidth=0, forceBorder=True)
117
 
118
+ # Ne pas essayer d'ajouter des champs de paraphe sur chaque page
119
+ # Cela causait une erreur car SimpleDocTemplate n'a pas d'attribut page_count
120
+
121
  # Finaliser et sauvegarder le PDF
122
  p.save()
123
 
124
+ # Sauvegarder le PDF dans un fichier
125
+ with open(output_filename, 'wb') as f:
126
+ f.write(buffer.getvalue())
127
+
128
  return output_filename
129
 
130
 
 
136
  dict: Dictionnaire des styles simplifiés
137
  """
138
  styles = getSampleStyleSheet()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  # Utiliser des styles plus simples avec moins d'options
140
  styles.add(ParagraphStyle(name='ContractTitle',
141
+ fontName='Helvetica-Bold',
142
  fontSize=14,
143
  alignment=TA_CENTER,
144
  spaceAfter=10))
145
  styles.add(ParagraphStyle(name='ContractText',
146
+ fontName='Helvetica',
147
  fontSize=10,
148
  alignment=TA_JUSTIFY,
149
  spaceAfter=5))
150
  styles.add(ParagraphStyle(name='ContractArticle',
151
+ fontName='Helvetica-Bold',
152
  fontSize=11,
153
  spaceAfter=5))
154
  return styles