Files

1.9 KiB

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。

错误做法

# ❌ 全局统一设置
for ins in all_wb_ins:
    rf.set('ascii', '宋体')
    rf.set('sz', '24')

正确做法

# ✅ 按段落匹配原文第一个非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也不设