# P&ID PDF 파일 설비 연결 정보 추출 분석 보고서

**파일**: `src/Web/uploads/pid/plant-10100-only.pdf`
**분석일**: 2026-05-06
**목적**: PDF 파일에서 설비 노드 및 연결 관계 추출 가능성 분석 (DXF 비교용)

---

## 1. PDF 파일 구조 분석

### 1.1 기본 정보

- **PDF 버전**: PDF 1.7
- **페이지 수**: 1페이지
- **페이지 크기**: 1191 x 842 (A3 가로)
- **텍스트 추출 길이**: 9,751자

### 1.2 텍스트 추출 품질

- **추출 방식**: PyMuPDF (`fitz.get_text()`)
- **텍스트 블록**: 순차적 텍스트 추출 가능
- **레이어 정보**: ❌ 없음 (PDF는 레이어 개념이 DXF와 다름)
- **기하 정보**: ❌ 제한적 (텍스트 좌표만 추출 가능)

### 1.3 DXF와의 핵심 차이

| 항목 | DXF | PDF |
|------|-----|-----|
| 레이어 정보 | ✅ 25개 레이어 | ❌ 없음 |
| 엔티티 타입 | ✅ LINE, CIRCLE, ARC 등 | ❌ 텍스트만 |
| 좌표 정보 | ✅ 정밀 좌표 | ⚠️ 텍스트 블록 좌표만 |
| 설비 명칭 | ❌ 없음 | ✅ 있음 |
| 설비 사양 | ❌ 없음 | ✅ 있음 |
| 연결 라인 | ✅ 351개 LINE | ❌ 추출 불가 |

---

## 2. PDF 텍스트 기반 설비 정보 추출 결과

### 2.1 설비 태그 + 명칭 추출 (총 39개 매칭)

| 태그 | 명칭 | 사양 포함 |
|------|------|-----------|
| P-10101 | FEED PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, RPM |
| P-10114 | TOP PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, RPM |
| P-10116 | BOTTOM PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, RPM |
| P-10118 | SIDE PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, RPM |
| VP-10117 | VACUUM PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, RPM |
| DP-10101 | DIAPHRAGM PUMP | ✅ CAPA, SIZE, MATERIAL, PRESSURE, SPM |
| T-10101 | FEED BUFFER TANK | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| T-10100 | RECYCLE TANK | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| C-10111 | COLUMN | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| E-10112 | TOP CONDENSER | ✅ SIZE, DP/OP, DT/OT, MATERIAL |
| E-10115 A/B | REBOILER | ✅ SIZE, DP/OP, DT/OT, MATERIAL |
| E-10119 | BOTTOM COOLER | ✅ SIZE, DP/OP, DT/OT, MATERIAL |
| E-10103 | PREHEATER | ✅ SIZE, DP/OP, DT/OT, MATERIAL |
| D-10113 | REFLUX DRUM | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| F-10102A/B | FILTER HOUSING | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| SP-10601 | SEPERATER | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |
| T-3210 | WASTE WATER TANK | ✅ SIZE, VOLUME, DP/OP, DT/OT, MATERIAL |

### 2.2 DXF 대비 추가 정보

PDF에만 있는 정보:

| 정보 타입 | PDF 예시 |
|-----------|----------|
| 설비 영문 명칭 | "FEED PUMP", "COLUMN", "REBOILER" |
| 용량 (CAPA) | "60L/min", "345m3/h" |
| 크기 (SIZE) | "Ø2,500 x 3,600H", "25A/20A" |
| 부피 (VOLUME) | "20.6M3", "0.002M3" |
| 압력 (PRESSURE/DP/OP) | "0.25MPa", "0.3MPa" |
| 온도 (DT/OT) | "80°C / AMB", "220°C / 147°C" |
| 재질 (MATERIAL) | "STS316", "STS304" |
| 회전수 (RPM) | "3,520", "3,550" |
| 단열 (INSULATION) | "H50", "H100" |
| 한글 메모 | "기존설비", "수정사항" |

---

## 3. DXF vs PDF 비교 분석

### 3.1 항목별 비교

| 항목 | DXF | PDF | 승자 |
|------|-----|-----|------|
| 설비 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 설비 명칭 추출 | ❌ 없음 | ✅ 있음 | **PDF** |
| 설비 사양 추출 | ❌ 없음 | ✅ 있음 | **PDF** |
| 계기 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 밸브 번호 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 파이프 라인 번호 | ✅ HIGH | ✅ HIGH | 동점 |
| 레이어별 분리 | ✅ 25개 레이어 | ❌ 없음 | **DXF** |
| 파이프 연결 추적 | ✅ 좌표 기반 | ❌ 불가 | **DXF** |
| 흐름 방향 | ❌ 없음 | ❌ 없음 | 무 |
| 한글 메모 | ❌ 없음 | ✅ 있음 | **PDF** |
| 수정 이력 | ✅ 있음 | ✅ 있음 | 동점 |

### 3.2 PDF의 장점

1. **설비 명칭 직접 포함**: "FEED PUMP", "COLUMN" 등 영문 명칭이 태그와 함께 표시
2. **상세 사양 정보**: 용량, 크기, 압력, 온도, 재질 등 공학적 사양 포함
3. **한글 메모**: "기존설비", "수정사항" 등 운영 정보 포함
4. **텍스트 추출 단순성**: PyMuPDF 한 줄로 전체 텍스트 추출 가능

### 3.3 DXF의 장점

1. **레이어 정보**: 공정 라인/계기/밸브를 레이어별로 명확히 분리
2. **기하 정보**: 파이프 연결 추적을 위한 정밀 좌표
3. **엔티티 타입**: LINE, CIRCLE, ARC로 심볼 구조 파악 가능
4. **연결 관계**: 좌표 기반 파이프 경로 추적 가능

---

## 4. 결론

### 4.1 최종 판단

**PDF가 설비 정보 추출에 더 유리합니다.**

이유:
1. DXF에는 없던 **설비 명칭과 사양**이 PDF에 직접 포함됨
2. 외부 매핑 테이블 없이 설비 태그 → 명칭 매칭 가능
3. 텍스트 추출이 더 단순하고 신뢰도 높음

### 4.2 권장 접근법

**PDF + DXF 하이브리드**가 최적:
- **PDF**: 설비 태그, 명칭, 사양 추출 (노드 정보)
- **DXF**: 파이프 연결 추적, 레이어별 분리 (엣지 정보)

### 4.3 샘플과 비교

| 샘플 항목 | PDF 추출 결과 |
|-----------|---------------|
| P-101A (펌프) | P-10101: FEED PUMP ✅ |
| E-101 (프리히터) | E-10103: PREHEATER ✅ |
| C-101 (분리탑) | C-10111: COLUMN ✅ |
| V-101 (탱크) | T-10101: FEED BUFFER TANK ✅ |
| 연결 관계 | ❌ 여전히 불가 (DXF 필요) |

---

## 5. 흐름 방향(FLOW DIRECTION) 추출 분석

### 5.1 DXF에서 흐름 방향 추출 가능

T-201 탱크 심볼 분석 결과, **DXF에서 흐름 방향 추출이 가능**함이 확인되었습니다.

**분석 방법**:
1. 탱크 심볼 경계선 찾기 (TEXT 레이어)
2. 대각선 선분 감지 (화살표 부분)
3. 대각선 방향 분석 (X축 증가 = 우측 흐름)

**T-201 예시**:
```
(1670.7, 1756.8) -> (1672.2, 155.3)  ← 대각선 (오른쪽 하향)
(1672.2, 1755.3) -> (1670.7, 1753.8)  ← 대각선 (왼쪽 하향)
```
→ X축이 증가하는 방향이 흐름 방향 (좌측 → 우측)

### 5.2 추출 알고리즘

1. **설비 심볼 경계선 찾기**: TEXT 레이어의 수평/수직 선으로 심볼 경계 확인
2. **화살표 부분 감지**: 대각선 선분 찾기 (dx > 0.5 AND dy > 0.5)
3. **방향 판별**: 대각선 선분의 X축 증가 방향이 흐름 방향
4. **연결 파이프 매칭**: 심볼에서 나가는 PROCESS LINE 레이어의 파이프와 연결

### 5.3 한계점

- 탱크/컬럼 등 큰 설비만 화살표 심볼 사용
- 작은 밸브/계기는 화살표가 없음
- 파이프 라인 자체의 화살표는 별도 분석 필요

### 5.4 업데이트된 비교표

| 항목 | DXF | PDF | 승자 |
|------|-----|-----|------|
| 설비 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 설비 명칭 추출 | ❌ 없음 | ✅ 있음 | **PDF** |
| 설비 사양 추출 | ❌ 없음 | ✅ 있음 | **PDF** |
| 계기 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 밸브 번호 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 파이프 라인 번호 | ✅ HIGH | ✅ HIGH | 동점 |
| 레이어별 분리 | ✅ 25개 레이어 | ❌ 없음 | **DXF** |
| 파이프 연결 추적 | ✅ 좌표 기반 | ❌ 불가 | **DXF** |
| **흐름 방향** | **✅ 가능** | ❌ 불가 | **DXF** |
| 한글 메모 | ❌ 없음 | ✅ 있음 | **PDF** |
| 수정 이력 | ✅ 있음 | ✅ 있음 | 동점 |

---

## 6. PNG 파일 형식 비교 분석

### 6.1 PNG의 근본적 한계

PNG는 **래스터(픽셀) 이미지**로, DXF/PDF와 근본적으로 다릅니다:

| 항목 | DXF | PDF | PNG |
|------|-----|-----|-----|
| 텍스트 추출 | ✅ 직접 읽기 | ✅ 직접 읽기 | ❌ OCR 필요 |
| 기하 정보 | ✅ 좌표 기반 | ❌ 제한적 | ❌ 없음 |
| 레이어 정보 | ✅ 25개 | ❌ 없음 | ❌ 없음 |
| 설비 명칭 | ❌ 없음 | ✅ 있음 | ❌ OCR 필요 |
| 설비 사양 | ❌ 없음 | ✅ 있음 | ❌ OCR 필요 |
| 흐름 방향 | ✅ 좌표 분석 | ❌ 불가 | ❌ CV 필요 |
| 파이프 연결 | ✅ 좌표 추적 | ❌ 불가 | ❌ CV 필요 |

### 6.2 PNG 사용 시 필요한 추가 작업

1. **OCR (Optical Character Recognition)**: Tesseract 등으로 텍스트 인식
   - 정확도: 70~90% (폰트, 해상도, 배경에 따라 다름)
   - PDF/DXF 직접 추출: 99%+ 정확도
2. **Computer Vision**: 설비 심볼 인식
   - YOLO/CNN 모델 학습 필요
   - 화살표 방향 감지: 이미지 처리 필요
3. **파이프 연결 추적**: 에지 검출 + 선 추적 알고리즘
   - 매우 복잡하고 신뢰도 낮음

### 6.3 PNG의 유일한 장점

- **시각적 확인**: 인간이 도면을 직접 볼 때 유용
- **CV 모델 학습 데이터**: 설비 심볼 인식 모델 학습용 이미지로 사용 가능

### 6.4 최종 결론

**PNG는 정보 추출에最不리한 형식입니다.**

추출 용이성 순위:
1. **DXF** - 기하 정보 + 좌표 + 레이어 (연결 관계 추출 최적)
2. **PDF** - 텍스트 + 명칭 + 사양 (설비 정보 추출 최적)
3. **PNG** - 픽셀만 (OCR + CV 필요,最不리)

**권장**: DXF + PDF 하이브리드 접근 (PNG는 제외)

---

## 7. DXF 블록(Block) 기반 DXF 비교 분석

### 7.1 현재 DXF 상태

현재 `plant-10100-only.dxf`는 **블록이 없습니다**:
- 블록 정의: 시스템 블록만 (*Model_Space, *Paper_Space)
- INSERT 엔티티: **0개**
- 모든 밸브/계기/펌프 심볼이 개별 LINE/CIRCLE/ARC로 직접绘制됨

### 7.2 블록 기반 DXF가 있다면?

만약 밸브, 트랜스미터, 플로우미터 등이 **블록(Block Reference/INSERT)**으로 작성되어 있다면 다음과 같은 이점이 있습니다:

| 항목 | 현재 DXF (블록 없음) | 블록 기반 DXF |
|------|---------------------|---------------|
| 심볼 인식 | ❌ LINE/CIRCLE 조합 분석 필요 | ✅ INSERT.dxf.name으로 직접 식별 |
| 심볼 타입 판별 | ❌ 기하 패턴 매칭 필요 | ✅ 블록명으로 직접 판별 |
| 추출 코드 복잡도 | HIGH (기하 분석 필요) | LOW (INSERT 반복만) |
| 신뢰도 | MEDIUM (패턴 매칭 오차) | HIGH (명확한 식별) |
| 위치 추출 | ✅ 좌표 분석 필요 | ✅ INSERT.dxf.insert로 직접 |

### 7.3 블록 기반 DXF 예시

```python
# 블록 기반 DXF라면 이렇게 간단하게 추출 가능
for entity in ms:
    if entity.dxftype() == 'INSERT':
        block_name = entity.dxf.name  # 'FCV_VALVE', 'FLOW_METER' 등
        position = entity.dxf.insert   # (x, y) 좌표
        print(f"{block_name} at {position}")
```

**예시 블록명**:
- `FCV_VALVE` → 유량 제어 밸브
- `FLOW_METER` → 플로우 미터
- `PRESSURE_TRANSMITTER` → 압력 트랜스미터
- `TEMPERATURE_INDICATOR` → 온도 지시기

### 7.4 블록 기반 DXF의 추가 이점

1. **속성(Attribute) 지원**: 블록에 텍스트 속성을 포함할 수 있음
   - 예: FCV 블록에 "10101" 속성 포함 → 태그 자동 추출
2. **표준화된 심볼**: ISA 5.1 표준 심볼 블록 라이브러리 사용 가능
3. **메타데이터 포함**: 블록에 설비 사양을 속성으로 저장 가능

### 7.5 현실적 한계

- **도면 작성자 의존**: 블록 사용은 도면 작성자의 선택
- **현재 DXF는 블록 없음**: 개별 엔티티 분석 필요
- **변환 불가**: 기존 DXF를 블록 기반으로 자동 변환 어려움

### 7.6 결론

**블록 기반 DXF가 있다면 정보 추출이 훨씬 쉬워집니다.**

하지만 현재 DXF는 블록이 없으므로:
- 기하 패턴 분석 (LINE/CIRCLE 조합) 필요
- 레이어 정보 + 텍스트 위치 기반 매칭 필요
- PDF에서 설비 명칭/사양 보완 필요
