feat: python-escpos 라이브러리를 사용한 QR 테스트 추가

python-escpos: 가장 안정적인 ESC/POS Python 라이브러리
- escpos.qr() - 프린터 내장 QR 사용
- escpos.image() - QR을 이미지로 변환하여 인쇄
- 다양한 size 테스트 (3, 4, 6, 8)
- 완전한 영수증 예제 포함

설치: pip install python-escpos
실행: python backend/test_qr_with_escpos_lib.py

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
시골약사 2026-01-29 20:16:00 +09:00
parent a4cfcb6bde
commit 1e904000c7

View File

@ -0,0 +1,263 @@
"""
python-escpos 라이브러리를 사용한 QR 코드 인쇄 테스트
훨씬 간단하고 안정적!
설치: pip install python-escpos
"""
from escpos.printer import Network
from escpos import escpos
import time
# 프린터 설정
PRINTER_IP = "192.168.0.174"
PRINTER_PORT = 9100
# 테스트 URL
TEST_URL = "https://mile.0bin.in/test"
def test_method_1_native_qr():
"""방법 1: escpos 라이브러리 내장 QR 함수"""
print("\n" + "="*60)
print("방법 1: escpos.qr() - 프린터 내장 QR")
print("="*60)
try:
p = Network(PRINTER_IP, port=PRINTER_PORT)
p.text("\n")
p.text("================================\n")
p.text(" *** 방법 1 ***\n")
p.text(" escpos.qr() 내장\n")
p.text("================================\n")
p.text("\n")
# QR 코드 인쇄 (프린터 내장)
p.qr(TEST_URL, size=4, center=True)
p.text("\n")
p.text(f"URL: {TEST_URL}\n")
p.text("\n\n\n")
p.cut()
print("✅ 방법 1 성공!")
time.sleep(2)
return True
except Exception as e:
print(f"❌ 방법 1 실패: {e}")
import traceback
traceback.print_exc()
return False
def test_method_2_image():
"""방법 2: escpos 라이브러리 이미지 함수"""
print("\n" + "="*60)
print("방법 2: escpos.image() - QR을 이미지로 변환하여 인쇄")
print("="*60)
try:
import qrcode
from io import BytesIO
p = Network(PRINTER_IP, port=PRINTER_PORT)
p.text("\n")
p.text("================================\n")
p.text(" *** 방법 2 ***\n")
p.text(" escpos.image()\n")
p.text("================================\n")
p.text("\n")
# QR 이미지 생성
qr = qrcode.QRCode(version=1, box_size=3, border=2)
qr.add_data(TEST_URL)
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white")
# escpos.image()로 인쇄
p.image(qr_img, center=True)
p.text("\n")
p.text(f"URL: {TEST_URL}\n")
p.text("\n\n\n")
p.cut()
print("✅ 방법 2 성공!")
time.sleep(2)
return True
except Exception as e:
print(f"❌ 방법 2 실패: {e}")
import traceback
traceback.print_exc()
return False
def test_method_3_qr_small():
"""방법 3: 작은 QR (size=3)"""
print("\n" + "="*60)
print("방법 3: 작은 QR (size=3)")
print("="*60)
try:
p = Network(PRINTER_IP, port=PRINTER_PORT)
p.text("\n")
p.text("================================\n")
p.text(" *** 방법 3 ***\n")
p.text(" 작은 QR (size=3)\n")
p.text("================================\n")
p.text("\n")
p.qr(TEST_URL, size=3, center=True)
p.text("\n")
p.text(f"URL: {TEST_URL}\n")
p.text("\n\n\n")
p.cut()
print("✅ 방법 3 성공!")
time.sleep(2)
return True
except Exception as e:
print(f"❌ 방법 3 실패: {e}")
import traceback
traceback.print_exc()
return False
def test_method_4_qr_large():
"""방법 4: 큰 QR (size=8)"""
print("\n" + "="*60)
print("방법 4: 큰 QR (size=8)")
print("="*60)
try:
p = Network(PRINTER_IP, port=PRINTER_PORT)
p.text("\n")
p.text("================================\n")
p.text(" *** 방법 4 ***\n")
p.text(" 큰 QR (size=8)\n")
p.text("================================\n")
p.text("\n")
p.qr(TEST_URL, size=8, center=True)
p.text("\n")
p.text(f"URL: {TEST_URL}\n")
p.text("\n\n\n")
p.cut()
print("✅ 방법 4 성공!")
time.sleep(2)
return True
except Exception as e:
print(f"❌ 방법 4 실패: {e}")
import traceback
traceback.print_exc()
return False
def test_method_5_full_receipt():
"""방법 5: 완전한 영수증 (청춘약국)"""
print("\n" + "="*60)
print("방법 5: 완전한 영수증")
print("="*60)
try:
p = Network(PRINTER_IP, port=PRINTER_PORT)
p.text("\n")
p.text("================================\n")
p.text(" *** 방법 5 ***\n")
p.text(" 완전한 영수증\n")
p.text("================================\n")
p.text("\n")
# 헤더
p.set(align='center')
p.text("청춘약국\n")
p.text("================================\n")
# 거래 정보
p.set(align='left')
p.text("거래일시: 2026-01-29 14:30\n")
p.text("거래번호: 20260129000042\n")
p.text("\n")
p.text("결제금액: 50,000원\n")
p.text("적립예정: 1,500P\n")
p.text("\n")
p.text("================================\n")
p.text("\n")
# QR 코드
p.qr(TEST_URL, size=6, center=True)
p.text("\n")
p.set(align='center')
p.text("QR 촬영하고 포인트 받으세요!\n")
p.text("\n")
p.text("================================\n")
p.text("\n\n\n")
p.cut()
print("✅ 방법 5 성공!")
time.sleep(2)
return True
except Exception as e:
print(f"❌ 방법 5 실패: {e}")
import traceback
traceback.print_exc()
return False
def main():
print("="*60)
print("python-escpos 라이브러리 QR 테스트")
print("="*60)
print(f"프린터: {PRINTER_IP}:{PRINTER_PORT}")
print(f"테스트 URL: {TEST_URL}")
print("\n먼저 라이브러리 설치 확인:")
print(" pip install python-escpos")
print("="*60)
try:
import escpos
print("✅ python-escpos 설치됨")
except ImportError:
print("❌ python-escpos가 설치되지 않았습니다!")
print(" 실행: pip install python-escpos")
return
methods = [
("방법 1: 내장 QR (size=4)", test_method_1_native_qr),
("방법 2: 이미지로 변환", test_method_2_image),
("방법 3: 작은 QR (size=3)", test_method_3_qr_small),
("방법 4: 큰 QR (size=8)", test_method_4_qr_large),
("방법 5: 완전한 영수증", test_method_5_full_receipt),
]
results = []
for name, method_func in methods:
try:
success = method_func()
results.append((name, success))
except Exception as e:
print(f"[{name}] ❌ 예외 발생: {e}")
results.append((name, False))
print("\n" + "="*60)
print("결과 요약")
print("="*60)
for name, success in results:
print(f"{name}: {'✅ 성공' if success else '❌ 실패'}")
print("\n5장의 영수증을 확인하여 QR이 보이는 번호를 알려주세요!")
print("="*60)
if __name__ == "__main__":
main()