# Per-Paragraph Font Matching(2026-07-13 消防设施检测合同教训) ## 问题 同一份合同中,不同段落的原文runs可能有完全不同的字体属性方案: - P20 runs: `ascii=宋体, hAnsi=宋体, cs=宋体, sz=24, eastAsia=None, hint=None` - P36/P41 runs: `rPr=None`(完全无字体属性,靠docDefaults/style继承) 如果对所有WB INS runs统一设置一种字体属性,必然导致某些段落mismatch。 ## 错误做法 ```python # ❌ 全局统一设置 for ins in all_wb_ins: rf.set('ascii', '宋体') rf.set('sz', '24') ``` ## 正确做法 ```python # ✅ 按段落匹配原文第一个非INS/非DEL run的rPr for p in paras: # 找到同段落的第一个orig run orig_run = None for child in p: if child.tag == f'{WNS}r': orig_run = child break if orig_run is None: continue # 整段INS,无参照 orig_rpr = orig_run.find(f'{WNS}rPr') orig_rf = orig_rpr.find(f'{WNS}rFonts') if orig_rpr is not None else None # INS的rPr应该与orig_run的rPr完全匹配 # 如果orig没有rFonts → INS也不该有 # 如果orig有ascii=宋体但没有eastAsia → INS也是这样 ``` ## 整段INS段落(无同段原文可比) - wb-ins-font-verify.py会报"MISSING HINT (无同段原文可比)" - 这是**已知假阳性**,不算真问题 - 整段INS段落的字体应参照**相邻段落**(前后各2段)的原文run格式 - 如果相邻原文runs有explicit属性(ascii=宋体 sz=24),INS也设 - 如果相邻原文runs无rPr,INS也不设 ## 2026-07-13 消防设施检测合同实证 - 第一次修复:全局strip eastAsia/hint → P20报ASCII MISMATCH(原文有ascii=宋体) - 第二次修复:全局设ascii=宋体 → P36/P41报ASCII MISMATCH(原文无rFonts) - 正确修复:per-paragraph检查orig_run是否有ascii → 有则INS也设,无则INS也不设