NormAssist / scripts /generate_samples.py
Dakoro's picture
Deploy NormAssist — 2026-03-30 16:14
4211d95
Raw
History Blame Contribute Delete
15.8 kB
"""
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()