---
last_reviewed: 2026-06-11
---

# src/doc — 文档处理模块

负责发票信息提取、基于 LLM 的支付截图信息识别、差旅/普通报销信息提取、以及将数据填入 Word 出库单模板。

## 模块清单


| 文件                       | 作用                                                 |
| ------------------------ | -------------------------------------------------- |
| `extractor.py`           | 编排入口：串联 PDF 读取 → LLM 提取 → 支付截图匹配 → 分类             |
| `pdf.py`                 | PDF 图片渲染（PyMuPDF）                              |
| `llm_extractor.py`       | 基于 LLM 的信息提取（发票文本 + 支付截图多模态 + 差旅/普通报销信息综合提取）      |
| `matcher.py`             | 发票与支付截图按金额匹配，回填刷卡信息至发票记录                         |
| `invoice.py`             | 发票类型常量、分类逻辑、CSV 读写工具                               |
| `fill_consumable_doc.py` | 将 CSV 数据填入易耗品出库单 Word 模板（pywin32 COM）              |
| `prompt.py`              | LLM 提示词模板加载                                        |
| `prompts/`               | 提示词模板文件（`invoice_system.md`、`travel_info_system.md`、`normal_info_system.md`） |


## 数据流

```
PDF 发票 → pdf.py → llm_extractor.py → [发票列表]
支付截图 → llm_extractor.py → [刷卡记录]
              ↓
    matcher.py（按金额贪心匹配，相对容差 3%）
              ↓
    invoice.py 分类 → CSV（已回填刷卡日期/卡号/金额）
              ↓
    fill_consumable_doc → 易耗品出库单.doc

[发票列表 + 匹配结果] → llm_extractor.py
              ↓
    差旅发票 → extract_travel_info() → travel_info.json
    普通发票 → extract_normal_info() → normal_info.json
```

## 依赖说明

- **PyMuPDF (pymupdf)** — PDF 图片渲染
- **pywin32** — Word COM 自动化（仅 Windows）
- **llama-index** — LLM 信息提取

## 注意事项

- `fill_consumable_doc.py` 依赖 Microsoft Word + COM，仅 Windows 可用
- LLM 提取不会覆盖 CSV 中已有非空字段
- 提示词模板位于 `prompts/` 目录，由 `prompt.py` 加载
- LLM 提取失败时直接报错，无正则回退

## 变更说明（2026-06-11）

- `llm_extractor.py` 新增 `extract_normal_info()`：综合普通发票、支付记录和匹配结果，提取报销说明、发票总数、总金额、支付方式、附件清单，缓存为 `normal_info.json`
- `llm_extractor.py` 的 `load_cache()` 扩展支持加载 `normal_info.json`
- `prompt.py` 新增 `build_normal_info_system_prompt()`：加载 `normal_info_system.md`
- `prompts/` 新增 `normal_info_system.md`：普通发票信息提取的系统提示词