루트 파일 정리: - DXF/P&ID 관련 → dxf-graph/ - fastTable 관련 → fastTable/ - plan/ → plans/ 통합 (최신 버전 유지) - 테스트 출력 파일, 구버전 프로젝트 삭제 - 불필요한 루트 문서 삭제
11 KiB
11 KiB
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 | |
|---|---|---|
| 레이어 정보 | ✅ 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 | 승자 | |
|---|---|---|---|
| 설비 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 설비 명칭 추출 | ❌ 없음 | ✅ 있음 | |
| 설비 사양 추출 | ❌ 없음 | ✅ 있음 | |
| 계기 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 밸브 번호 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 파이프 라인 번호 | ✅ HIGH | ✅ HIGH | 동점 |
| 레이어별 분리 | ✅ 25개 레이어 | ❌ 없음 | DXF |
| 파이프 연결 추적 | ✅ 좌표 기반 | ❌ 불가 | DXF |
| 흐름 방향 | ❌ 없음 | ❌ 없음 | 무 |
| 한글 메모 | ❌ 없음 | ✅ 있음 | |
| 수정 이력 | ✅ 있음 | ✅ 있음 | 동점 |
3.2 PDF의 장점
- 설비 명칭 직접 포함: "FEED PUMP", "COLUMN" 등 영문 명칭이 태그와 함께 표시
- 상세 사양 정보: 용량, 크기, 압력, 온도, 재질 등 공학적 사양 포함
- 한글 메모: "기존설비", "수정사항" 등 운영 정보 포함
- 텍스트 추출 단순성: PyMuPDF 한 줄로 전체 텍스트 추출 가능
3.3 DXF의 장점
- 레이어 정보: 공정 라인/계기/밸브를 레이어별로 명확히 분리
- 기하 정보: 파이프 연결 추적을 위한 정밀 좌표
- 엔티티 타입: LINE, CIRCLE, ARC로 심볼 구조 파악 가능
- 연결 관계: 좌표 기반 파이프 경로 추적 가능
4. 결론
4.1 최종 판단
PDF가 설비 정보 추출에 더 유리합니다.
이유:
- DXF에는 없던 설비 명칭과 사양이 PDF에 직접 포함됨
- 외부 매핑 테이블 없이 설비 태그 → 명칭 매칭 가능
- 텍스트 추출이 더 단순하고 신뢰도 높음
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에서 흐름 방향 추출이 가능함이 확인되었습니다.
분석 방법:
- 탱크 심볼 경계선 찾기 (TEXT 레이어)
- 대각선 선분 감지 (화살표 부분)
- 대각선 방향 분석 (X축 증가 = 우측 흐름)
T-201 예시:
(1670.7, 1756.8) -> (1672.2, 155.3) ← 대각선 (오른쪽 하향)
(1672.2, 1755.3) -> (1670.7, 1753.8) ← 대각선 (왼쪽 하향)
→ X축이 증가하는 방향이 흐름 방향 (좌측 → 우측)
5.2 추출 알고리즘
- 설비 심볼 경계선 찾기: TEXT 레이어의 수평/수직 선으로 심볼 경계 확인
- 화살표 부분 감지: 대각선 선분 찾기 (dx > 0.5 AND dy > 0.5)
- 방향 판별: 대각선 선분의 X축 증가 방향이 흐름 방향
- 연결 파이프 매칭: 심볼에서 나가는 PROCESS LINE 레이어의 파이프와 연결
5.3 한계점
- 탱크/컬럼 등 큰 설비만 화살표 심볼 사용
- 작은 밸브/계기는 화살표가 없음
- 파이프 라인 자체의 화살표는 별도 분석 필요
5.4 업데이트된 비교표
| 항목 | DXF | 승자 | |
|---|---|---|---|
| 설비 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 설비 명칭 추출 | ❌ 없음 | ✅ 있음 | |
| 설비 사양 추출 | ❌ 없음 | ✅ 있음 | |
| 계기 태그 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 밸브 번호 추출 | ✅ HIGH | ✅ HIGH | 동점 |
| 파이프 라인 번호 | ✅ HIGH | ✅ HIGH | 동점 |
| 레이어별 분리 | ✅ 25개 레이어 | ❌ 없음 | DXF |
| 파이프 연결 추적 | ✅ 좌표 기반 | ❌ 불가 | DXF |
| 흐름 방향 | ✅ 가능 | ❌ 불가 | DXF |
| 한글 메모 | ❌ 없음 | ✅ 있음 | |
| 수정 이력 | ✅ 있음 | ✅ 있음 | 동점 |
6. PNG 파일 형식 비교 분석
6.1 PNG의 근본적 한계
PNG는 래스터(픽셀) 이미지로, DXF/PDF와 근본적으로 다릅니다:
| 항목 | DXF | PNG | |
|---|---|---|---|
| 텍스트 추출 | ✅ 직접 읽기 | ✅ 직접 읽기 | ❌ OCR 필요 |
| 기하 정보 | ✅ 좌표 기반 | ❌ 제한적 | ❌ 없음 |
| 레이어 정보 | ✅ 25개 | ❌ 없음 | ❌ 없음 |
| 설비 명칭 | ❌ 없음 | ✅ 있음 | ❌ OCR 필요 |
| 설비 사양 | ❌ 없음 | ✅ 있음 | ❌ OCR 필요 |
| 흐름 방향 | ✅ 좌표 분석 | ❌ 불가 | ❌ CV 필요 |
| 파이프 연결 | ✅ 좌표 추적 | ❌ 불가 | ❌ CV 필요 |
6.2 PNG 사용 시 필요한 추가 작업
- OCR (Optical Character Recognition): Tesseract 등으로 텍스트 인식
- 정확도: 70~90% (폰트, 해상도, 배경에 따라 다름)
- PDF/DXF 직접 추출: 99%+ 정확도
- Computer Vision: 설비 심볼 인식
- YOLO/CNN 모델 학습 필요
- 화살표 방향 감지: 이미지 처리 필요
- 파이프 연결 추적: 에지 검출 + 선 추적 알고리즘
- 매우 복잡하고 신뢰도 낮음
6.3 PNG의 유일한 장점
- 시각적 확인: 인간이 도면을 직접 볼 때 유용
- CV 모델 학습 데이터: 설비 심볼 인식 모델 학습용 이미지로 사용 가능
6.4 최종 결론
PNG는 정보 추출에最不리한 형식입니다.
추출 용이성 순위:
- DXF - 기하 정보 + 좌표 + 레이어 (연결 관계 추출 최적)
- PDF - 텍스트 + 명칭 + 사양 (설비 정보 추출 최적)
- 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 예시
# 블록 기반 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의 추가 이점
- 속성(Attribute) 지원: 블록에 텍스트 속성을 포함할 수 있음
- 예: FCV 블록에 "10101" 속성 포함 → 태그 자동 추출
- 표준화된 심볼: ISA 5.1 표준 심볼 블록 라이브러리 사용 가능
- 메타데이터 포함: 블록에 설비 사양을 속성으로 저장 가능
7.5 현실적 한계
- 도면 작성자 의존: 블록 사용은 도면 작성자의 선택
- 현재 DXF는 블록 없음: 개별 엔티티 분석 필요
- 변환 불가: 기존 DXF를 블록 기반으로 자동 변환 어려움
7.6 결론
블록 기반 DXF가 있다면 정보 추출이 훨씬 쉬워집니다.
하지만 현재 DXF는 블록이 없으므로:
- 기하 패턴 분석 (LINE/CIRCLE 조합) 필요
- 레이어 정보 + 텍스트 위치 기반 매칭 필요
- PDF에서 설비 명칭/사양 보완 필요