51 lines
1.9 KiB
Markdown
51 lines
1.9 KiB
Markdown
# 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也不设
|