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