feat: PAAI 자동인쇄 기능 완성 (EUC-KR 텍스트 방식)
추가: - 자동인쇄 ON/OFF 토글 (헤더) - ESC/POS 영수증 인쇄 (EUC-KR 인코딩) - ESCPOS_TROUBLESHOOTING.md 트러블슈팅 문서 핵심 변경: - 이미지 방식 -> 텍스트 방식 (socket 직접 전송) - UTF-8 -> EUC-KR 인코딩 - 이모지 제거 ([V], [!], >> 사용) - 48자 기준 줄바꿈 인쇄 흐름: 1. PAAI 분석 완료 2. 자동인쇄 ON이면 /pmr/api/paai/print 호출 3. _format_paai_receipt()로 텍스트 생성 4. _print_escpos_text()로 프린터 전송 참고: docs/ESCPOS_TROUBLESHOOTING.md
This commit is contained in:
252
docs/ESCPOS_TROUBLESHOOTING.md
Normal file
252
docs/ESCPOS_TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,252 @@
|
||||
# ESC/POS 영수증 프린터 트러블슈팅 가이드
|
||||
|
||||
> 작성일: 2026-03-05
|
||||
> 프린터: 192.168.0.174:9100 (올댓포스 오른쪽)
|
||||
|
||||
---
|
||||
|
||||
## 핵심 요약
|
||||
|
||||
| 항목 | 올바른 방식 | 잘못된 방식 |
|
||||
|------|------------|------------|
|
||||
| **인코딩** | EUC-KR | UTF-8 |
|
||||
| **전송 방식** | socket 직접 전송 | python-escpos 라이브러리 |
|
||||
| **이모지** | 사용 금지 (`>>`, `[V]`) | ❌ 🖨️ ✅ |
|
||||
| **이미지** | 사용 금지 | PIL Image |
|
||||
| **용지 폭** | 48자 기준 | 글자수 무제한 |
|
||||
| **용지 길이** | 무제한 (롤 용지) | 제한 없음 |
|
||||
|
||||
---
|
||||
|
||||
## 증상별 해결책
|
||||
|
||||
### 1. 아무것도 안 나옴
|
||||
```
|
||||
원인: 프린터 연결 실패
|
||||
해결:
|
||||
1. ping 192.168.0.174 확인
|
||||
2. 포트 9100 확인 (Test-NetConnection -ComputerName 192.168.0.174 -Port 9100)
|
||||
3. 프린터 전원 확인
|
||||
```
|
||||
|
||||
### 2. "EAT" 또는 깨진 문자만 나옴
|
||||
```
|
||||
원인: 이미지 인쇄 방식 사용
|
||||
해결: 이미지 방식 사용 금지! 텍스트 + EUC-KR 인코딩 사용
|
||||
|
||||
❌ 잘못된 코드:
|
||||
from escpos.printer import Network
|
||||
p = Network(...)
|
||||
p.image(img) # 이미지 인쇄 - 안 됨!
|
||||
|
||||
✅ 올바른 코드:
|
||||
sock = socket.socket(...)
|
||||
text_bytes = message.encode('euc-kr', errors='replace')
|
||||
sock.sendall(INIT + text_bytes + CUT)
|
||||
```
|
||||
|
||||
### 3. 한글이 ???? 로 나옴
|
||||
```
|
||||
원인: UTF-8 인코딩 사용
|
||||
해결: EUC-KR 인코딩 사용
|
||||
|
||||
❌ 잘못된 코드:
|
||||
text.encode('utf-8')
|
||||
|
||||
✅ 올바른 코드:
|
||||
text.encode('euc-kr', errors='replace')
|
||||
```
|
||||
|
||||
### 4. 이모지가 ? 로 나옴
|
||||
```
|
||||
원인: ESC/POS 프린터는 이모지 미지원
|
||||
해결: 텍스트로 대체
|
||||
|
||||
❌ ✅ 상호작용 없음
|
||||
✅ [V] 상호작용 없음
|
||||
|
||||
❌ ⚠️ 주의 필요
|
||||
✅ [!] 주의 필요
|
||||
|
||||
❌ 📋 처방 해석
|
||||
✅ >> 처방 해석
|
||||
```
|
||||
|
||||
### 5. 첫 줄만 나오고 잘림
|
||||
```
|
||||
원인: python-escpos 라이브러리의 set() 함수 문제
|
||||
해결: socket 직접 전송 방식 사용
|
||||
|
||||
❌ 잘못된 코드:
|
||||
from escpos.printer import Network
|
||||
p = Network(...)
|
||||
p.set(align='center', bold=True) # 이 명령이 문제!
|
||||
p.text("내용")
|
||||
|
||||
✅ 올바른 코드:
|
||||
sock = socket.socket(...)
|
||||
sock.sendall(INIT + text.encode('euc-kr') + CUT)
|
||||
```
|
||||
|
||||
### 6. 연결은 되는데 인쇄 안 됨
|
||||
```
|
||||
원인: 프린터가 이전 작업에서 hang 상태
|
||||
해결:
|
||||
1. 프린터 전원 껐다 켜기
|
||||
2. 또는 INIT 명령 먼저 전송: ESC + b'@'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 올바른 코드 템플릿
|
||||
|
||||
### 기본 텍스트 인쇄
|
||||
```python
|
||||
import socket
|
||||
|
||||
# 프린터 설정
|
||||
PRINTER_IP = "192.168.0.174"
|
||||
PRINTER_PORT = 9100
|
||||
|
||||
# ESC/POS 명령어
|
||||
ESC = b'\x1b'
|
||||
INIT = ESC + b'@' # 프린터 초기화
|
||||
CUT = ESC + b'd\x03' # 피드 + 커트
|
||||
|
||||
def print_text(message: str) -> bool:
|
||||
try:
|
||||
# EUC-KR 인코딩 (한글 지원)
|
||||
text_bytes = message.encode('euc-kr', errors='replace')
|
||||
|
||||
# 명령어 조합
|
||||
command = INIT + text_bytes + b'\n\n\n' + CUT
|
||||
|
||||
# 소켓 전송
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.settimeout(10)
|
||||
sock.connect((PRINTER_IP, PRINTER_PORT))
|
||||
sock.sendall(command)
|
||||
sock.close()
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"인쇄 오류: {e}")
|
||||
return False
|
||||
|
||||
# 사용 예시
|
||||
message = """
|
||||
================================================
|
||||
[ 테스트 출력 ]
|
||||
================================================
|
||||
환자: 홍길동
|
||||
처방번호: 20260305000001
|
||||
|
||||
[V] 상호작용 없음
|
||||
|
||||
>> 처방 해석
|
||||
감기 증상 완화를 위한 처방입니다.
|
||||
|
||||
================================================
|
||||
청춘약국
|
||||
================================================
|
||||
"""
|
||||
print_text(message)
|
||||
```
|
||||
|
||||
### 중앙 정렬 헬퍼
|
||||
```python
|
||||
def center_text(text: str, width: int = 48) -> str:
|
||||
"""48자 기준 중앙 정렬"""
|
||||
text_len = len(text)
|
||||
if text_len >= width:
|
||||
return text
|
||||
spaces = (width - text_len) // 2
|
||||
return " " * spaces + text
|
||||
|
||||
# 사용
|
||||
print(center_text("[ PAAI 복약안내 ]"))
|
||||
# 출력: " [ PAAI 복약안내 ]"
|
||||
```
|
||||
|
||||
### 줄바꿈 헬퍼
|
||||
```python
|
||||
def wrap_text(text: str, width: int = 44) -> list:
|
||||
"""44자 기준 줄바꿈 (들여쓰기 여유)"""
|
||||
lines = []
|
||||
words = text.split()
|
||||
current = ""
|
||||
|
||||
for word in words:
|
||||
if len(current) + len(word) + 1 <= width:
|
||||
current = current + " " + word if current else word
|
||||
else:
|
||||
if current:
|
||||
lines.append(current)
|
||||
current = word
|
||||
|
||||
if current:
|
||||
lines.append(current)
|
||||
|
||||
return lines if lines else [text[:width]]
|
||||
|
||||
# 사용
|
||||
long_text = "경골 하단 및 중족골 골절로 인한 통증과 부종 관리를 위해 NSAIDs를 처방합니다."
|
||||
for line in wrap_text(long_text, 44):
|
||||
print(f" {line}")
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 프린터 사양
|
||||
|
||||
| 항목 | 값 |
|
||||
|------|-----|
|
||||
| IP | 192.168.0.174 |
|
||||
| Port | 9100 |
|
||||
| 용지 폭 | 80mm (48자) |
|
||||
| 인코딩 | EUC-KR (CP949) |
|
||||
| 한글 | 지원 |
|
||||
| 이모지 | 미지원 |
|
||||
| 이미지 | 미지원 (이 프린터) |
|
||||
|
||||
---
|
||||
|
||||
## 참고 파일
|
||||
|
||||
| 파일 | 설명 |
|
||||
|------|------|
|
||||
| `backend/pos_printer.py` | ESC/POS 기본 유틸리티 |
|
||||
| `backend/paai_printer_cli.py` | PAAI 인쇄 전용 CLI |
|
||||
| `clawd/memory/3월4일 동물약_복약지도서.md` | 동물약 인쇄 가이드 |
|
||||
|
||||
---
|
||||
|
||||
## 테스트 명령어
|
||||
|
||||
```powershell
|
||||
# 연결 테스트
|
||||
Test-NetConnection -ComputerName 192.168.0.174 -Port 9100
|
||||
|
||||
# 간단 인쇄 테스트
|
||||
python -c "
|
||||
import socket
|
||||
sock = socket.socket()
|
||||
sock.connect(('192.168.0.174', 9100))
|
||||
sock.sendall(b'\x1b@Test OK\n\n\n\x1bd\x03')
|
||||
sock.close()
|
||||
print('OK')
|
||||
"
|
||||
|
||||
# pos_printer.py 테스트
|
||||
cd C:\Users\청춘약국\source\pharmacy-pos-qr-system\backend
|
||||
python pos_printer.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 히스토리
|
||||
|
||||
| 날짜 | 문제 | 해결 |
|
||||
|------|------|------|
|
||||
| 2026-03-04 | 동물약 투약지도서 이모지 깨짐 | 이모지 제거, 텍스트로 대체 |
|
||||
| 2026-03-05 | PAAI 인쇄 "EAT"만 출력 | 이미지 방식 → 텍스트 방식 변경 |
|
||||
| 2026-03-05 | python-escpos 라이브러리 문제 | socket 직접 전송으로 변경 |
|
||||
Reference in New Issue
Block a user