dsh-patent-invalidation-pptx
v1.2.0
Published
DSH 插件:给一份「创造性最佳组合方式分析」文本 + 涉案专利 PDF + 对比文件 PDF,直接生成**口审展示 .pptx**——套用你给的模板(母版/封面/封底/logo),正文一律 ≥18pt、放不下自动分页,附图按图号(图3/图1a/[图4])从对比文件里裁出来贴上;出片后自动静态自检(页数/字号下限/形状越界/图片关系/关键文字),可选渲染 PNG 预览。四个工具:patent_invalidation_plan(只读解析成计划)、patent_invalidation_figures(抽附
Maintainers
Readme
dsh-patent-invalidation-pptx — 口审展示 PPT 生成器
给一份 「创造性最佳组合方式分析」文本(.docx) + 涉案专利 PDF + 对比文件 PDF(D1/D2/D4…), 直接生成一份能讲的 口审展示 .pptx:
- 套你的模板:保留模板 pptx 的母版 / 版式 / 主题 / 封面(自动填案件信息)/ 封底,只替换中间页;
- 正文 ≥18pt,放不下自动分页(表格按行分、长文按段落分、单段超长按行切,续页标注"(续N)");
- 附图按图号抽:从对比文件 PDF 里认图注(
图 3、图1a、[图4]),同页多图按图注切"图带", 再按像素墨迹紧裁(页眉/页码家具自动剔除)→ 300dpi PNG,贴到对应页;优先用附图标注版(图自带中文释义); 一页多图给y0/y1就能拆(候选图带自动回显);图注印在位图里时跑 OCR 给「图号→页/图带」映射(需人工确认); - 解析覆盖广:组合方式含「惯用手段/公知常识」、引文定位(
D1说明书第1页第1段/D7更正译文第[0026]段/倒数第N段)、裸图号就近归属(结合图1、图3A)都能自动认;认不到的进candidates(原文片段+段落序号)照抄回填; - 出片即自检:包结构/图片关系、正文最小字号、形状越界、关键文字、该有图处有没有图、表格放不放得下自己的行; 图号→页码对照表随 PPT 存档、附图联系表(montage)一次复核整批裁切;
- 可选渲染预览:自动探测宿主自带的 LibreOffice Kit 渲染 PNG,肉眼核验用(静态自检绿 ≠ 版面可用)。
安装
方式一:npm(不需要本机安装 git)
DSH 桌面端 → 侧栏「插件」→「添加插件」,输入:
dsh-patent-invalidation-pptx方式二:从 Gitee 仓库安装(需要本机已安装 git;地址必须带结尾的 .git)
https://gitee.com/hc905/dsh-patent-invalidation-pptx.git不带
.git的裸地址(https://gitee.com/hc905/dsh-patent-invalidation-pptx)会被 pnpm 当成 tarball 去解包,报ERR_PNPM_TARBALL_EXTRACT;实测 pnpm 11.7.0 必须带.git。
方式三:本地路径(开发用)
link:<插件目录的绝对路径>装完重启 DSH。改代码后同样必须重启:host 按模块 URL 缓存插件。
同一台机器不要同时装「npm 版」「git 版」「本地 link 版」——三者的挂载 id 都是
patent-invalidation-pptx,会冲突。
本地开发安装(本机现状)
插件源码在本目录,profile 用 link: 安装(改代码生效需重启 DSH:host 按模块 URL 缓存插件)。
// ~/.dsh/profiles/desktop/package.json
"dependencies": { "dsh-patent-invalidation-pptx": "link:D:/Dgit/Dplugins/dsh-patent-invalidation-pptx" },
"dsh": { "profile": { "bundles": [ /* … */ "dsh-patent-invalidation-pptx" ] } }# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: patent-invalidation-pptx
disabled: falsecd $env:USERPROFILE\.dsh\profiles\desktop
pnpm install # 建好 link 与依赖
# 然后重启 DSH卸载
# 在 profile 目录执行(npm / git / 本地 link 都用这个包名)
pnpm remove dsh-patent-invalidation-pptx
# 再把 profile 的 dsh.profile.bundles 里的 dsh-patent-invalidation-pptx 删掉,然后重启 DSH四个工具
| 工具 | 作用 | 写文件 |
|---|---|---|
| patent_invalidation_plan | 读分析文本 → 口审展示计划(组合方式/最接近现有技术/逐特征公开情况与强度/区别技术特征/专项分析/引文/附图需求);可选落盘 JSON | 否(除可选 planPath) |
| patent_invalidation_figures | 按图号从 PDF 抽附图 PNG;图注在位图里时可用 pages 指定页码 | PNG |
| patent_invalidation_pptx | 计划 + 附图 + 模板 → .pptx,并做静态自检 + 可选预览 | PPTX / PNG |
| patent_invalidation_verify | 复核任意 .pptx(含手工改过的成品) | 否 |
用法(口审场景里的典型调用)
patent_invalidation_plan(
analysisPath = "…/26-125298CN-…创造性最佳证据组合方式分析(版本11).docx",
patentPath = "…/CN102804493B-涉案专利.pdf",
references = [
{ code:"D1", path:"…/D1-CN100416828C-附图标注版.pdf" },
{ code:"D2", path:"…/D2-WO2008106855A1中文译文-标注版.pdf" },
{ code:"D4", path:"…/D4-中文译文-标注版.pdf" },
],
extraFigures = [{ doc:"D2", fig:"1a" }, { doc:"D4", fig:"4", page:39 }],
planPath = "…/plan.json")patent_invalidation_pptx(analysisPath=…, references=…, extraFigures=…, preview=true)
→ outPath / slideCount / slides / figures / verify / preview插件市场的卡片标题/描述
市场列表里那张卡片显示的中文标题不来自 package.json,而来自包里的
locale/zh.json → meta.title / meta.description(英文界面读 locale/en.json):
{ "meta": { "title": "口审展示 PPT 生成", "description": "……" } }- 缺
locale/zh.json时,卡片标题会回落成包名(dsh-patent-invalidation-pptx), 描述回落成package.json的description——所以想改标题就改这个文件。 - 本插件已带
locale/zh.json+locale/en.json;改完刷新市场面板即可(等待重启的插件要重启后才登记)。 package.json的exports与files里都已有./locale/*.json,不用再动。
计划是纯 JSON,可改
patent_invalidation_plan(planPath=…) 落盘后可直接改,再 patent_invalidation_pptx(planJson=…) 出片:
features[].d1 / .others / .strength:表里措辞;features[].evidence:覆盖表"主要证据"列(按句边界截断加「…」);focus[].lines:专项页段落;quotes[].figures:原文页右侧挂的附图;figures[].caption / .page / .y0 / .y1 / .sourcePath:图注、页码、页内图带(一页多图拆分);case.*:封面案件信息。
解析不到的不会静默丢:返回里的 candidates(组合方式/引文/图号)带原文片段+段落序号,照抄回填即可(P12)。
出片参数(常用)
| 参数 | 默认 | 说明 |
|---|---|---|
| focusFigureLayout | stack | 焦点页两图排布:stack 上下叠放(同占 5.3in 宽,红字释义可读)/ side 并排 / proportional 按比例分宽等高 |
| trimFurniture | true | 裁图剔除页眉/页码家具(孤立墨迹带);剔了什么逐条回显 |
| montage | true | 抽图后拼「附图联系表」PNG,一次复核整批裁切 |
| maxEvidenceChars | 240 | 覆盖表"主要证据"列截断长度(按句边界截断) |
| focusMaxLines | 12 | 专项页最多搬几段分析文字 |
| preview | false | LibreOffice 渲染预览 PNG(自动探测宿主 kit;探测不到会说明出路) |
patent_invalidation_figures 的 bands(与 figs 对齐的 {y0,y1})用于一页多图拆分;
找不到图注时返回 ocrMap(OCR 猜测的「图号→页/图带」映射,需人工确认)与 suggestedBands(墨迹空白带候选)。
作业纪律(P12–P17)
plan → 看 candidates/warnings → 补 plan.json → planJson 出片(回填=照抄候选,不重读全文);- 图号→页码对照表先行、随 PPT 存档(插件自动写
<成品>-图号页码对照.md); - 事实性断言必须有出处:图号只认 OCR 词表/渲染图/图注文本,不许猜;部件断言看图确认;
- 静态自检绿 ≠ 版面可用:出片 → 渲染关键页 → 肉眼复核 → 必要时改 plan 重出;
- 多图 montage 一次复核(页眉/页码批量裁进来这类问题只有拼图看才明显);
- 成品先落工作区、定稿再复制案卷目录(plan/裁图/预览都留工作区;工作区外写不进去是宿主沙箱策略,报错里附了复制命令)。
排版口径
| 元素 | 字号 | |---|---| | 页标题 | 25pt | | 表头 | 20pt | | 表格正文 | 18pt | | 正文段落 | 19pt | | 强调段 / 特征原文 | 20–21pt | | 末页(模板封底) | 不约束 |
行高估算含 1.22 的字形系数(少了它会系统性低估约 20%,表格就会顶出页面),分页再留 3% 安全系数。
表格量高另有两条"宁可高估"的口径(2026-10-13 真事故):
- 中西文自动间距:PowerPoint/LibreOffice 会在中文与西文/数字之间插约 1/4 em 的间隙。
"D4更正译文第[0025]段…"这类单元格不算它会低估 15–20% 行数 → 表格贪心装页后每页最后一行 被页面下沿裁掉。lib/text.js的scriptSpacing就是为此存在的(表格行高必开)。 - 量什么就写什么:单元格字号以前没落到 run 上,量高按
fontSize(18pt)、渲染按正文默认 19pt —— 又一个系统性低估。现在cellXml会把表格字号写进每个 run。
页序
- 封面(模板) →
组合方式:【…】+ 最接近现有技术的逐特征公开情况表 + 区别技术特征 →对比文件对各项技术特征的覆盖(特征…)(4 列,分页) →Dx所公开的内容(附图 + 逐特征说明;Dx = 最接近文件) →其他对比文件及公知常识的公开情况(特征…)(3 列,分页;"其他对比文件"按组合方式推—— 以D1为基准 →D2/D4及公知常识的公开情况,以D2为基准 →D1/D4及公知常识的公开情况) →重点技术特征:特征1-N(左文右图;多图时左侧并排两张;文字多时续页改双栏) →D2第6页第二段(原文 + 解读,来自分析文本;同一段被引多次会合并成一张,取最全的解读) →对比文件附图:…(计划里点名但页内没引用的图) →- 封底(模板)
编码禁忌(2026-10-13 真事故换来的)
package.json/cordis.patch.yml必须是无 BOM 的 UTF-8。 PowerShell 5.1 的Set-Content -Encoding UTF8会写 UTF-8 BOM;带 BOM 的package.json会让 host 的严格JSON.parse失败,于是插件被判成 「未安装 / not installed」(GET /dsh-market/installed的activation字段会直接写出来)。要命的是import()能容忍 BOM,所以离线跑工具一切正常, 只有 host 里看不见插件——批量改名/脚本生成文件之后必须复查 BOM。scripts/*.ps1保持纯 ASCII。 Windows PowerShell 5.1 把无 BOM 的.ps1按 ANSI 读, 非 ASCII 文本可能吞掉字符串里的$(本插件已按此约定,注释全英文)。自检脚本现在会先做清单自检:BOM、
package.json是否合法 JSON、dsh.bundle.patch指向存在、cordis.patch.yml的 insert id 与包名一致、skills/<id>/SKILL.md存在;沙箱也会把cordis.patch.yml一起复制过去。render()里 content 块的text必须是字符串(写成[ … ].join('\n')),不能把行数组直接交给 DSH。 DSH 只做无损 JSON 快照、不会替你拼接,于是请求体里出现{"type":"text","text":["…","…"]}, DeepSeek Messages 网关整包 422:Failed to deserialize the JSON body into the target type: messages[887].content: invalid type: sequence, expected a string要命的地方在于:这条工具结果会原样落进会话日志,只要它在历史里,该会话之后每一次请求 都会被拒(本次事故就是
patent_invalidation_verify的第一次成功返回把会话打毒,只能改日志或换会话)。 四个工具(plan / figures / pptx / verify)的四处 render 都必须 join;scripts/selfcheck-tools.mjs现在会严格校验这一点(旧版把它 join 掉再看,等于把这类缺陷藏起来)。工具返回值必须能无损 JSON 化(2026-10-13 第二起同类事故)。DSH 照 JSON 快照校验返回值, 于是
figures[].page/error(抽图失败时)、verify.slides[].minFontPt(纯图片页)这些undefined字段,以及verify.minFontPt的Infinity,会让整次调用报value is not lossless JSON——出片明明成功,调用方却什么都拿不到(连 verify 的问题清单都看不到)。 现在四个工具的返回统一过jsonSafe()(丢undefined、非有限数换null),selfcheck-tools.mjs也加了jsonLossProblems()断言。
已知边界
- 图注在位图里的 PDF(本案 D4 中文译文的
[图4]就是印在扫描页上的):按图注定位会失败, 工具会在错误信息里列出候选附图页,并跑 OCR 给「图号→页/图带」映射(ocrMap,需人工确认), 确认后用extraFigures[].page(一页多图再加y0/y1)指定即可。 - 一页多图(图1/图2 同页):
suggestedBands给候选图带(墨迹空白带切分),照抄进bands/y0/y1; 图号归属由人工定,插件不猜。 - 静态自检证明不了"字没有被视觉裁切"——那要用渲染预览看(
preview=true)。不过自检现在会 按同一套量高复核表格:算出来的下沿越过版面底就报问题(表格…超过可用版面下沿…), 这是裁切事故的静态预警。 - 专项页文字偏多时,调小
focusMaxLines(默认 12;抽取阶段另有 6 段的默认上限),片子上会注明 "本节另有 N 段见《分析文本》",不静默丢内容。 preview=true在受限沙箱里可能起不了子进程(管道被禁),此时返回里会写明预览:跳过 — 渲染进程无法启动:…,而不是伪装成渲染失败。- 自检按放映顺序(
presentation.xml的sldIdLst)遍历幻灯片;部件名与页序不一致的成品 (插过页、调过页序)也能正确判"末页封底豁免"。
分析文本的抽取口径(2026-10-13 补)
- "最接近文件"以正文为准:
以D2作为最接近的现有技术时,特征表里"D2的公开情况"才是 最接近文件那一列(以前写死 D1,导致以 D2 为基准的分析文本整列错位、第 2 页该列全空、 「D2所公开的内容」整页缺失)。 - 区别技术特征两种写法都认:
区别技术特征在于:(i)…(ii)…,以及…需由其他证据补足的内容为:特征1-3(由D4补足)与特征1-6(由D1及公知常识补足)。 - 引文去重:同一段原文在理由/专项/小结里被引多次时合并成一张原文页,取最全的解读。
- 专项块清洗:落款/日期、
(一)…括号小标题、…如下表所列这类过渡句都不进专项页; 一个特征最多留 6 段(按"是否点到自己、有没有出处、是不是结论句"排序,多余段数写在片子上)。
离线自检 / 无重启调试
# 回归测试(node --test:解析三组正则 / 一页多图 y0/y1 / 家具剔除 / 句边界截断 /
# 焦点页排布 / 原文页挂图 / LibreOffice 路径探测 / 备份约定 + 端到端跑自带自检)
npm test
# 在沙箱里跑四个工具(stub 掉 dsh-tools/dsh-skill,用 profile 里的 pdfjs/canvas)
powershell -ExecutionPolicy Bypass -File scripts/sandbox-tools.ps1 `
-Docx "<分析.docx>" -Patent "<涉案专利.pdf>" `
-D1 "<D1.pdf>" -D2 "<D2.pdf>" -D4 "<D4.pdf>" `
-Template "<模板.pptx>" -Out "<输出>\deck.pptx" `
-Extra "D2:1a,D4:4:39" -Previewnpm test 里的端到端用例会合成分析文本 + 最小模板,把 scripts/selfcheck-tools.mjs
(plan → figures → pptx → verify + output.schema/JSON 无损校验 + 清单自检)整链路跑绿。
scripts/selfcheck-tools.mjs 也可以直接跑(需要能解析 pdfjs-dist / @napi-rs/canvas / @deepseek-ai/*)。
变更记录
见 CHANGELOG.md。
许可证
MIT(见 LICENSE)。
