2012-04-16 12 views
1

이더넷 영수증 프린터 Epson-T88V를 통해 데이터를 연결하고 python2.7을 통해 데이터를 보낼 수 있습니까? 이더넷 프린터의 ipaddress를 수동으로 설정했으며 유틸리티 소프트웨어 통신도 성공적입니다. 어떻게 이러한 프린터를 감지하고 연결하고 인쇄 할 데이터를 보내야합니까? 파이썬에서 이더넷 연결을위한 모듈과 모듈이 있습니까? 하나 이상의 시스템에서 하나 이상의 이더넷 프린터와 데이터를 동시에 인쇄하려면 windows xp와 python 2.7을 사용하고 있습니다. 프린터를 기본 프린터로 추가했는데이 TCP/IP 프린터에 액세스하려면 어떻게해야합니까? 희망 i 고맙습니다. 고마워요.이더넷 프린터에 연결하는 방법은?

+2

"이더넷 프린터"? –

답변

1
import usb 
from PIL import Image 
import time 
import os, sys 
import win32print 
from constants import * 
from exceptions import * 
class Escpos: 
    """ ESC/POS Printer object """ 
    handle = None 
    device = None 

    def __init__(self,interface=0, in_ep=0x100, out_ep=0x01) : 
     self.interface = interface 
     self.in_ep  = in_ep 
     self.out_ep = out_ep 
     if sys.version_info >= (3,): 
      raw_data = bytes ("This is a test\n", "utf-8") 
     else: 
      raw_data = "This is Shiva's test\n\n\n\n\n\n\n\n\n\n" 

     self.hPrinter = win32print.OpenPrinter ("Auto EPSON TM-T88V ReceiptE4 on SYSTEM") 
     self.handle = win32print.OpenPrinter ("EPSON TM-T88V") 
    def _raw(self, msg): 
     try: 
      self.hJob = win32print.StartDocPrinter (self.hPrinter, 1, ("test of raw data", None, "RAW")) 
      self.hJob = win32print.StartDocPrinter (self.handle, 1, ("test of raw data", None, "RAW")) 
      try: 
       win32print.WritePrinter(self.handle, msg) 
       win32print.WritePrinter(self.hPrinter, msg) 
       win32print.EndDocPrinter (self.handle) 
       win32print.EndDocPrinter (self.hPrinter) 
      finally: 
       print self.hJob 
     finally: 
      print self.hJob 

    def _check_image_size(self, size): 
     """Check and fix the size of the image to 32 bits""" 
     if size % 32 == 0: 
      return (0, 0) 
     else: 
      image_border = 32 - (size % 32) 
      if (image_border % 2) == 0: 
       return (image_border/2, image_border/2) 
      else: 
       return (image_border/2, (image_border/2) + 1) 


    def _print_image(self, line, size): 
     i = 0 
     cont = 0 
     buffer = "" 

     self._raw(S_RASTER_N) 
     buffer = "%02X%02X%02X%02X" % (((size[0]/size[1])/8), 0, size[1], 0) 
     self._raw(buffer.decode('hex')) 
     buffer = "" 

     while i < len(line): 
      hex_string = int(line[i:i+8],2) 
      buffer += "%02X" % hex_string 
      i += 8 
      cont += 1 
      if cont % 4 == 0: 
       self._raw(buffer.decode("hex")) 
       buffer = "" 
       cont = 0 


    def image(self, img): 
     """Parse image and then print it""" 
     pixels = [] 
     pix_line = "" 
     im_left = "" 
     im_right = "" 
     switch = 0 
     img_size = [ 0, 0 ] 

     im_open = Image.open(img) 
     im = im_open.convert("RGB") 

     if im.size[0] > 512: 
      print "WARNING: Image is wider than 512 and could be truncated at print time " 
     if im.size[1] > 255: 
      raise ImageSizeError() 

     im_border = self._check_image_size(im.size[0]) 
     for i in range(im_border[0]): 
      im_left += "0" 
     for i in range(im_border[1]): 
      im_right += "0" 

     for y in range(im.size[1]): 
      img_size[1] += 1 
      pix_line += im_left 
      img_size[0] += im_border[0] 
      for x in range(im.size[0]): 
       img_size[0] += 1 
       RGB = im.getpixel((x, y)) 
       im_color = (RGB[0] + RGB[1] + RGB[2]) 
       im_pattern = "1X0" 
       pattern_len = len(im_pattern) 
       switch = (switch - 1) * (-1) 
       for x in range(pattern_len): 
        if im_color <= (255 * 3/pattern_len * (x+1)): 
         if im_pattern[x] == "X": 
          pix_line += "%d" % switch 
         else: 
          pix_line += im_pattern[x] 
         break 
        elif im_color > (255 * 3/pattern_len * pattern_len) and im_color <= (255 * 3): 
         pix_line += im_pattern[-1] 
         break 
      pix_line += im_right 
      img_size[0] += im_border[1] 

     self._print_image(pix_line, img_size) 


    def barcode(self, code, bc, width, height, pos, font): 
     """ Print Barcode """ 
     # Align Bar Code() 
     self._raw(TXT_ALIGN_CT) 
     # Height 
     if height >=2 or height <=6: 
      self._raw(BARCODE_HEIGHT) 
     else: 
      raise BarcodeSizeError() 
     # Width 
     if width >= 1 or width <=255: 
      self._raw(BARCODE_WIDTH) 
     else: 
      raise BarcodeSizeError() 
     # Font 
     if font.upper() == "B": 
      self._raw(BARCODE_FONT_B) 
     else: # DEFAULT FONT: A 
      self._raw(BARCODE_FONT_A) 
     # Position 
     if pos.upper() == "OFF": 
      self._raw(BARCODE_TXT_OFF) 
     elif pos.upper() == "BOTH": 
      self._raw(BARCODE_TXT_BTH) 
     elif pos.upper() == "ABOVE": 
      self._raw(BARCODE_TXT_ABV) 
     else: # DEFAULT POSITION: BELOW 
      self._raw(BARCODE_TXT_BLW) 
     # Type 
     if bc.upper() == "UPC-A": 
      self._raw(BARCODE_UPC_A) 
     elif bc.upper() == "UPC-E": 
      self._raw(BARCODE_UPC_E) 
     elif bc.upper() == "EAN13": 
      self._raw(BARCODE_EAN13) 
     elif bc.upper() == "EAN8": 
      self._raw(BARCODE_EAN8) 
     elif bc.upper() == "CODE39": 
      self._raw(BARCODE_CODE39) 
     elif bc.upper() == "ITF": 
      self._raw(BARCODE_ITF) 
     elif bc.upper() == "NW7": 
      self._raw(BARCODE_NW7) 
     else: 
      raise BarcodeTypeError() 
     # Print Code 
     if code: 
      self._raw(code) 
     else: 
      raise exception.BarcodeCodeError() 


    def text(self, txt): 
     """ Print alpha-numeric text """ 
     if txt: 
      self._raw(txt) 
     else: 
      raise TextError() 


    def set(self, align='left', font='a', type='normal', width=1, height=1): 
     """ Set text properties """ 
     # Align 
     if align.upper() == "CENTER": 
      self._raw(TXT_ALIGN_CT) 
     elif align.upper() == "RIGHT": 
      self._raw(TXT_ALIGN_RT) 
     elif align.upper() == "LEFT": 
      self._raw(TXT_ALIGN_LT) 
     # Font 
     if font.upper() == "B": 
      self._raw(TXT_FONT_B) 
     else: # DEFAULT FONT: A 
      self._raw(TXT_FONT_A) 
     # Type 
     if type.upper() == "B": 
      self._raw(TXT_BOLD_ON) 
      self._raw(TXT_UNDERL_OFF) 
     elif type.upper() == "U": 
      self._raw(TXT_BOLD_OFF) 
      self._raw(TXT_UNDERL_ON) 
     elif type.upper() == "U2": 
      self._raw(TXT_BOLD_OFF) 
      self._raw(TXT_UNDERL2_ON) 
     elif type.upper() == "BU": 
      self._raw(TXT_BOLD_ON) 
      self._raw(TXT_UNDERL_ON) 
     elif type.upper() == "BU2": 
      self._raw(TXT_BOLD_ON) 
      self._raw(TXT_UNDERL2_ON) 
     elif type.upper == "NORMAL": 
      self._raw(TXT_BOLD_OFF) 
      self._raw(TXT_UNDERL_OFF) 
     # Width 
     if width == 2 and height != 2: 
      self._raw(TXT_NORMAL) 
      self._raw(TXT_2WIDTH) 
     elif height == 2 and width != 2: 
      self._raw(TXT_NORMAL) 
      self._raw(TXT_2HEIGHT) 
     elif height == 2 and width == 2: 
      self._raw(TXT_2WIDTH) 
      self._raw(TXT_2HEIGHT) 
     else: # DEFAULT SIZE: NORMAL 
      self._raw(TXT_NORMAL) 


    def cut(self, mode=''): 
     """ Cut paper """ 
     # Fix the size between last line and cut 
     # TODO: handle this with a line feed 
     print "The Cut mode is",mode 
     self._raw("\n\n\n\n\n\n") 
     if mode.upper() == "PART": 
      print "The Cut mode PartCut is true" 
      self._raw(PAPER_PART_CUT) 
     else: # DEFAULT MODE: FULL CUT 
      self._raw(PAPER_FULL_CUT) 


    def cashdraw(self, pin): 
     """ Send pulse to kick the cash drawer """ 
     if pin == 2: 
      self._raw(CD_KICK_2) 
     elif pin == 5: 
      self._raw(CD_KICK_5) 
     else: 
      raise CashDrawerError() 


    def hw(self, hw): 
     """ Hardware operations """ 
     if hw.upper() == "INIT": 
      self._raw(HW_INIT) 
     elif hw.upper() == "SELECT": 
      self._raw(HW_SELECT) 
     elif hw.upper() == "RESET": 
      self._raw(HW_RESET) 
     else: # DEFAULT: DOES NOTHING 
      pass 


    def control(self, ctl): 
     """ Feed control sequences """ 
     if ctl.upper() == "LF": 
      self._raw(CTL_LF) 
     elif ctl.upper() == "FF": 
      self._raw(CTL_FF) 
     elif ctl.upper() == "CR": 
      self._raw(CTL_CR) 
     elif ctl.upper() == "HT": 
      self._raw(CTL_HT) 
     elif ctl.upper() == "VT": 
      self._raw(CTL_VT) 
2

pkipplib 또는 wxpython 라이브러리를 사용해야합니다.

+0

ur 답장을 보내 주셔서 감사합니다. 답장을 보내 주셔서 감사합니다. pkipplib를 사용해 보았습니다. 설치시 "오류 : vcvarsall.bat를 찾을 수 없습니다."라는 메시지가 표시됩니다. – Prasanth

+0

죄송합니다. – BluesRockAddict

+0

@alexmartelli : -이 아이디어에 도움이되는 링크가 있습니까? – Prasanth

관련 문제