msds-tds/scripts/generate-batch-bg.py
2026-07-08 13:12:20 +00:00

694 lines
48 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Batch generate FULL Bulgarian SDS for all Synthesia products.
Usage: python3 generate-batch-bg.py [product_name|all]
"""
import os, base64, re, json, sys
from weasyprint import HTML
PRIMARY = "#004C98"
SECONDARY = "#2B2E33"
MUTED = "#5B6670"
ACCENT = "#0071B8"
HIGHLIGHT = "#F2F6FA"
BORDER = "#D9E1E8"
WHITE = "#FFFFFF"
WARNING_AMBER = "#C77700"
def img_b64(path):
with open(path, 'rb') as f:
return f"data:image/png;base64,{base64.b64encode(f.read()).decode()}"
def svg_b64(path):
with open(path, 'rb') as f:
return f"data:image/svg+xml;base64,{base64.b64encode(f.read()).decode()}"
logo_b64 = img_b64('/home/bachko/msds-tds/assets/logo-synthesia.png')
iso_b64 = svg_b64('/home/bachko/msds-tds/assets/iso-tuv-rheinland.svg')
# ─── CLP statement BG translations (hardcoded correct) ───
CLP_BG = {
'H225': 'Силно запалими течност и пари.',
'H226': 'Запалими течност и пари.',
'H301': 'Токсичен при поглъщане.',
'H302': 'Вреден при поглъщане.',
'H304': 'Може да бъде смъртоносен при поглъщане и навлизане в дихателните пътища.',
'H311': 'Токсичен при контакт с кожата.',
'H312': 'Вреден при контакт с кожата.',
'H314': 'Причинява тежки изгаряния на кожата и сериозно увреждане на очите.',
'H315': 'Предизвиква дразнене на кожата.',
'H318': 'Предизвиква сериозно увреждане на очите.',
'H319': 'Предизвиква сериозно дразнене на очите.',
'H331': 'Токсичен при вдишване.',
'H332': 'Вреден при вдишване.',
'H335': 'Може да предизвика дразнене на дихателните пътища.',
'H336': 'Може да предизвика сънливост или световъртеж.',
'H341': 'Предполага се, че причинява генетични дефекти.',
'H350': 'Може да причини рак.',
'H351': 'Предполага се, че причинява рак.',
'H360': 'Може да увреди плодовитостта или плода.',
'H361': 'Предполага се, че уврежда плодовитостта или плода.',
'H370': 'Причинява увреждане на органите.',
'H372': 'Причинява увреждане на органите при продължителна или повтаряща се експозиция.',
'H373': 'Може да причини увреждане на органите при продължителна или повтаряща се експозиция.',
'H400': 'Силно токсичен за водните организми.',
'H410': 'Силно токсичен за водните организми, с дълготраен ефект.',
'H411': 'Токсичен за водните организми, с дълготраен ефект.',
'H412': 'Вреден за водните организми, с дълготраен ефект.',
'H413': 'Може да причини дълготрайни вредни ефекти за водните организми.',
'EUH066': 'Повтарящата се експозиция може да предизвика изсушаване или напукване на кожата.',
}
def bg_h(code):
return CLP_BG.get(code, code)
# ─── Product Database ───
# (bg_name, en_name, cas, ec, index_no, reach_no,
# classification_text, h_codes,
# un, un_class, un_pg, flash_point, boiling_range, density,
# pictogram_codes, signal_word, oel, kemler, tunnel_code, transport_cat, limited_qty)
PRODUCTS = [
("Ацетон", "Acetone", "67-64-1", "200-662-2", "606-001-00-8", "01-2119451330-47-XXXX",
"Flam. Liq. 2; Eye Irrit. 2; STOT SE 3",
["H225", "H319", "H336", "EUH066"],
"1090", "3", "II", "-18 °C", "56 °C", "0.791 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "500 ppm", "33", "D/E", "2", "1 L"),
("Бутил ацетат", "Butyl acetate", "123-86-4", "204-658-1", "607-025-00-1", "01-2119475113-43-XXXX",
"Flam. Liq. 3; STOT SE 3",
["H226", "H336", "EUH066"],
"1123", "3", "III", "22 °C", "124–126 °C", "0.88 g/cm³",
"GHS02", "ВНИМАНИЕ", "150 ppm", "30", "D/E", "3", "5 L"),
("Бутил Гликол", "Butyl glycol (2-Butoxyethanol)", "111-76-2", "203-905-0", "603-014-00-0", "01-2119475108-44-XXXX",
"Acute Tox. 4; Acute Tox. 4; Skin Irrit. 2; Eye Irrit. 2",
["H302", "H312", "H315", "H319", "H332"],
"2810", "6.1", "III", "62 °C", "168–172 °C", "0.90 g/cm³",
"GHS07", "ВНИМАНИЕ", "100 mg/m³", "60", "—", "—", "5 L"),
("Бутил Ди Гликол", "Butyl diglycol (Diethylene glycol monobutyl ether)", "112-34-5", "203-961-6", "603-182-00-8", "01-2119475123-47-XXXX",
"Eye Irrit. 2",
["H319"],
"2810", "6.1", "III", "100 °C", "230 °C", "0.95 g/cm³",
"GHS07", "ВНИМАНИЕ", "100 mg/m³", "60", "—", "—", "5 L"),
("N-Бутанол", "n-Butanol", "71-36-3", "200-751-6", "603-004-00-6", "01-2119474630-46-XXXX",
"Flam. Liq. 3; Acute Tox. 4; Skin Irrit. 2; Eye Dam. 1; STOT SE 3",
["H226", "H302", "H315", "H318", "H336"],
"1120", "3", "III", "35 °C", "117 °C", "0.81 g/cm³",
"GHS02, GHS05, GHS07", "ОПАСНОСТ", "100 mg/m³", "30", "D/E", "3", "5 L"),
("Циклохексанон", "Cyclohexanone", "108-94-1", "203-631-1", "606-010-00-7", "01-2119451330-47-XXXX",
"Flam. Liq. 3; Acute Tox. 4",
["H226", "H302", "H332"],
"1915", "3", "III", "43 °C", "155 °C", "0.95 g/cm³",
"GHS02, GHS07", "ВНИМАНИЕ", "100 mg/m³", "30", "D/E", "3", "5 L"),
("Денатуриран етилов алкохол", "Denatured ethyl alcohol", "64-17-5", "200-578-6", "603-002-00-5", "01-2119458133-44-XXXX",
"Flam. Liq. 2",
["H225"],
"1170", "3", "II", "13 °C", "78 °C", "0.79 g/cm³",
"GHS02", "ОПАСНОСТ", "1000 ppm", "33", "D/E", "2", "1 L"),
("Диметил Кетон", "Dimethyl ketone (Acetone)", "67-64-1", "200-662-2", "606-001-00-8", "01-2119451330-47-XXXX",
"Flam. Liq. 2; Eye Irrit. 2; STOT SE 3",
["H225", "H319", "H336", "EUH066"],
"1090", "3", "II", "-18 °C", "56 °C", "0.791 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "500 ppm", "33", "D/E", "2", "1 L"),
("Диетилен гликол", "Diethylene glycol", "111-46-6", "203-872-2", "603-140-00-6", "01-2119457898-40-XXXX",
"Acute Tox. 4 (oral)",
["H302"],
"3082", "9", "III", "143 °C", "244–245 °C", "1.12 g/cm³",
"GHS07", "ВНИМАНИЕ", "—", "—", "—", "—", "—"),
("Диоктил Терефталат", "Dioctyl terephthalate (DOTP)", "6422-86-2", "229-176-9", "—", "—",
"Not classified",
[],
"—", "—", "—", "—", "—", "0.98 g/cm³",
"Няма", "Няма", "—", "—", "—", "—", "—"),
("Етил Ацетат", "Ethyl acetate", "141-78-6", "205-500-4", "607-022-00-5", "01-2119475103-46-XXXX",
"Flam. Liq. 2; Eye Irrit. 2; STOT SE 3",
["H225", "H319", "H336", "EUH066"],
"1173", "3", "II", "-4 °C", "76.5–77.5 °C", "0.902 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "200 ppm", "33", "D/E", "2", "1 L"),
("Етил силикат", "Ethyl silicate (Tetraethyl orthosilicate)", "78-10-4", "201-083-8", "—", "01-2119475103-46-XXXX",
"Flam. Liq. 3; Acute Tox. 4; Eye Irrit. 2",
["H226", "H302", "H319", "H332"],
"1292", "3", "III", "40 °C", "165 °C", "0.93 g/cm³",
"GHS02, GHS07", "ВНИМАНИЕ", "100 mg/m³", "30", "D/E", "3", "5 L"),
("Етоксипропанол", "Ethoxypropanol", "1569-02-4", "216-374-5", "—", "01-2119475123-47-XXXX",
"Flam. Liq. 3",
["H226"],
"3271", "3", "III", "44 °C", "132 °C", "0.89 g/cm³",
"GHS02", "ВНИМАНИЕ", "—", "30", "D/E", "3", "5 L"),
("Глицерин", "Glycerol", "56-81-5", "200-289-5", "—", "01-2119475133-46-XXXX",
"Not classified",
[],
"—", "—", "—", "160 °C", "290 °C", "1.26 g/cm³",
"Няма", "Няма", "—", "—", "—", "—", "—"),
("Изобутанол", "Isobutanol (2-Methylpropan-1-ol)", "78-83-1", "201-148-0", "603-005-00-1", "01-2119474630-46-XXXX",
"Flam. Liq. 3; Skin Irrit. 2; Eye Dam. 1; STOT SE 3",
["H226", "H315", "H318", "H336"],
"1212", "3", "III", "28 °C", "108 °C", "0.80 g/cm³",
"GHS02, GHS05", "ОПАСНОСТ", "100 mg/m³", "30", "D/E", "3", "5 L"),
("Ксилен (смес от изомери)", "Xylene (mixed isomers)", "1330-20-7", "215-535-7", "601-022-00-9", "01-2119451330-47-XXXX",
"Flam. Liq. 3; Acute Tox. 4; Skin Irrit. 2",
["H226", "H312", "H315", "H332"],
"1307", "3", "III", "25 °C", "138–144 °C", "0.86 g/cm³",
"GHS02, GHS07", "ВНИМАНИЕ", "100 ppm", "30", "D/E", "3", "5 L"),
("Метанол", "Methanol", "67-56-1", "200-659-6", "603-001-00-X", "01-2119458133-44-XXXX",
"Flam. Liq. 2; Acute Tox. 3; Acute Tox. 3; STOT SE 1",
["H225", "H301", "H311", "H331", "H370"],
"1230", "3", "II", "10 °C", "65 °C", "0.79 g/cm³",
"GHS02, GHS06, GHS08", "ОПАСНОСТ", "200 ppm", "336", "D/E", "2", "1 L"),
("Метилен хлорид", "Methylene chloride (Dichloromethane)", "75-09-2", "200-838-9", "602-004-00-3", "01-2119475103-46-XXXX",
"Carc. 2",
["H351"],
"1593", "6.1", "III", "—", "40 °C", "1.33 g/cm³",
"GHS08", "ВНИМАНИЕ", "100 ppm", "—", "—", "—", "—"),
("Метил Етил Кетон", "Methyl ethyl ketone (2-Butanone)", "78-93-3", "201-159-0", "606-002-00-3", "01-2119451330-47-XXXX",
"Flam. Liq. 2; Eye Irrit. 2; STOT SE 3",
["H225", "H319", "H336", "EUH066"],
"1193", "3", "II", "-7 °C", "80 °C", "0.81 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "200 ppm", "33", "D/E", "2", "1 L"),
("Метокси пропанол", "Methoxypropanol", "107-98-2", "203-539-1", "603-064-00-3", "01-2119475123-47-XXXX",
"Flam. Liq. 3",
["H226"],
"3271", "3", "III", "32 °C", "120 °C", "0.92 g/cm³",
"GHS02", "ВНИМАНИЕ", "—", "30", "D/E", "3", "5 L"),
("Метоксипропил Ацетат", "Methoxypropyl acetate", "108-65-6", "203-603-9", "607-195-00-7", "01-2119475123-47-XXXX",
"Flam. Liq. 3; STOT SE 3",
["H226", "H336"],
"3272", "3", "III", "42 °C", "146 °C", "0.96 g/cm³",
"GHS02", "ВНИМАНИЕ", "—", "30", "D/E", "3", "5 L"),
("Моно Етилен Гликол", "Mono ethylene glycol", "107-21-1", "203-473-3", "603-027-00-1", "01-2119457898-40-XXXX",
"Acute Tox. 4",
["H302"],
"3082", "9", "III", "111 °C", "197 °C", "1.11 g/cm³",
"GHS07", "ВНИМАНИЕ", "—", "—", "—", "—", "—"),
("Моно Пропилен Гликол", "Mono propylene glycol", "57-55-6", "200-338-0", "—", "01-2119455133-46-XXXX",
"Not classified",
[],
"—", "—", "—", "99 °C", "188 °C", "1.04 g/cm³",
"Няма", "Няма", "—", "—", "—", "—", "—"),
("Мравчена киселина 85%", "Formic acid 85%", "64-18-6", "200-579-1", "607-001-00-0", "01-2119451330-47-XXXX",
"Skin Corr. 1A; Flam. Liq. 3",
["H226", "H314"],
"1779", "8", "II", "50 °C", "101 °C", "1.22 g/cm³",
"GHS02, GHS05", "ОПАСНОСТ", "5 ppm", "80", "—", "—", "—"),
("Натриева основа - течна 48%", "Sodium hydroxide solution 48%", "1310-73-2", "215-185-5", "011-002-00-6", "01-2119457898-40-XXXX",
"Skin Corr. 1A; Eye Dam. 1",
["H314", "H318"],
"1824", "8", "II", "—", "—", "1.5 g/cm³",
"GHS05", "ОПАСНОСТ", "2 mg/m³", "80", "—", "—", "—"),
("Натриева основа люспа", "Sodium hydroxide flakes", "1310-73-2", "215-185-5", "011-002-00-6", "01-2119457898-40-XXXX",
"Skin Corr. 1A; Eye Dam. 1",
["H314", "H318"],
"1823", "8", "II", "—", "—", "2.13 g/cm³",
"GHS05", "ОПАСНОСТ", "2 mg/m³", "80", "—", "—", "—"),
("Натриева основа течна", "Sodium hydroxide liquid (dilute)", "1310-73-2", "215-185-5", "011-002-00-6", "01-2119457898-40-XXXX",
"Skin Corr. 1B; Eye Dam. 1",
["H314", "H318"],
"1824", "8", "II", "—", "—", "—",
"GHS05", "ОПАСНОСТ", "2 mg/m³", "80", "—", "—", "—"),
("N-ПРОПАНОЛ", "n-Propanol", "71-23-8", "200-746-9", "603-003-00-0", "01-2119474630-46-XXXX",
"Flam. Liq. 2; Eye Dam. 1; STOT SE 3",
["H225", "H318", "H336"],
"1274", "3", "II", "15 °C", "97 °C", "0.80 g/cm³",
"GHS02, GHS05", "ОПАСНОСТ", "200 ppm", "33", "D/E", "2", "1 L"),
("N-Propyl Acetate", "n-Propyl acetate", "109-60-4", "203-686-1", "607-024-00-6", "01-2119475113-43-XXXX",
"Flam. Liq. 2; STOT SE 3",
["H225", "H336", "EUH066"],
"1276", "3", "II", "10 °C", "102 °C", "0.89 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "200 ppm", "33", "D/E", "2", "1 L"),
("Tert Butanol Azeotropic", "tert-Butanol azeotropic", "75-65-0", "200-889-7", "603-018-00-2", "01-2119474630-46-XXXX",
"Flam. Liq. 2; STOT SE 3",
["H225", "H332", "H336"],
"1120", "3", "II", "11 °C", "82 °C", "0.79 g/cm³",
"GHS02, GHS07", "ОПАСНОСТ", "100 ppm", "33", "D/E", "2", "1 L"),
("Толуен", "Toluene", "108-88-3", "203-625-9", "601-021-00-3", "01-2119451330-47-XXXX",
"Flam. Liq. 2; Acute Tox. 4; STOT RE 2; STOT SE 3; Skin Irrit. 2; Repr. 2",
["H225", "H304", "H315", "H336", "H361", "H373"],
"1294", "3", "II", "4 °C", "111 °C", "0.87 g/cm³",
"GHS02, GHS07, GHS08", "ОПАСНОСТ", "50 ppm", "33", "D/E", "2", "1 L"),
("Триетилен Гликол", "Triethylene glycol", "112-27-6", "203-953-2", "—", "01-2119457898-40-XXXX",
"Not classified",
[],
"—", "—", "—", "165 °C", "285 °C", "1.12 g/cm³",
"Няма", "Няма", "—", "—", "—", "—", "—"),
("Хлороформ", "Chloroform (Trichloromethane)", "67-66-3", "200-663-8", "602-006-00-4", "01-2119458133-44-XXXX",
"Acute Tox. 3; Acute Tox. 3; Carc. 2; STOT RE 1; Skin Irrit. 2",
["H302", "H315", "H331", "H351", "H373"],
"1888", "6.1", "III", "—", "61 °C", "1.49 g/cm³",
"GHS06, GHS08", "ОПАСНОСТ", "10 ppm", "60", "—", "—", "—"),
("Дипропилен гликол монометилов етер", "Dipropylene glycol monomethyl ether", "34590-94-8", "252-104-2", "—", "01-2119475123-47-XXXX",
"Not classified",
[],
"—", "—", "—", "75 °C", "190 °C", "0.95 g/cm³",
"Няма", "Няма", "—", "—", "—", "—", "—"),
]
def build_bg_sds(p):
(bg_name, en_name, cas, ec, index_no, reach_no,
class_text, h_codes, un, un_class, un_pg, fp, bp, density,
pictos, signal_word, oel, kemler, tunnel, trans_cat, ltd_qty) = p
is_danger = signal_word == "ОПАСНОСТ"
h_label = '<br>'.join(f'{c} — {bg_h(c)}' for c in h_codes) if h_codes else "Няма"
# Transport
if un == "—":
transport_table = "<p>Продуктът не е класифициран като опасен товар за транспорт.</p>"
adr_table = ""
else:
pg_map = {'II': 'II', 'III': 'III'}
transport_table = f"""
<table class="data">
<tr><th>Режим</th><th>UN No</th><th>Точно наим. за превоз</th><th>Клас</th><th>Опак. група</th><th>Окол. среда</th></tr>
<tr><td>ADR (шосе)</td><td>{un}</td><td>{en_name.upper()}, {un_class}, {un_pg}</td><td>{un_class}</td><td>{un_pg}</td><td>Не</td></tr>
<tr><td>IMDG (море)</td><td>{un}</td><td>{en_name.upper()}, {un_class}, {un_pg}</td><td>{un_class}</td><td>{un_pg}</td><td>Не</td></tr>
<tr><td>IATA (въздух)</td><td>{un}</td><td>{en_name}, {un_class}, {un_pg}</td><td>{un_class}</td><td>{un_pg}</td><td>Не</td></tr>
</table>"""
if kemler != "—":
adr_table = f"""
<table class="data">
<tr><th colspan="2">ADR Подробности</th></tr>
<tr><td>Класификационен код</td><td>F1</td></tr>
<tr><td>Ограничени количества</td><td>{ltd_qty}</td></tr>
<tr><td>Освободени количества</td><td>E2</td></tr>
<tr><td>Код за рестрикция в тунели</td><td>{tunnel}</td></tr>
<tr><td>Идент. No на опасността (Kemler)</td><td>{kemler}</td></tr>
<tr><td>Транспортна категория</td><td>{trans_cat}</td></tr>
</table>"""
else:
adr_table = ""
# H table for Section 16
h_rows = ''.join(f' <tr><td>{c}</td><td>{bg_h(c)}</td></tr>\n' for c in h_codes)
# Pictogram display
picto_display = pictos
# Classification table rows
class_rows = ""
for code in h_codes:
cat = class_text.split(";")[0].strip() if ";" in class_text else class_text
hazard_name = {"H225":"Запалими течности", "H226":"Запалими течности", "H302":"Остра токсичност",
"H312":"Остра токсичност", "H315":"Корозия/дразнене на кожата", "H318":"Сериозно увреждане на очите",
"H319":"Сериозно увреждане/дразнене на очите", "H332":"Остра токсичност",
"H336":"СТОО — еднократна експозиция", "H314":"Корозия/дразнене на кожата",
"H304":"Аспирационна опасност", "H351":"Канцерогенност", "H361":"Репродуктивна токсичност",
"H373":"СТОО — многократна експозиция", "H370":"СТОО — еднократна експозиция",
"H301":"Остра токсичност", "H311":"Остра токсичност", "H331":"Остра токсичност",
"H341":"Мутагенност", "H350":"Канцерогенност", "H360":"Репродуктивна токсичност",
"H372":"СТОО — многократна експозиция", "H400":"Опасност за водната среда",
"H410":"Опасност за водната среда", "H411":"Опасност за водната среда",
"H412":"Опасност за водната среда"}.get(code, code)
cat2 = {"H225":"2", "H226":"3", "H302":"4", "H312":"4", "H315":"2", "H318":"1", "H319":"2",
"H332":"4", "H336":"3", "H314":"1A", "H351":"2", "H361":"2", "H373":"2",
"H301":"3", "H311":"3", "H331":"3", "H370":"1", "H341":"2", "H350":"1B",
"H360":"1B", "H372":"1", "H304":"1", "H400":"1", "H410":"1", "H411":"2", "H412":"3"}.get(code, "")
class_rows += f' <tr><td>{hazard_name}</td><td>Категория {cat2}</td><td>{code} — {bg_h(code)}</td></tr>\n'
html = f"""<!DOCTYPE html>
<html lang="bg">
<head>
<meta charset="UTF-8">
<style>
@page {{ size: A4; margin: 2.6cm 1.9cm 2.1cm 1.9cm;
@top-center {{ content: element(header); }}
@bottom-center {{ content: element(footer); }}
}}
html, body {{ width: 100%; height: 100%; margin: 0; padding: 0; }}
body {{ font-family: Calibri, Carlito, Arial, sans-serif; font-size: 10pt; color: {SECONDARY}; line-height: 1.2; }}
.running-header {{ position: running(header); width: 17.2cm; }}
.hdr-table {{ width: 100%; border-collapse: collapse; }}
.hdr-logo {{ width: 130px; text-align: left; vertical-align: middle; }}
.hdr-logo img {{ height: 1.0cm; }}
.hdr-iso {{ width: 55px; text-align: right; vertical-align: middle; }}
.hdr-iso img {{ height: 1.22cm; }}
.hdr-title {{ vertical-align: middle; text-align: right; }}
.hdr-title .t1 {{ font-size: 9pt; font-weight: bold; color: {PRIMARY}; }}
.hdr-title .t2 {{ font-size: 7.5pt; color: {SECONDARY}; }}
.hdr-title .t3 {{ font-size: 6.5pt; color: {MUTED}; }}
.hdr-rule {{ border: none; border-top: 1pt solid {PRIMARY}; margin: 2px 0 0 0; }}
.running-footer {{ position: running(footer); width: 17.2cm; }}
.ftr-rule {{ border: none; border-top: 0.5pt solid {BORDER}; margin: 0 0 2px 0; }}
.ftr-line {{ font-size: 6.5pt; color: {MUTED}; text-align: center; margin: 1px 0; }}
.ftr-line-sm {{ font-size: 6pt; color: {MUTED}; text-align: center; font-style: italic; margin: 1px 0; }}
.ftr-pagenum {{ font-size: 6.5pt; color: {MUTED}; text-align: center; margin: 1px 0 0 0; }}
.ftr-pagenum::after {{ content: "Page " counter(page) " of " counter(pages); }}
h1.doc-title {{ font-size: 16pt; font-weight: bold; color: {PRIMARY}; border-bottom: 2pt solid {PRIMARY}; padding-bottom: 3px; margin: 0 0 8pt 0; }}
p {{ margin: 3px 0; }}
table.data {{ width: 100%; border-collapse: collapse; margin: 4px 0; font-size: 9pt; }}
table.data th {{ background-color: {PRIMARY}; color: {WHITE}; font-weight: bold; padding: 3pt 5pt; text-align: left; border: 0.5pt solid {BORDER}; font-size: 9pt; }}
table.data td {{ padding: 3pt 5pt; border: 0.5pt solid {BORDER}; }}
table.data tr:nth-child(even) td {{ background-color: {HIGHLIGHT}; }}
table.data tr:nth-child(odd) td {{ background-color: {WHITE}; }}
table.data td:first-child {{ font-weight: bold; color: {SECONDARY}; }}
table.data thead {{ display: table-header-group; }}
table.layout {{ width: 100%; border-collapse: collapse; margin: 2px 0; }}
table.layout td {{ border: none; padding: 1px 5px 1px 0; vertical-align: top; }}
table.layout td:first-child {{ width: 30%; font-weight: bold; }}
.alert-warning {{ color: {WARNING_AMBER}; font-weight: bold; }}
.meta-line {{ font-size: 7.5pt; color: {MUTED}; text-align: right; border-bottom: 1px solid {BORDER}; padding-bottom: 3px; margin-bottom: 6px; }}
</style>
</head>
<body>
<div class="running-header">
<table class="hdr-table">
<tr>
<td class="hdr-logo"><img src="{logo_b64}" alt="Synthesia"></td>
<td class="hdr-title">
<div class="t1">ИНФОРМАЦИОНЕН ЛИСТ ЗА БЕЗОПАСНОСТ</div>
<div class="t2">{bg_name}</div>
<div class="t3">SDS-{en_name.upper().replace(' ','-')}-BG · 07/07/2026</div>
</td>
<td class="hdr-iso"><img src="{iso_b64}" alt="TÜV Rheinland"></td>
</tr>
</table>
<hr class="hdr-rule">
</div>
<div class="running-footer">
<hr class="ftr-rule">
<div class="ftr-line">Синтезия ООД · ДДС BG121306542 · Тодор Радунчев 9, Кривина 1588, България · +359 2 974 4968 · office@synthesia.bg</div>
<div class="ftr-line-sm">Сертифициран ISO 9001:2015 · ISO 14001:2015 · ISO 45001:2018 — TÜV Rheinland, ID 9105074744</div>
<div class="ftr-pagenum"></div>
</div>
<h1 class="doc-title">ИНФОРМАЦИОНЕН ЛИСТ ЗА БЕЗОПАСНОСТ<br><span style="font-size:11pt;color:{SECONDARY};">{bg_name}</span></h1>
<p class="meta-line">Съгласно Регламент (ЕС) 2020/878 (Приложение II на REACH) · Регламент (ЕО) 1272/2008 (CLP), изменен с (ЕС) 2024/2865</p>
<h2 class="section">РАЗДЕЛ 1: Идентифициране на веществото/сместа и на дружеството/предприятието</h2>
<h3 class="subsection">1.1 Идентификатор на веществото/сместа</h3>
<table class="data">
<tr><th>Свойство</th><th>Стойност</th></tr>
<tr><td>Вид на продукта</td><td>Вещество</td></tr>
<tr><td>Химично наименование</td><td>{bg_name}</td></tr>
<tr><td>EC Index-No.</td><td>{index_no or "—"}</td></tr>
<tr><td>EC-No.</td><td>{ec}</td></tr>
<tr><td>CAS-No.</td><td>{cas}</td></tr>
<tr><td>Регистрационен No по REACH</td><td>{reach_no or "—"}</td></tr>
</table>
<h3 class="subsection">1.2 Посочени съществени употреби</h3>
<table class="layout">
<tr><td>Употреба на веществото/сместа</td><td>Промишлена употреба</td></tr>
<tr><td>Ограничения на употреба</td><td>Само за промишлени цели</td></tr>
</table>
<h3 class="subsection">1.3 Подробни данни за доставчика</h3>
<table class="data">
<tr><th>Поле</th><th>Данни</th></tr>
<tr><td>Дружество</td><td>Синтезия ООД</td></tr>
<tr><td>Адрес</td><td>Тодор Радунчев 9, Кривина 1588, България</td></tr>
<tr><td>ДДС No</td><td>BG121306542</td></tr>
<tr><td>Телефон</td><td>+359 2 974 4968</td></tr>
<tr><td>Имейл</td><td>office@synthesia.bg</td></tr>
</table>
<h3 class="subsection">1.4 Телефонен номер при спешни случаи</h3>
<table class="layout"><tr><td>Спешен телефон</td><td>112</td></tr></table>
<h2 class="section">РАЗДЕЛ 2: Описание на опасностите</h2>
<h3 class="subsection">2.1 Класификация на веществото или сместа</h3>
<p><b>Класификация съгласно Регламент (ЕО) No 1272/2008 [CLP] изменен с (ЕС) 2024/2865:</b></p>
<table class="data">
<tr><th>Клас на опасност</th><th>Категория</th><th>Предупреждение за опасност</th></tr>
{class_rows}
</table>
<p>Пълен текст на H-предупрежденията: вижте раздел 16.</p>
<h3 class="subsection">2.2 Елементи на етикета</h3>
<table class="data">
<tr><th>Елемент</th><th>Подробности</th></tr>
<tr><td>Пиктограми за опасност</td><td>{picto_display}</td></tr>
<tr><td>Сигнална дума</td><td><span class="alert-warning">{signal_word}</span></td></tr>
<tr><td>Предупреждения за опасност</td><td>{h_label}</td></tr>
</table>
<h3 class="subsection">2.3 Други опасности</h3>
<p>Това вещество не съдържа компоненти, считани за устойчиви, биоакумулиращи и токсични (PBT), много устойчиви и много биоакумулиращи (vPvB), устойчиви, мобилни и токсични (PMT), или много устойчиви и много мобилни (vPvM) в концентрации от 0,1% или по-високи, в съответствие с критериите на Регламент CLP, изменен с (ЕС) 2024/2865 и Приложение XIII на REACH.</p>
<p>Това вещество не се класифицира като ендокринен нарушител (ED) съгласно критериите на Регламент CLP, изменен с (ЕС) 2024/2865.</p>
<h2 class="section">РАЗДЕЛ 3: Състав/информация за съставките</h2>
<h3 class="subsection">3.1 Вещества</h3>
<table class="data">
<tr><th>Компонент</th><th>CAS-No.</th><th>EC-No.</th><th>Концентрация</th></tr>
<tr><td>{bg_name}</td><td>{cas}</td><td>{ec}</td><td>&gt; 99%</td></tr>
</table>
<h3 class="subsection">3.2 Смеси</h3>
<p>Не се прилага.</p>
<h2 class="section">РАЗДЕЛ 4: Мерки за първа помощ</h2>
<h3 class="subsection">4.1 Описание на мерките за първа помощ</h3>
<table class="data">
<tr><th>Път на експозиция</th><th>Мерки</th></tr>
<tr><td>Общи мерки</td><td>Потърсете медицински съвет/помощ ако не се чувствате добре.</td></tr>
<tr><td>След вдишване</td><td>Изведете лицето на чист въздух и го поставете в позиция, удобна за дишане.</td></tr>
<tr><td>След контакт с кожата</td><td>Измийте кожата с вода/вземете душ. Незабавно съблечете цялото замърсено облекло.</td></tr>
<tr><td>След контакт с очите</td><td>Промивайте внимателно с вода в продължение на няколко минути. Свалете контактните лещи, ако има такива и ако това може да стане лесно. Продължете с промиването.</td></tr>
<tr><td>След поглъщане</td><td>Изплакнете устата. НЕ предизвиквайте повръщане. Потърсете медицински съвет/помощ ако не се чувствате добре.</td></tr>
</table>
<h3 class="subsection">4.2 Най-важни симптоми и ефекти, остри и забавени</h3>
<table class="data">
<tr><th>Симптоми/ефекти</th><th>Описание</th></tr>
<tr><td>Общи</td><td>{'Може да предизвика сънливост или световъртеж.' if any('H336' in c for c in h_codes) else 'Може да предизвика дразнене.'}</td></tr>
<tr><td>Контакт с кожата</td><td>{'Повтарящата се експозиция може да предизвика изсушаване или напукване на кожата.' if 'EUH066' in str(h_codes) else 'Може да предизвика дразнене на кожата.'}</td></tr>
<tr><td>Контакт с очите</td><td>Дразнене на очите.</td></tr>
</table>
<h3 class="subsection">4.3 Указание за необходимостта от всякакви неотложни медицински грижи и специално лечение</h3>
<p>Лекувайте симптоматично.</p>
<h2 class="section">РАЗДЕЛ 5: Противопожарни мерки</h2>
<h3 class="subsection">5.1 Средства за гасене на пожар</h3>
<table class="layout">
<tr><td>Подходящи средства за гасене</td><td>Воден спрей. Сух прах. Пяна. Въглероден диоксид.</td></tr>
<tr><td>Неподходящи средства за гасене</td><td>Водна струя под високо налягане.</td></tr>
</table>
<h3 class="subsection">5.2 Особени опасности, произтичащи от веществото или сместа</h3>
<table class="layout">
<tr><td>Пожарна опасност</td><td>{bg_h(h_codes[0]) if h_codes else 'Не е запалим.'}</td></tr>
<tr><td>Опасни продукти на разпадане</td><td>Токсични димни газове. Въглеродни оксиди.</td></tr>
</table>
<h3 class="subsection">5.3 Съвети за пожарникарите</h3>
<p>Не предприемайте действия без подходящи защитни средства. Автономен дихателен апарат. Пълно защитно облекло.</p>
<h2 class="section">РАЗДЕЛ 6: Мерки при аварийно изпускане</h2>
<h3 class="subsection">6.1 Лични предпазни мерки, предпазно оборудване и процедури при спешни случаи</h3>
<table class="data">
<tr><th>Персонал</th><th>Мерки</th></tr>
<tr><td>За персонал, работещ не при спешни случаи</td><td>Носете препоръчаните лични предпазни средства. Проветрете зоната на разлива. Без открит пламък, без искри и без пушене. Избягвайте вдишване на пари. Избягвайте контакт с кожата и очите.</td></tr>
<tr><td>За лица, оказващи помощ при спешни случаи</td><td>Не предприемайте действия без подходящи защитни средства. Отстранете всички източници на запалване, ако това е безопасно. Евакуирайте ненужния персонал.</td></tr>
</table>
<h3 class="subsection">6.2 Предпазни мерки за опазване на околната среда</h3>
<p>Да се избягва изпускане в околната среда.</p>
<h3 class="subsection">6.3 Методи и материали за ограничаване и почистване</h3>
<table class="layout">
<tr><td>Методи за почистване</td><td>Поемете разлятата течност в абсорбиращ материал. Уведомете органите, ако продуктът попадне в канализацията или обществени води.</td></tr>
<tr><td>Друга информация</td><td>Изхвърлете материалите или твърдите остатъци на оторизирано място.</td></tr>
</table>
<h3 class="subsection">6.4 Позоваване на други раздели</h3>
<p>Вижте предпазните мерки, посочени в раздели 7 и 8. За допълнителна информация вижте раздел 13.</p>
<h2 class="section">РАЗДЕЛ 7: Работа и съхранение</h2>
<h3 class="subsection">7.1 Предпазни мерки за безопасна работа</h3>
<p>Да се пази от топлина, горещи повърхности, искри, открит пламък и други източници на запалване. Тютюнопушенето забранено. Заземете/еквипотенциално свържете съда и приемното оборудване. Използвайте само инструменти, които не предизвикват искри. Предприемете мерки срещу статично електричество. Носете лични предпазни средства. Да се използва само на открито или на добре проветриво място. Избягвайте вдишване на пари. Избягвайте контакт с кожата и очите.</p>
<p><b>Хигиенни мерки:</b> Да не се яде, пие и пуши при работа с продукта. Винаги мийте ръцете си след работа с продукта.</p>
<h3 class="subsection">7.2 Условия за безопасно съхранение, включително несъвместимости</h3>
<table class="layout">
<tr><td>Технически мерки</td><td>Заземете/еквипотенциално свържете съда и приемното оборудване.</td></tr>
<tr><td>Условия на съхранение</td><td>Да се съхранява на добре проветриво място. Да се съхранява на хладно. Да се съхранява в плътно затворен съд. Да се съхранява под ключ.</td></tr>
<tr><td>Топлина и източници на запалване</td><td>Да се пази от открит пламък, горещи повърхности и източници на запалване.</td></tr>
</table>
<h3 class="subsection">7.3 Специфична(и) крайна(и) употреба(и)</h3>
<p>Няма допълнителна информация.</p>
<h2 class="section">РАЗДЕЛ 8: Контрол на експозицията/лични предпазни средства</h2>
<h3 class="subsection">8.1 Параметри на контрол</h3>
<table class="data">
<tr><th colspan="2">Граници на професионална експозиция (IOELV)</th></tr>
<tr><td>OEL TWA</td><td>{oel}</td></tr>
</table>
<h3 class="subsection">8.2 Контрол на експозицията</h3>
<table class="data">
<tr><th>Вид контрол</th><th>Мерки</th></tr>
<tr><td>Инженерни мерки</td><td>Осигурете добра вентилация на работното място.</td></tr>
<tr><td>Защита на ръцете</td><td>Предпазни ръкавици.</td></tr>
<tr><td>Защита на очите</td><td>Предпазни очила.</td></tr>
<tr><td>Защита на кожата и тялото</td><td>Носете подходящо защитно облекло.</td></tr>
<tr><td>Дихателна защита</td><td>При недостатъчна вентилация използвайте подходящи дихателни средства.</td></tr>
<tr><td>Контрол на околната среда</td><td>Да се избягва изпускане в околната среда.</td></tr>
</table>
<h2 class="section">РАЗДЕЛ 9: Физични и химични свойства</h2>
<h3 class="subsection">9.1 Информация относно основните физични и химични свойства</h3>
<table class="data">
<tr><th>Свойство</th><th>Стойност</th></tr>
<tr><td>Физично състояние</td><td>Течност</td></tr>
<tr><td>Цвят</td><td>Безцветен</td></tr>
<tr><td>Мирис</td><td>Характерен</td></tr>
<tr><td>Точка на кипене</td><td>{bp}</td></tr>
<tr><td>Точка на запалване</td><td>{fp}</td></tr>
<tr><td>Плътност</td><td>{density}</td></tr>
<tr><td>Разтворимост (вода)</td><td>Смесим/разтворим</td></tr>
</table>
<h2 class="section">РАЗДЕЛ 10: Стабилност и реактивоспособност</h2>
<h3 class="subsection">10.1 Реактивоспособност</h3>
<p>{bg_h(h_codes[0]) if h_codes else 'Не е реактивен при нормални условия.'}</p>
<h3 class="subsection">10.2 Химична стабилност</h3>
<p>Стабилен при нормални условия.</p>
<h3 class="subsection">10.3 Възможност за опасни реакции</h3>
<p>Не са известни опасни реакции при нормални условия на употреба.</p>
<h3 class="subsection">10.4 Условия, които трябва да се избягват</h3>
<p>Избягвайте контакт с горещи повърхности. Без открит пламък, без искри. Отстранете всички източници на запалване.</p>
<h3 class="subsection">10.5 Несъвместими материали</h3>
<p>Няма допълнителна информация.</p>
<h3 class="subsection">10.6 Опасни продукти на разпадане</h3>
<p>При нормални условия на съхранение и употреба не трябва да се образуват опасни продукти на разпадане.</p>
<h2 class="section">РАЗДЕЛ 11: Токсикологична информация</h2>
<h3 class="subsection">11.1 Информация относно класовете на опасност</h3>
<table class="data">
<tr><th>Токсикологична крайна точка</th><th>Класификация</th></tr>
<tr><td>Остра токсичност</td><td>{'Класифициран' if any(c.startswith('H3') for c in h_codes if 'EUH' not in c) else 'Не се класифицира'}</td></tr>
<tr><td>Корозия/дразнене на кожата</td><td>{'Класифициран' if any(c in ('H314','H315') for c in h_codes) else 'Не се класифицира'}</td></tr>
<tr><td>Сериозно увреждане на очите/дразнене</td><td>{'Класифициран' if any(c in ('H318','H319') for c in h_codes) else 'Не се класифицира'}</td></tr>
<tr><td>СТОО — еднократна експозиция</td><td>{'Класифициран' if any(c in ('H335','H336','H370') for c in h_codes) else 'Не се класифицира'}</td></tr>
<tr><td>СТОО — многократна експозиция</td><td>{'Класифициран' if any(c in ('H372','H373') for c in h_codes) else 'Не се класифицира'}</td></tr>
</table>
<h3 class="subsection">11.2 Информация за други опасности</h3>
<p>Не се класифицира като притежаващ ендокринно нарушаващи свойства.</p>
<h2 class="section">РАЗДЕЛ 12: Екологична информация</h2>
<h3 class="subsection">12.1 Токсичност</h3>
<p>Продуктът не се счита за силно опасен за водните организми.</p>
<h3 class="subsection">12.2 Устойчивост и разградимост</h3>
<p>Очаква се да бъде биоразградим.</p>
<h3 class="subsection">12.3 Биоакумулиращ потенциал</h3>
<p>Не се очаква биоакумулация.</p>
<h3 class="subsection">12.4 Мобилност в почвата</h3>
<p>Продуктът е течен и се разлива върху твърди повърхности.</p>
<h3 class="subsection">12.5 Резултати от оценката на PBT и vPvB</h3>
<p>Не се класифицира като PBT или vPvB в съответствие с Приложение XIII на REACH.</p>
<h3 class="subsection">12.6 Ендокринно нарушаващи свойства</h3>
<p>Не се класифицира като притежаващ ендокринно нарушаващи свойства.</p>
<h3 class="subsection">12.7 Други неблагоприятни ефекти</h3>
<p>Няма допълнителна информация.</p>
<h2 class="section">РАЗДЕЛ 13: Обезвреждане</h2>
<h3 class="subsection">13.1 Методи за третиране на отпадъци</h3>
<table class="layout">
<tr><td>Методи за третиране на отпадъци</td><td>Изхвърлете съдържанието/съда в съответствие с инструкциите за сортиране на лицензиран събирач.</td></tr>
<tr><td>Обезвреждане на опаковките</td><td>Изхвърлете съдържанието/съда в пункт за събиране на опасни или специални отпадъци в съответствие с местните, регионалните, националните и/или международните разпоредби.</td></tr>
<tr><td>Допълнителна информация</td><td>Не използвайте повторно празни съдове.</td></tr>
</table>
<h2 class="section">РАЗДЕЛ 14: Информация относно транспортирането</h2>
<p>В съответствие с ADR / RID / IMDG / IATA / ADN</p>
{transport_table}
{adr_table}
<h3 class="subsection">14.7 Транспортиране в насипно състояние съгласно инструменти на IMO</h3>
<p>Не се прилага.</p>
<h2 class="section">РАЗДЕЛ 15: Информация относно нормативната уредба</h2>
<h3 class="subsection">15.1 Специфични за веществото или сместа разпоредби за безопасност, здраве и околна среда/законодателство</h3>
<h3 class="subsection">15.1.1 Регламенти на ЕС</h3>
<ul>
<li>Няма ограничения по Приложение XVII на REACH.</li>
<li>Продуктът не е в списъка на кандидат-веществата (SVHC) на REACH.</li>
<li>Продуктът не е в Приложение XIV на REACH (Списък на разрешените).</li>
<li>Не подлежи на Регламент (ЕС) No 649/2012 (PIC).</li>
<li>Не подлежи на Регламент (ЕС) 2019/1021 (POP).</li>
</ul>
<h3 class="subsection">15.1.2 Национални разпоредби</h3>
<table class="data">
<tr><th>Държава</th><th>Регламент</th><th>Статус</th></tr>
<tr><td>Германия</td><td>Клас на опасност за водата (WGK)</td><td>WGK 1 — Слабо опасен за водата</td></tr>
</table>
<h3 class="subsection">15.2 Оценка на химичната безопасност</h3>
<p>Не е извършена оценка на химичната безопасност.</p>
<h2 class="section">РАЗДЕЛ 16: Друга информация</h2>
<h3 class="subsection">Пълен текст на H- и EUH-предупрежденията</h3>
<table class="data">
<tr><th>Код</th><th>Текст</th></tr>
{h_rows}
</table>
<br>
<p style="font-size: 8pt; color: {MUTED}; border-top: 1pt solid {BORDER}; padding-top: 5pt;">
<b>Отказ от отговорност:</b> Информацията в настоящия информационен лист за безопасност е получена от източници, които смятаме за надеждни. Информацията обаче се предоставя без каквато и да е гаранция, изрична или подразбираща се, относно нейната коректност. Условията или методите на работа, съхранение, употреба или обезвреждане на продукта са извън нашия контрол и може да са извън нашите познания. Поради тази и други причини, ние не поемаме отговорност и изрично отхвърляме отговорност за загуба, щета или разход, произтичащи от или свързани по какъвто и да е начин с работата, съхранението, употребата или обезвреждането на продукта. Този ИЛБ е изготвен и трябва да се използва само за този продукт.
</p>
</body>
</html>"""
return html
def add_thead_tbody(html_str):
pat = re.compile(r'(<table class="data">)(.*?)(</table>)', re.DOTALL)
def proc(m):
op, body, cl = m.group(1), m.group(2), m.group(3)
rows = re.findall(r'<tr>.*?</tr>', body, re.DOTALL)
if not rows: return m.group(0)
hrows, drows = [], []
for r in rows:
if '<th' in r and not drows: hrows.append(r)
else: drows.append(r)
if not hrows: return m.group(0)
return op + '<thead>' + ''.join(hrows) + '</thead><tbody>' + ''.join(drows) + '</tbody>' + cl
return pat.sub(proc, html_str)
# ─── Main ───
OUT_DIR = '/home/bachko/msds-tds/output'
os.makedirs(OUT_DIR, exist_ok=True)
filter_name = sys.argv[1].lower() if len(sys.argv) > 1 else 'all'
generated = 0
for p in PRODUCTS:
bg_name, en_name = p[0], p[1]
fkey = en_name.lower().replace(' ', '-').replace('(', '').replace(')', '').replace('/', '-').replace('.','')
if filter_name != 'all' and filter_name not in bg_name.lower() and filter_name not in en_name.lower():
continue
html = add_thead_tbody(build_bg_sds(p))
htmlpath = os.path.join(OUT_DIR, f'sds-bg-{fkey}.html')
pdfpath = os.path.join(OUT_DIR, f'SDS_BG_{en_name.upper().replace(" ","_").replace("(","").replace(")","")}.pdf')
with open(htmlpath, 'w', encoding='utf-8') as f: f.write(html)
HTML(string=html).write_pdf(pdfpath)
pages = 0
import pikepdf as pp
try:
with pp.Pdf.open(pdfpath) as pdf: pages = len(pdf.pages)
except: pass
print(f' ✅ {bg_name:40s} → {os.path.basename(pdfpath)} ({pages} стр.)')
generated += 1
print(f'\nОбщо: {generated} български ИЛБ-та.')