五书转国知局 XML 包(patent-xml-converter)
将"五书合一"的 Word 文档直接转换为可上传国家知识产权局"专利业务办理系统"的 XML 压缩包,无需依赖 WORD 转 XML 编辑器(WPS 加载项),也不需要进行"添加标记"操作。
何时使用
- 需要把手上的五书 docx 转成国知局 XML 上传包
- 本机 WORD转XML编辑器打不开 / 是绿色版 WPS 加载不出"专利处理"菜单
- 用编辑器转换过的 XML 出现"上传后说明书空白"等问题,需要重新生成一份结构完整的包
- 批量处理:比编辑器(需人工"添加标记")更适合脚本化转换
环境要求
- Windows
- Python 3.8+
- Pillow(图像处理,见
references/setup-guide.md) - WPS Office(含文字组件) ★ 公式渲染必需:后台调用 WPS 将公式转 PDF(与官方编辑器同款路线)
- pywin32(WPS COM 自动化;
pip install pywin32) - pdftoppm.exe(Poppler PDF 渲染器,随"WORD转XML编辑器"安装提供,脚本自动定位)
- lxml(可选,推荐安装:输出后自动做国知局 DTD 合规校验,
pip install lxml)
先运行环境检查:
python scripts/check_environment.py
用法(脚本正式版 / 脚本离线版;纯提示词版现场实现见末节)
python scripts/convert_five_books.py "五书文档.docx" [-o 输出目录]
> 本条命令仅"脚本正式版 / 脚本离线版"提供;"纯提示词版"不含业务脚本——按 references/implementation-notes.md 的完整指引现场实现(见文末"纯提示词版如何单独使用")。
修复官方转档产物(官方公式/附图质量最好,但 <math>、权项条数常出问题):
python scripts/repair_official_xml.py "官方产物.zip" # 输出 xxx-修复.zip
python scripts/repair_official_xml.py "官方产物.zip" --dry-run # 只报告,不改
运行模式(默认一键 / 按需分步)★
默认:一键模式
用户未特别说明时,直接执行转换、一次出结果:
python scripts/convert_five_books.py "五书文档.docx"
一次性完成:解析 → 生成 → DTD 自检 → 打包 → 交付(汇报 zip 路径与校验结果)。
按需:分步协作模式
当用户要求"一步一步来 / 先预检 / 我要检查中间过程 / 分步执行 / 慢一点"等时,按四步执行,每步暂停等用户确认:
| 步骤 | 命令 | 产出 | 暂停点 |
|---|---|---|---|
| S1 预检 | python scripts/convert_five_books.py "五书.docx" --analyze |
五书结构预检报告(节识别 / 权项数 / 标题 / 疑似标题变体 / 上下标公式 / 风险提示) | 等用户确认识别正确后再继续 |
| S2 生成 | python scripts/convert_five_books.py "五书.docx" --no-pack |
输出到目录(XML + 图片,不打包) | 用户可打开各 10000X/*.xml 检查中间产物 |
| S3 校验 | S2 输出自带 DTD 自检;或 python scripts/convert_five_books.py --validate-zip "<zip或目录>" |
国知局 DTD 校验报告(逐文件) | 确认全部通过才可进入 S4 |
| S4 打包交付 | 再跑默认模式(或对已生成目录打包) | 最终 zip | 交付并汇报 |
要点:
- 一切以用户节奏为准:任何一步用户说"停 / 调整"即停下排查;说"继续"才进入下一步;
- 一键模式下不得省略 DTD 自检;分步模式下 S3 不通过不得交付;
--validate-zip还能单独使用:对任何来源的 XML 包(包括 WORD转XML编辑器产物)做国知局 DTD 体检——快速判断其能否被系统完整解析;-
纯提示词版同样遵循本两模式:一键 = 按 references 全流程直接完成;分步 = 先在对话中输出"预检报告"(节识别 / 统计 / 风险),逐段确认后继续(预检要点见
references/implementation-notes.md第 8 节)。 -
输入:五书合一 docx(5 节结构:说明书摘要 / 摘要附图 / 权利要求书 / 说明书 / 说明书附图,每节有对应文字的页眉)
- 输出:
<文档名>.zip,内含100001/ … 100005/五书 XML 与全部图片 - 默认输出到 docx 同目录;该 zip 可直接上传"专利业务办理系统 → 新申请办理 → 上传"
输出结构(国知局 XML 规范)
| 编号 | 文件 | 对应书 | 根结构 |
|---|---|---|---|
| 100001 | 100001/100001.xml |
权利要求书 | <cn-claims><claim id="clNNN" num="N"><claim-text>… |
| 100002 | 100002/100002.xml |
说明书 | <description><invention-title>… + <heading id="hNNNN" level="2"> + <p id="pNNNN" num="NNNN" Italic="0"> |
| 100003 | 100003/100003.xml |
说明书附图 | <cn-drawings><figure id="fNNNN" num="NNNN" figure-labels="图N"><img … |
| 100004 | 100004/100004.xml |
说明书摘要 | <cn-abstract><p … |
| 100005 | 100005/100005.xml |
摘要附图 | <cn-abstract><cn-abst-figure><figure … |
关键规则:
- 发明名称:说明书第一段 →
<invention-title>(不占段落编号) - 五个章节标题(技术领域/背景技术/发明内容/附图说明/具体实施方式)→
<heading level="2">(不占编号) - 正文段落 →
<p>从 0001 连续编号(跳过标题行) - 公式(★ 默认 WPS 后端,与官方编辑器完全同款路线):后台调用 WPS —— 复制公式 → 粘贴到临时 Word 文档 → 存 PDF →
pdftoppm300 dpi → 去白边裁剪 → jpg →<maths id="mathNNNN" num="NNNN"><img …/></maths>,嵌在所在段落内部;原文档中带下标/上标格式(vertAlign)的公式按国知局 DTD 规范输出为<sub><img …/></sub>(⚠️ sub/sup 内不可包含 maths,否则 DTD 校验失败、系统读不出)
- 为什么必须走 WPS:公式的 WMF/EMF 预览图内容本身不足以代表公式排版(实测直渲染会产出变形/糊团:官方清晰的"T"被渲成"∽",宽公式亦失真),只有"WPS 排版 → PDF → pdftoppm 300dpi"才能得到与官方完全一致的公式图(实测 99/99 成功、尺寸与官方样例吻合)
- 降级方案--formula-backend drawwmf(无 WPS 时):提取 WMF/EMF → GDI+ 矢量栅格化(wi/he = round(pt × 96/72 ÷ 4.25),1 单位 = 4.25 px@96dpi;Pillowdrawwmf对含 Word 私有记录 0x2FB 的公式会糊)——公式图可能变形,交付前必须人工抽查
- WPS 自动化细节:DispatchEx("KWPS.Application")创建独立隐藏实例(不干扰用户正在使用的 WPS),转换完成自动 Quit;pdftoppm.exe自动定位(注册表安装目录/环境变量 PDFTOPPM/常见路径)
4b. Word 原生公式(OMML,<m:oMath>):必须识别、不能静默丢弃(它在段落里、不在<w:r>内),但默认栅格化为位图输出<maths><img/></maths>,与 OLE 公式同形态。
- ⚠️ 禁止只写<math>(MathML 单写):DTD 虽允许maths = (math, img?),但实测只写 math 会让办理系统整册说明书转不出来(同早期<sub><maths>的症状)。官方产物是 math + img 双写,img 不可省。
- 定位:TOKEN_RE同时匹配<w:r>与<m:oMath>;OMML 用render_omml()内置排版器(run / 上下标 / 分式 / 括号等,字体 Cambria/Cambria Italic)栅格化为 jpg;渲染失败逐条告警。
-omml_to_mathml()保留(OMML2MML.XSL转换能力),仅供将来"math + img 双写"使用,默认不走。 - 权利要求拆分:按"数字."开头的段落拆分权项,一个权项一个
<claim>、权项内各段为多个<claim-text>;权项号前缀("1.")从文本中剥离 - 说明书附图:图片前后若有"图N"文字,识别为
figure-labels="图N"(无文字时按顺序编号);图注在图上方或图下方均可——当"图N"文字数量与图片数量一致时,按文档顺序一一配对(不依赖标签与图片的前后位置) - 图片处理:附图去除白色边缘,最长边限制 2000px,统一输出 jpg(质量 92)
- 每节识别按页眉文本("说明书摘要/摘要附图/权利要求书/说明书/说明书附图")
- Word 域(field)处理:章节标题段落里可能挂着 Word 域,域结果(如
{ SET 发明名称 哈哈 }显示的"哈哈")会被当成段落文字,导致标题认不出、整册丢 heading。
- 域结构:<w:fldChar begin>→<w:instrText>指令</w:instrText>→<w:fldChar separate>→ 域结果(若干<w:t>)→<w:fldChar end>;域代码不是<w:t>天然不进正文,域结果会进。
- 剥离规则(防误删正文):① 只剥离指令属FIELD_STRIP_OPS(当前仅SET——纯书签赋值、无显示语义)的域;REF/PAGEREF/SEQ/EQ/MERGEFIELD/INCLUDETEXT/IF/TOC/STYLEREF等显示型域一律不剥离,其结果就是正文。② 剥离结果只用于章节标题判定(plain固定作为正文来源,clean仅供标题比对),正文段落永远按plain输出,不会因剥离少字。③ 剥离后必须恰好等于标准标题才采纳,并打印"域指令 + 域结果 + 剥离前后"证据;不满足的只提示不改写。
- 转换时若发生剥离,会在日志打印「域结果处理记录」;请据此人工复核一次。
- 不要用 python-docx 整包save()去"修"这类文档——会重压缩全部条目;正确做法是只重写word/document.xml单个 zip 条目,其余条目字节不变。
官方转档后修复(repair)★
什么时候用:直接用「WORD转XML编辑器」转档(公式、附图质量最好),但上传后出现下列症状之一:
| 症状 | 根因 | 修复动作 |
|---|---|---|
| 说明书整册不显示 | 官方产物里公式是 <maths><math>MathML</math><img/></maths> 双写,办理系统解析不了 math |
删 <math>、保留 <img>;只有 math 没 img 的报"无法修复" |
| 权利要求 10 条变成 1 条 / 变成好几条 | <claim> 层级被并/被拆;嵌套 <claim-text>;num 重复或不连续 |
按 N. 起始重新切分/合并、展平嵌套、重编号 cl001…/num=1…;拆得离谱(>30 条且 >3×原数)回滚并只报警 |
| 说明书标题结构丢 | invention-title/heading 缺失(标题行被写成普通段落) |
文本命中的 <p> 升格为 <heading>、首段补 <invention-title>、<p> 编号重排 |
| 附图图号重复/缺失 | figure-labels 为空或重复 |
按顺序规范为 图1…图N,同步 figure/num |
<sub><maths> 非法嵌套 |
官方对"带下标格式的公式"会产出此结构 | 降级为 <sub><img/></sub> |
| 图片引用缺失 | img/@file 指向不存在的 jpg |
只报告,不擅改 |
原则(写死):
1. 只改结构、不动图片——jpg 原样搬过去,不重采样、不重编码;
2. 能确定的才改,拿不准的只报警(如"只有 math 无 img"、"疑似误拆");
3. 改完必须过 DTD 校验:python scripts/convert_five_books.py --validate-zip 修复后.zip;
4. 原始产物先备份,修复版另存 *-修复.zip,不覆盖原文件。
修复规则明细见 references/fix-rules.md。
输出自动校验(国知局 DTD)★
生成压缩包后,脚本会自动用国知局官方 DTD 校验全部 XML:
- DTD 取自本机"专利业务办理系统客户端":
C:\Program Files (x86)\CNIPAClient\plugins\as\cpc-editor-as\data\dtdandxsl\domestic\ - 全部通过时显示
[DTD 自检] 全部通过 ✓;如有失败项会列出具体错误与位置 - 存在失败项时请勿上传——系统将无法完整解析对应文件(典型症状:该册在办理系统中显示空白)
> ⚠️ 已知最高频错误(二):<maths> 里只写 <math>(MathML)会让整册转不出来——DTD 允许 (math, img?),但办理系统解析不了 math;官方是 math+img 双写,img 不可省。修复见上文"官方转档后修复"。
>
> ⚠️ 已知最高频错误(一):<sub>/<sup> 内不能包含 <maths>(国知局 DTD 限定 sub/sup 只允许文本、格式元素与 img)。下标公式的正确写法是 <sub><img …/></sub>。WORD转XML编辑器在处理"下标格式公式"时恰好会产出这种非法嵌套(<sub><maths>…</maths></sub>)——这正是很多"上传后说明书空白"问题的根因。
⚠️ 重要注意事项
- 本 skill 输出标准结构,与国知局编辑器的"正确转换结果"对齐(对齐依据:多份编辑器成功产出的样例包);但上传前建议在办理系统里用"预览"核对一遍(尤其说明书部分)
- 输入文档必须是"五书合一"结构(5 节 + 标准页眉);如果文档结构被改动过(例如缺少页眉),节识别可能失败——请先修复文档
- 公式渲染默认走 WPS(后台):
DispatchEx("KWPS.Application")创建独立隐藏实例,不干扰用户正在使用的 WPS;转换完成后自动退出。若 WPS/pywin32/pdftoppm 缺失,会自动降级为 WMF 直渲染(--formula-backend drawwmf)并明确警告"公式图可能变形"——此时交付前必须人工抽查公式图(可与官方样例包对比) - 全量转换耗时:公式数量 × 约 0.5~1.5 秒(如 99 个公式约 1 分钟),属正常
- 上传前可选检查:解压 zip 确认 5 个
10000X/10000X.xml存在、图片数量与文档公式数+附图数一致
与其他 skill 的关系
patent-formula-converter:负责公式在 docx 内部的 OLE 字节级处理(KSEE3/DSMT6 互转);本 skill 负责 docx → XML 上传包的整包转换:两者互补- 若源文档公式已经是 WPS 公式(Equation.KSEE3)或 MathType,本 skill 均可正常渲染(两者预览图都是 WMF/EMF)
文件说明
scripts/convert_five_books.py— 主转换脚本(核心;仅"脚本正式版 / 脚本离线版"提供)scripts/check_environment.py— 环境自检(三个版本均有)references/xml-format-spec.md— 国知局 XML 格式规范说明(含格式样例)references/implementation-notes.md— 实现细节(公式矢量渲染调用序列、wi/he 换算、DTD 校验方法等"现场实现"指引)references/setup-guide.md— 依赖安装与配置说明
打包命名规则
- skill 压缩包共 3 个,文件名必须带版本号(日期时间格式
vYYYYMMDDHHMM,固定 12 位,如v202610151612): - 纯提示词版:
专利五书转XML_纯提示词版_v{日期时间}.zip - 脚本正式版:
专利五书转XML_脚本正式版_v{日期时间}.zip - 脚本离线版:
专利五书转XML_脚本离线版_v{日期时间}.zip - 三个版本差异:
- 纯提示词版 = SKILL.md + references + 环境检查脚本(无业务脚本、无本地 wheel),用提示词引导大模型现场实现五书解析、公式渲染与 XML 生成(更灵活);
- 脚本正式版 = 完整脚本(
convert_five_books.py等)+ 参考(无本地 wheel,联网pip install装依赖); - 脚本离线版 = 完整脚本 + skill 目录内
assets/deps本地 wheel + 离线安装脚本(装依赖不联网)。
压缩包层级结构(适应官方)
patent-xml-converter/ ← 顶层目录(与 frontmatter name 一致)
├── SKILL.md
├── skill-dependencies.json
├── references/
│ ├── xml-format-spec.md
│ ├── implementation-notes.md
│ └── setup-guide.md
├── scripts/
│ ├── check_environment.py
│ └── convert_five_books.py ← 仅脚本正式版 / 脚本离线版
└── assets/deps/ ← 仅脚本离线版
├── install-offline.bat
└── *.whl
打包操作规则(防破坏,其他 AI 打包时须遵守)
- 打包输出到
D:\工作\000技能包更新\009-专利五书转XML\,每次打包新建 12 位时间戳文件夹(如专利五书转XML-202610151612),不覆盖任何历史版本; - 版本号每次打包必须比上一次新;替换旧版本号 zip 前先备份;
- 本项目全部 skill 的压缩包版本号统一使用 12 位
vYYYYMMDDHHMM,禁止 10 位缩写格式; - 不覆盖、不删除任何源文件;发现源文件缺失或格式不合规时先停下问用户,不擅自补写业务逻辑;
- 打包完成后必须逐一解压 / 校验通过才交付。
纯提示词版的脚本策略(通用规则)
- "纯提示词版"不排斥脚本——凡是模型现场写不出来的字节级/底层操作、绝对必须的固定依赖,都该给就给;
- 本 skill 的判断:核心能力是"五书 docx → 国知局 XML 包"的完整转换。其中 docx 结构解析、节识别、XML 生成、打包均为常规操作,模型能现场实现;而公式 WMF/EMF 高分辨率矢量渲染(
Image.core.drawwmf的特殊调用序列)、wi/he 换算基准(像素 ÷ 13.3)、DTD 校验的精确方法等易错细节,已全部写入references/implementation-notes.md——纯提示词版不含业务脚本,模型按该文件指引照实现即可; - 判定原则:脚本是"模型现场写不出来"→ 含;脚本是"模型能现场实现"→ 不含。
纯提示词版如何单独使用
纯提示词版不含业务脚本,模型按本 SKILL.md 与 references 全量规范直接执行:
① 按 references/implementation-notes.md 现场编写转换脚本(docx 解析 + 公式矢量渲染 + XML 生成 + DTD 校验,逐条对照其中的调用序列);
② 按 references/xml-format-spec.md 生成五书 XML(100001~100005),严格执行编号与结构规则;
③ 图片按 implementation-notes 的白边裁剪、最长边 2000px、jpg 质量 92 处理;
④ 交付前必须执行 DTD 校验(方法见 implementation-notes 第 4 节),全部通过才交付;
⑤ 先跑自带 check_environment.py 检查环境;依赖缺失时联网安装(Pillow、lxml)。