88 lines
3.7 KiB
Markdown
88 lines
3.7 KiB
Markdown
|
|
[根目录](../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`
|
|||
|
|
- 修正在 PositionedTextStripper(writeString 层)和 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 | 新增 | 首次扫描遗漏的模块,本次增量更新补充 |
|