将化学品的"原始数据"渲染为排版专业、可打印、可编辑的 MSDS / SDS(安全技术说明书)。 支持按所在国/地区要求输出单一语言版本(中国=简体中文;美国/欧盟/国际=英文),并内置 组分编码(CAS / EC / HS)自动查询与核实能力,避免凭空编造法规编码。还附带一个 中文定稿 docx → 英文 docx 的词典翻译器,方便你把手工精修好的中文版一键出国际版。
本工具只负责"排版与生成",不是合规背书。正式合规文件须由具备资质人员或机构(如国家化学品登记中心 NRCC)复核签字。
- 三种输出格式
Word (.docx):可在 Word / WPS 直接编辑(主推)。单表 5 列版式、CJK 字体、A4。HTML:自包含、打印友好,浏览器"打印 → 另存为 PDF"即可。PDF:调用本机 Chrome / Edge 无头打印,与 HTML 样式一致(可选)。
- 单一语言按市场切换:
cn(中文)/us/eu/intl(英文,GHS 通用),不混排、不重复。 - 单表 5 列版式:顶部文档元信息(CAS/EC/HS/版本/日期/市场)→ GHS 16 部分;第 3 部分(组分)与 第 14 部分(运输)为 5 列网格子表,其余为键值行。与人工精修的最终版式一致。
- 页眉/页脚:首页无页眉,公司 LOGO + 中英文名置于正文顶部右上角;其他页页眉仅保留
SAFETY DATA SHEET(中文版为SAFETY DATA SHEET / 化学品安全技术说明书);页脚含文档号、自动页码、 地址与电话。 - CAS / EC / HS 自动查询与核实(
msds.lookup):基于 PubChem PUG-REST 解析 CAS / InChIKey / 分子式,并生成带"来源/日期/可信度"的verification_log.json,供合规留痕。 - 中文 → 英文翻译器(
translate_cn_to_en.py):载入你手工定稿的中文 docx,按内置词典把 章节标题、标签、常用 GHS 危险说明、合规提示等替换为英文,输出国际版 docx(详见下文"限制")。 - 合规核对清单:
data/requirements_checklist.json内置中/美/欧三国必检项。
git clone <your-repo-url> auto-msds
cd auto-msds
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .仅 docx 生成需要 python-docx;HTML / lookup / 翻译器仅用标准库。
把化学品数据整理成 JSON(字段见 data/schemas/schema.example.json,可直接复制改)。
仓库自带一份脱敏示例:data/examples/example_self_leveling_mortar.json(水泥基自流平砂浆,企业信息已匿名)。
# 从数据 JSON 的第3部分自动提取组分并查 CAS/HS
msds-lookup --file data/examples/example_self_leveling_mortar.json --out verification_log.json
# 或手动指定物质名
msds-lookup --names "Portland cement" "quartz" --out verification_log.json把 verification_log.json 中已核实的 CAS / HS 回填进数据 JSON 的对应字段(EC 号需经 ECHA / 海关核实)。
# 中文版(中国市场)
msds-docx --data data/examples/example_self_leveling_mortar.json --market cn --out output/msds_cn.docx
# 国际英文版(出口/GHS 通用)—— 直接用 JSON 的英文品名渲染英文框架
msds-docx --data data/examples/example_self_leveling_mortar.json --market intl --out output/msds_en.docx
# HTML 版 + 转 PDF
msds-html --data data/examples/example_self_leveling_mortar.json --market cn --out output/msds_cn.html
msds-pdf --html output/msds_cn.html --out output/msds_cn.pdf不传 --company 时用数据 JSON 内嵌的 company 块;自家产品可用 --company data/company_profile.json。
命令行亦可走等价形式:
python -m msds.render_docx .../python -m msds.render_html .../python -m msds.lookup ...
若你已在 Word 里手工精修好中文版(封面、措辞、表格都定稿),想快速出国际英文版:
python src/msds/translate_cn_to_en.py --in output/msds_cn.docx --out output/msds_en.docx该翻译器针对已定稿的中文 docx 做逐格替换,能完整保留合并单元格、配色、图片与版式。
限制:它是词典翻译器(顶部
T字典),对"见过的"中文短语(章节标题、标签、常见 GHS 语句、合规提示) 翻译准确;对 JSON 自由文本段落里未收录的中文,会原样保留。遇到新措辞时,在脚本顶部的T字典里加一条即可。 要让英文 100% 自动化,更彻底的做法是在数据 JSON 的sections里同时提供zh与en两块(渲染器会优先用en)。
sections键固定"1"~"16"(标题由程序内置)。- 每部分支持:
{"rows":[...]}键值行 /{"grid":{...}}5 列网格(仅第 3、14 部分)/{"text":"..."}自由文本。 - CAS / EC / HS 为必填核实项:缺失即查
msds.lookup或权威来源后填入,严禁编造;无法核实则标注"待核实"并写入compliance_notes。
auto-msds/
├── src/msds/ # 生成引擎
│ ├── render_docx.py # Word(.docx) 渲染(单表5列、首页无页眉、正文顶部公司块)
│ ├── render_html.py # HTML 渲染
│ ├── html_to_pdf.py # HTML → PDF(本机 Chrome/Edge 无头)
│ ├── lookup.py # CAS/EC/HS 查询核实(PubChem PUG-REST)
│ └── translate_cn_to_en.py # 中文定稿 docx → 英文 docx 词典翻译器
├── data/
│ ├── company_profile.json # 企业信息模板(替换为你的真实信息)
│ ├── requirements_checklist.json # 中/美/欧合规必检项
│ ├── schemas/schema.example.json # 数据格式最小模板
│ └── examples/ # 脱敏示例产品数据
│ └── example_self_leveling_mortar.json
├── skills/msds-generator/SKILL.md # WorkBuddy 助手技能说明(含"研究核实"工作流)
├── tests/test_render.py # 冒烟测试
├── docs/CONTRIBUTING.md
├── README.md / LICENSE / pyproject.toml / requirements.txt / .gitignore
- 输出为排版模板,不构成产品特性保证或合规背书。
- CAS 经 PubChem 解析、HS 为内置类别提示、EC 需经 ECHA / 海关核实——均需在正式发布前复核。
- 接收方须自行遵守产品销售/使用地所有相关法律法规。
- 本仓库为开源工具,使用即表示理解并同意上述免责。
MIT —— 详见 LICENSE。
{ "meta": { "product_name": "英文品名", "product_name_zh": "中文品名", "cas": "CAS或混合物型号", "ec": "EC号", "hs": "HS编码", "version": "1.0 (Draft)", "issue_date": "YYYY-MM-DD" }, "company": { "name": "...", "name_zh": "...", "address": "...", "address_zh": "...", "tel": "...", "email": "...", "website": "...", "emergency_tel": "...", "logo_path": "可选: logo 图片路径" }, "pictograms": [], "show_compliance": false, "compliance_notes": ["待补充/待核实项..."], "sections": { "1": { "zh": {"rows":[["标签","值"]]}, "en": {"rows":[...]} }, "3": { "zh": {"grid":{"columns":[5列],"rows":[[5列],...]}}, "en": {"grid":{...}} }, "14": { "zh": {"grid":{...}}, "en": {"grid":{...}} }, ... } }