Spaces:
Sleeping
Sleeping
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()
|