File size: 15,806 Bytes
4211d95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
"""
Génère des documents PDF de démonstration pour NormAssist.

Usage : python scripts/generate_samples.py

Crée des PDFs simulant des documents techniques industriels
(normes, fiches techniques, manuels) à partir de contenu public.
"""

from pathlib import Path

try:
    import fitz  # PyMuPDF
except ImportError:
    print("PyMuPDF requis : pip install pymupdf")
    raise SystemExit(1)

SAMPLE_DIR = Path(__file__).resolve().parent.parent / "data" / "sample"
SAMPLE_DIR.mkdir(parents=True, exist_ok=True)


def create_pdf(filename: str, title: str, sections: list[dict]):
    """Crée un PDF structuré avec titre et sections."""
    doc = fitz.open()

    # Page de titre
    page = doc.new_page(width=595, height=842)  # A4
    page.insert_text(
        (72, 200), title, fontsize=22, fontname="helv", color=(0.1, 0.2, 0.5)
    )
    page.insert_text(
        (72, 240),
        "Document de démonstration — NormAssist",
        fontsize=11,
        fontname="helv",
        color=(0.4, 0.4, 0.4),
    )
    page.insert_text(
        (72, 280),
        "Ce document est généré à des fins de démonstration.",
        fontsize=10,
        fontname="helv",
        color=(0.5, 0.5, 0.5),
    )

    # Sections
    for section in sections:
        page = doc.new_page(width=595, height=842)
        y = 72

        # Titre de section
        page.insert_text(
            (72, y),
            section["title"],
            fontsize=16,
            fontname="helv",
            color=(0.1, 0.2, 0.5),
        )
        y += 35

        # Corps
        text = section["body"]
        # Découper le texte en lignes de ~80 caractères
        words = text.split()
        lines = []
        current_line = ""
        for word in words:
            if len(current_line) + len(word) + 1 > 80:
                lines.append(current_line)
                current_line = word
            else:
                current_line = f"{current_line} {word}".strip()
        if current_line:
            lines.append(current_line)

        for line in lines:
            if y > 780:
                page = doc.new_page(width=595, height=842)
                y = 72
            page.insert_text((72, y), line, fontsize=10, fontname="helv")
            y += 16

    filepath = SAMPLE_DIR / filename
    doc.save(str(filepath))
    doc.close()
    print(f"✅ Créé : {filepath}")


# ── Documents de démonstration ───────────────────────────────────────────────

DOCS = [
    {
        "filename": "norme_qualite_systeme_management.pdf",
        "title": "Système de Management de la Qualité — Exigences",
        "sections": [
            {
                "title": "1. Domaine d'application",
                "body": (
                    "Le présent document spécifie les exigences relatives au système de management "
                    "de la qualité lorsqu'un organisme doit démontrer son aptitude à fournir "
                    "régulièrement des produits et services conformes aux exigences des clients "
                    "et aux exigences légales et réglementaires applicables. Il vise à accroître "
                    "la satisfaction des clients par l'application efficace du système, y compris "
                    "les processus pour l'amélioration continue du système et l'assurance de la "
                    "conformité aux exigences des clients et aux exigences légales et réglementaires "
                    "applicables. Toutes les exigences du présent document sont génériques et "
                    "prévues pour s'appliquer à tout organisme, quels que soient son type, sa "
                    "taille et les produits et services qu'il fournit."
                ),
            },
            {
                "title": "2. Contexte de l'organisme",
                "body": (
                    "L'organisme doit déterminer les enjeux externes et internes pertinents par "
                    "rapport à sa finalité et son orientation stratégique, et qui influent sur sa "
                    "capacité à obtenir le ou les résultats attendus de son système de management "
                    "de la qualité. L'organisme doit surveiller et revoir les informations relatives "
                    "à ces enjeux externes et internes. L'organisme doit déterminer les parties "
                    "intéressées qui sont pertinentes dans le cadre du système de management de "
                    "la qualité et les exigences de ces parties intéressées qui sont pertinentes "
                    "dans le cadre du système de management de la qualité."
                ),
            },
            {
                "title": "3. Traçabilité",
                "body": (
                    "L'organisme doit maîtriser l'identification unique des éléments de sortie "
                    "lorsque la traçabilité est une exigence et doit conserver les informations "
                    "documentées nécessaires à la traçabilité. La traçabilité implique la capacité "
                    "de retracer l'historique, la mise en œuvre ou l'emplacement d'un objet. "
                    "Pour un produit, la traçabilité peut être liée à l'origine des matériaux "
                    "et des pièces, l'historique de réalisation, la distribution et l'emplacement "
                    "du produit après livraison. Les enregistrements de traçabilité doivent inclure "
                    "les numéros de lot, les dates de fabrication, les identifiants uniques des "
                    "composants, et les résultats de contrôle associés. La période de conservation "
                    "des enregistrements de traçabilité est de minimum 10 ans pour les produits "
                    "à caractère sécuritaire et 5 ans pour les produits standards."
                ),
            },
            {
                "title": "4. Audit interne",
                "body": (
                    "L'organisme doit réaliser des audits internes à des intervalles planifiés "
                    "pour fournir des informations permettant de déterminer si le système de "
                    "management de la qualité est conforme aux propres exigences de l'organisme "
                    "et aux exigences du présent document, et s'il est efficacement mis en œuvre "
                    "et tenu à jour. L'organisme doit planifier, établir, mettre en œuvre et "
                    "maintenir un ou des programmes d'audit couvrant la fréquence, les méthodes, "
                    "les responsabilités, les exigences de planification et de compte rendu. "
                    "La fréquence minimale recommandée est d'un audit complet par an, avec des "
                    "audits partiels trimestriels sur les processus critiques."
                ),
            },
        ],
    },
    {
        "filename": "fiche_technique_materiau_epdm.pdf",
        "title": "Fiche Technique — Élastomère EPDM Grade Industriel",
        "sections": [
            {
                "title": "1. Identification du matériau",
                "body": (
                    "Désignation : EPDM 70 Shore A — Grade Industriel. "
                    "Famille chimique : Éthylène-Propylène-Diène Monomère. "
                    "Norme de référence : conforme aux spécifications techniques "
                    "pour applications d'étanchéité industrielle. "
                    "Couleur : Noir (chargé noir de carbone). "
                    "Densité : 1.15 ± 0.05 g/cm³. "
                    "Code matière interne : EPDM-70-IND-2024."
                ),
            },
            {
                "title": "2. Propriétés mécaniques",
                "body": (
                    "Dureté Shore A : 70 ± 5. "
                    "Résistance à la traction : ≥ 10 MPa. "
                    "Allongement à la rupture : ≥ 300%. "
                    "Déformation rémanente après compression (DRC) : ≤ 25% "
                    "(72h à 100°C, compression 25%). "
                    "Résistance au déchirement : ≥ 8 kN/m. "
                    "Module d'élasticité : 3.5 MPa (à 100% d'allongement). "
                    "Ces valeurs sont données à titre indicatif et peuvent varier "
                    "selon les conditions de mise en œuvre et de vulcanisation."
                ),
            },
            {
                "title": "3. Plage de températures",
                "body": (
                    "Température minimale d'utilisation continue : -40°C. "
                    "Température maximale d'utilisation continue : +150°C. "
                    "Température de pointe admissible (courte durée < 1h) : +175°C. "
                    "Fragilisation basse température (TR10) : -55°C. "
                    "ATTENTION : Au-delà de +150°C en utilisation continue, le matériau "
                    "subit une dégradation accélérée avec perte de propriétés mécaniques "
                    "significative. La durée de vie est réduite de 50% pour chaque "
                    "augmentation de 10°C au-dessus de la température maximale recommandée."
                ),
            },
            {
                "title": "4. Résistances chimiques",
                "body": (
                    "Résistance à l'ozone : Excellente (classement A). "
                    "Résistance aux UV : Bonne avec protection noir de carbone. "
                    "Résistance à la vapeur d'eau : Excellente jusqu'à 180°C. "
                    "Résistance aux acides dilués : Bonne. "
                    "Résistance aux bases : Bonne. "
                    "Résistance aux huiles minérales : Mauvaise — NE PAS UTILISER. "
                    "Résistance aux hydrocarbures : Mauvaise — NE PAS UTILISER. "
                    "Résistance aux fluides de frein DOT 3/4 : Bonne. "
                    "Pour les applications en contact avec des huiles, préférer le NBR ou le FKM."
                ),
            },
            {
                "title": "5. Applications typiques",
                "body": (
                    "Joints d'étanchéité pour circuits d'eau chaude et vapeur. "
                    "Membranes pour installations de traitement d'eau. "
                    "Joints de portes et fenêtres (bâtiment et automobile). "
                    "Revêtements de rouleaux pour industrie papetière. "
                    "Tuyaux flexibles pour fluides aqueux. "
                    "Isolation électrique basse tension. "
                    "Applications toiture et géomembrane."
                ),
            },
        ],
    },
    {
        "filename": "manuel_maintenance_moteur_industriel.pdf",
        "title": "Manuel de Maintenance — Moteur Asynchrone Triphasé Série MX",
        "sections": [
            {
                "title": "1. Consignes de sécurité",
                "body": (
                    "DANGER : Toute intervention sur le moteur doit être effectuée hors tension. "
                    "Vérifier l'absence de tension avec un détecteur approprié avant toute opération. "
                    "Attendre le refroidissement complet du moteur (température de surface < 40°C). "
                    "Porter les équipements de protection individuelle (EPI) : gants isolants, "
                    "lunettes de protection, chaussures de sécurité. "
                    "Les opérations de maintenance ne doivent être réalisées que par du personnel "
                    "qualifié ayant reçu la formation spécifique. "
                    "Consigner et cadenasser l'installation conformément à la procédure de sécurité "
                    "avant toute intervention."
                ),
            },
            {
                "title": "2. Maintenance préventive — Planning",
                "body": (
                    "INSPECTION VISUELLE (fréquence : mensuelle) : Vérifier l'état des câbles "
                    "d'alimentation, l'absence de fuites de graisse, l'état du ventilateur de "
                    "refroidissement, le serrage des borniers. Contrôler l'absence de vibrations "
                    "ou bruits anormaux en fonctionnement. Relever la température des paliers "
                    "avec un thermomètre infrarouge (seuil d'alerte : +80°C, seuil d'arrêt : +95°C). "
                    "CONTRÔLE DIMENSIONNEL (fréquence : trimestriel) : Mesurer l'isolement des "
                    "enroulements avec un mégohmmètre (valeur minimale acceptable : 1 MΩ par kV "
                    "de tension nominale + 1 MΩ). Vérifier l'alignement de l'accouplement "
                    "(tolérance : 0.05 mm en radial, 0.02 mm/100mm en angulaire). "
                    "REMPLACEMENT DES ROULEMENTS (fréquence : tous les 20 000 heures de fonctionnement "
                    "ou tous les 3 ans, selon la première échéance). "
                    "REMPLACEMENT DES JOINTS D'ÉTANCHÉITÉ (fréquence : tous les 18 mois ou en cas "
                    "de fuite détectée lors de l'inspection visuelle)."
                ),
            },
            {
                "title": "3. Procédure de regraissage des roulements",
                "body": (
                    "Graisse préconisée : graisse lithium EP2 haute température. "
                    "Quantité par roulement : selon la formule Q = D × B × 0.005 (en grammes), "
                    "où D est le diamètre extérieur et B la largeur du roulement en mm. "
                    "Procédure : 1) Nettoyer les graisseurs avec un chiffon propre. "
                    "2) Raccorder la pompe à graisse au graisseur. "
                    "3) Injecter la quantité calculée en faisant tourner l'arbre manuellement. "
                    "4) Laisser tourner le moteur à vide pendant 30 minutes pour permettre "
                    "l'évacuation de l'excédent de graisse par le déflecteur. "
                    "5) Vérifier la température des paliers après 2 heures de fonctionnement. "
                    "ATTENTION : Un excès de graisse provoque une surchauffe des roulements."
                ),
            },
            {
                "title": "4. Diagnostic des pannes courantes",
                "body": (
                    "Le moteur ne démarre pas : Vérifier l'alimentation (tension aux bornes), "
                    "contrôler les protections (disjoncteur, relais thermique), vérifier la "
                    "continuité des enroulements. "
                    "Vibrations excessives : Contrôler l'alignement, vérifier l'équilibrage "
                    "du rotor, inspecter l'état des roulements (mesure de vibration seuil "
                    "d'alerte : 4.5 mm/s RMS, seuil de danger : 7.1 mm/s RMS). "
                    "Surchauffe : Vérifier la charge (ne pas dépasser le courant nominal), "
                    "contrôler la ventilation (nettoyage des ailettes), vérifier l'équilibre "
                    "des phases (déséquilibre max : 2%). "
                    "Bruit anormal : Roulements usés (bruit de roulement), ventilateur endommagé "
                    "(bruit aérodynamique), frottement rotor-stator (bruit de frottement)."
                ),
            },
        ],
    },
]


def main():
    print("🏭 Génération des documents de démonstration NormAssist\n")
    for doc_def in DOCS:
        create_pdf(doc_def["filename"], doc_def["title"], doc_def["sections"])
    print(f"\n✅ {len(DOCS)} documents créés dans {SAMPLE_DIR}")


if __name__ == "__main__":
    main()