【问题标题】:how to connect to ethernet printer throught python?如何通过python连接到以太网打印机?
【发布时间】:2012-04-27 11:36:49
【问题描述】:

如何通过python2.7连接以太网票据打印机Epson-T88V并发送数据,我手动设置了以太网打印机的IP地址,实用软件通信也成功。 我如何检测并连接到这些打印机并发送数据进行打印。 python中是否有用于以太网连接的模块。 使用多个以太网打印机和从单个系统同时打印的单独数据,我使用的是 windows xp 和 python 2.7 我已将打印机添加为默认打印机,如何访问此 TCP/IP 打印机 希望我清楚 谢谢。

【问题讨论】:

    标签: python printing python-2.7 receipt


    【解决方案1】:

    您应该考虑使用pkipplibwxpython 库。

    【讨论】:

    • 感谢您的回复,我正在尝试使用 pkipplib,但它需要 pycups,安装时会引发“错误:无法找到 vcvarsall.bat”
    • 抱歉,我自己没有用过pycups,所以无法回答这个问题。
    • @alexmartelli: - 你有什么想法或链接可以帮助我吗
    【解决方案2】:
    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2020-12-16
      • 2021-08-29
      • 2012-10-13
      • 1970-01-01
      相关资源
      最近更新 更多