wms/nflg-qms-pdf-extract/CLAUDE.md

88 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[根目录](../CLAUDE.md) > **nflg-qms-pdf-extract**
# nflg-qms-pdf-extract - QMS PDF 数据提取模块
## 模块职责
独立的 PDF 数据提取工具库,不可独立启动。从工程图纸 PDF 中提取尺寸标注(含公差)信息,供 QMS 质量检验使用。核心能力:
- 从 PDF 中提取带位置信息的文本元素
- 将相邻文本元素分组合并
- 识别尺寸标注(含对称/非对称公差、配合公差、螺纹标注等)
- 处理 PDFBox 在 Windows/Mac 上的乱码字符修正Symbol 字体、GBK 编码等)
- 过滤标题栏区域、表面粗糙度、GD&T 公差等非尺寸文本
- 按区域筛选和合并提取结果
## 关键依赖
- Apache PDFBox 3.0.4 (PDF 解析)
- Lombok
- SLF4J
## 关键目录说明
| 路径 | 说明 |
|------|------|
| `service/PdfExtractionService.java` | 主服务入口 -- 从本地文件或 URL 加载 PDF 并提取尺寸数据 |
| `service/RegionFilterService.java` | 区域筛选服务 -- 按页面+矩形区域过滤提取结果,支持多结果合并 |
| `extraction/PositionedTextStripper.java` | 带位置信息的文本提取器(继承 PDFTextStripper包含乱码字符修正逻辑 |
| `extraction/TextGrouper.java` | 文本分组器 -- 将相邻文本元素按位置/字号合并为 TextGroup |
| `extraction/DimensionIdentifier.java` | 尺寸识别器 -- 通过正则模式识别各类尺寸标注(核心,~490 行) |
| `extraction/TextNormalizer.java` | 文本规范化 -- 修正 Mac/Windows/GBK 乱码字符 + Unicode NFC 规范化 |
| `extraction/TitleBlockFilter.java` | 标题栏过滤器 -- 按区域和关键词过滤非尺寸文本 |
| `model/TextElement.java` | 文本元素模型 -- 单个文本片段(位置/大小/字号/页码) |
| `model/TextGroup.java` | 文本分组模型 -- 合并后的文本组 |
| `model/DimensionResult.java` | 尺寸结果模型 -- 尺寸值+公差+类型+位置+页码 |
## 尺寸识别模式
DimensionIdentifier 支持以下模式(按优先级排列):
1. **对称公差** -- 如 `50 +/- 0.1`、`Phi 280 +/- 0.5`
2. **非对称公差(斜线)** -- 如 `100 +0.2/-0.1`
3. **非对称公差(空格)** -- 如 `100 +0.2 -0.1`
4. **配合公差** -- 如 `50 H7`、`Phi 30 m6`
5. **螺纹标注** -- 如 `M12x1.5`、`G1/2`、`Rc3/4`
6. **纯尺寸 + 邻近公差** -- 尺寸数值与公差分属不同 TextGroup通过邻近搜索关联
7. **区域模式兜底** -- 未匹配的文本直接作为原始内容输出
## 乱码修正
PDF 工程图中 Symbol 字体的直径符号(Phi)、角度符号等常被 PDFBox 误读为乱码字符:
- **Windows (GBK)**: `¡¤` -> `Phi`, `¡ã` -> `degree`, `¡À` -> `+/-`
- **Mac**: `ÃnÃ` -> `Phi`
- 修正在 PositionedTextStripperwriteString 层)和 TextNormalizer二次清理中双重执行
## 数据模型
```
DimensionResult:
- dimension: String (尺寸文本,如 "Phi 50", "M12x1.5")
- tolerance: String (公差文本,如 "+/- 0.1", "H7", "+0.2/-0.1")
- type: String (固定值 "dimension")
- x, y: double (PDF 页面坐标)
- width, height: double(边界框尺寸)
- page: int (所在页码)
- sortOrder: int (排序序号)
```
## 被引用方
- `nflg-qms-admin` -- 通过 `PdfExtractConfig` 配置类将 PdfExtractionService、RegionFilterService 注册为 Spring Bean
## 测试
无独立测试文件。
## 相关文件清单
- `src/main/java/service/` -- 2 个服务类
- `src/main/java/extraction/` -- 5 个提取/过滤类
- `src/main/java/model/` -- 3 个数据模型
- `pom.xml` -- 模块依赖定义
- `pdf数据提取方案.md` -- 设计方案文档
## 变更记录 (Changelog)
| 时间 | 操作 | 说明 |
|------|------|------|
| 2026-05-23 14:28:57 | 新增 | 首次扫描遗漏的模块,本次增量更新补充 |