基于Python获取一些打印机简单信息

本文介绍了一种使用Python通过TCP连接到打印机9100端口并利用PJL语言获取打印机基本信息的方法,包括打印机型号、内存、配置、计数、状态等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Python获取一些打印机简单信息

通过TCP连接打印机9100端口,使用PJL语言获取信息,因此打印机需支持PJL语言。

代码如下:

# -*- coding: UTF-8 -*-
import socket
import sys
import time


def connect_Printer(HOST, self):
    try:
        self.settimeout(2)
        self.connect((HOST, 9100))
    except Exception as e:
        err = str(e)
        print("Connect fail, Reason:\n")
        print(err)

def get_ID(self):   #打印机型号信息
    try:
        self.settimeout(2)
        self.send("@PJL INFO ID\r\n")
        time.sleep(1)   #Delay
        rec = self.recv(256)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get ID information fail,Reason:\n")
        print(err)

def get_ENV(self):  #打印机变量信息
    try:
        self.settimeout(10)
        self.send("@PJL INFO VARIABLES\r\n")
        time.sleep(2)   #Delay
        rec = self.recv(40960)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get variable information fail,Reason:\n")
        print(err)

def get_CONFIG(self):   #打印机初始化信息
    try:
        self.settimeout(3)
        self.send("@PJL INFO CONFIG\r\n")
        time.sleep(2)   #Delay
        rec = self.recv(40960)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get config information fail,Reason:\n")
        print(err)

def get_MEM(self):  #打印机内存信息
    try:
        self.settimeout(3)
        self.send("@PJL INFO MEMORY\r\n")
        time.sleep(2)   #Delay
        rec = self.recv(1024)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get memory information fail,Reason:\n")
        print(err)

def get_PAGECOUNT(self):  #打印计数
    try:
        self.settimeout(3)
        self.send("@PJL INFO PAGECOUNT\r\n")
        time.sleep(2)   #Delay
        rec = self.recv(1024)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get pagecount information fail,Reason:\n")
        print(err)

def get_STATUS(self):  #打印机状态
    try:
        self.settimeout(3)
        self.send("@PJL INFO STATUS\r\n")
        time.sleep(2)   #Delay
        rec = self.recv(1024)
        print(rec)
        sys.stdout.flush()
    except Exception as e:
        err = str(e)
        print("Get status information fail,Reason:\n")
        print(err)

def main():
    HOST = sys.argv[1]
    self = socket.socket()
    connect_Printer(HOST, self)
    get_ID(self)
    get_ENV(self)
    get_CONFIG(self)
    get_MEM(self)
    get_PAGECOUNT(self)
    get_STATUS(self)

    self.close()

if __name__ == '__main__':
    try:
        main()
    # catch CTRL-C
    except (KeyboardInterrupt):
        pass
    finally:
        print("")

使用方法:python GetPrinterInfo.py 打印机IP

实际使用如下:

root@ids:~# python GetPrinterInfo.py 10.255.88.11
@PJL INFO ID
"Lenovo LJ2250N:84UA03:Ver3.06"

@PJL INFO VARIABLES
COPIES=1 [2 RANGE]
        1
        999
LPARM:PCL PAPER=A4 [17 ENUMERATED]
        LETTER
        LEGAL
        A4
        EXECUTIVE
        COM10
        MONARCH
        C5
        DL
        DLL
        B5
        A5
        A6
        B6
        JISB5
        A4LONG
        POSTCARD
        FOLIO
LPARM:PCL ORIENTATION=PORTRAIT [2 ENUMERATED]
        PORTRAIT
        LANDSCAPE
LPARM:PCL FORMLINES=64 [2 RANGE]
        5
        128
MANUALFEED=OFF [2 ENUMERATED]
        OFF
        ON
PAGEPROTECT=AUTO [5 ENUMERATED]
        OFF
        LETTER
        LEGAL
        A4
        AUTO
RESOLUTION=600 [3 ENUMERATED]
        300
        600
        1200
PERSONALITY=PCL [1 ENUMERATED]
        PCL
TIMEOUT=5 [2 RANGE]
        1
        99
AUTOCONT=OFF [2 ENUMERATED]
        OFF
        ON
CPLOCK=OFF [2 ENUMERATED]
        OFF
        ON
PASSWORD=DISABLED [2 RANGE]
        0
        65535
LANG=ENGLISH [19 ENUMERATED]
        ENGLISH
        FRENCH
        GERMAN
        DUTCH
        SPANISH
        ITALIAN
        FINNISH
        NORWEGIAN
        PORTUGUESE
        DANISH
        JAPANESE
        SWEDISH
        RUSSIAN
        CZECH
        HUNGARIAN
        POLISH
        BULGARIAN
        ROMANIAN
        SLOVAKIAN
AUTOSLEEP=ON [2 ENUMERATED]
        OFF
        ON
TIMEOUTSLEEP=5 [2 RANGE]
        1
        99
POWERSAVE=ON [2 ENUMERATED]
        OFF
        ON
POWERSAVETIME=5 [2 RANGE]
        1
        99
ECONOMODE=OFF [2 ENUMERATED]
        OFF
        ON
ECONOLEVEL=1 [2 RANGE]
        0
        3
MEDIATYPE=THIN [10 ENUMERATED]
        REGULAR
        THICK
        THICK2
        TRANSPARENCY
        THIN
        BOND
        ENVELOPES
        ENVTHICK
        ENVTHIN
        RECYCLED
IMAGEADAPT=ON [3 ENUMERATED]
        OFF
        ON
        AUTO
LPARM:PCL FONTSOURCE=I [1 ENUMERATED]
        I
LPARM:PCL FONTNUMBER=42 [2 RANGE]
        0
        54
LPARM:PCL PITCH=10.00 [2 RANGE]
        0.44
        99.99
LPARM:PCL PTSIZE=12.00 [2 RANGE]
        4.00
        999.75
LPARM:PCL SYMSET=PC8 [80 ENUMERATED]
        PC8
        PC8DN
        PC850
        PC852
        PC8TK
        PC1004
        WINL1
        WINL2
        WINL5
        WINBALT
        DESKTOP
        PSTEXT
        VNINTL
        VNUS
        MSPUBL
        MATH8
        PSMATH
        VNMATH
        PIFONT
        LEGAL
        ISO2
        ISO4
        ISO6
        ISO10
        ISO11
        ISO14
        ISO15
        ISO16
        ISO17
        ISO21
        ISO25
        ISO57
        ISO60
        ISO61
        ISO69
        ISO84
        ISO85
        WIN30
        HPGERM
        HPSPAN
        MCTEXT
        SYMBOL
        OCRA
        OCRB
        WDINGS
        HEBREW7
        ROMAN8
        ISOL1
        ISOL2
        ISOL5
        ISOL6
        PC775
        ABIBP
        ABIINTL
        RUSSIAN
        UKRAINIAN
        PC866
        PC8LG
        PC851
        WINGREEK
        ISOLC
        ISOGREEK
        PC853
        PC855
        PC857
        PC858
        PC860
        PC861
        PC863
        PC865
        PC869
        ISOL9
        PC8B
        PC8G
        PC8PC
        GREEK8
        TURKISH8
        ROMAN9
        ROMANEXT
        WINC
INTRAY2=UNLOCKED [2 ENUMERATED READONLY]
        UNLOCKED
        LOCKED
SOURCETRAY=AUTO [2 ENUMERATED]
        AUTO
        TRAY1
LPARM:PCL LEFTMARGIN=0 [2 RANGE]
        0
        145
LPARM:PCL RIGHTMARGIN=78 [2 RANGE]
        10
        155
LPARM:PCL TOPMARGIN=0.50 [2 RANGE]
        0.00
        2.00
LPARM:PCL BOTMARGIN=0.50 [2 RANGE]
        0.00
        2.00
XOFFSET=0 [2 RANGE]
        -500
        500
YOFFSET=0 [2 RANGE]
        -500
        500
LPARM:PCL AUTOLF=OFF [2 ENUMERATED]
        OFF
        ON
LPARM:PCL AUTOCR=OFF [2 ENUMERATED]
        OFF
        ON
LPARM:PCL AUTOWRAP=OFF [2 ENUMERATED]
        OFF
        ON
LPARM:PCL AUTOSKIP=ON [2 ENUMERATED]
        OFF
        ON
AUTOFF=OFF [2 ENUMERATED]
        OFF
        ON
TIMEOUTFF=5 [2 RANGE]
        1
        99
FFSUPPRESS=OFF [2 ENUMERATED]
        OFF
        ON
DEMOPRINT=OFF [2 ENUMERATED]
        OFF
        ON
DOWNFPROD=OFF [2 ENUMERATED]
        OFF
        ON
BITMAPFPROD=ON [2 ENUMERATED]
        OFF
        ON
OEMFONT=OFF [2 ENUMERATED]
        OFF
        ON
DARKFONT=OFF [2 ENUMERATED]
        OFF
        ON
COMPABITMAP=OFF [2 ENUMERATED]
        OFF
        ON
FSEL300DPI=LOW [2 ENUMERATED]
        LOW
        HIGH
DEFPAPER=A4 [2 ENUMERATED]
        A4
        LETTER
HPESCE=RESET [2 ENUMERATED]
        RESET
        FF
PROTECTOFF=AUTO [2 ENUMERATED]
        AUTO
        NORMAL
RAS1200MODE=OFF [3 ENUMERATED]
        OFF
        ON
        TRUE
DENSITY=0 [2 RANGE]
        -6
        6
ISRFONT=OFF [2 ENUMERATED]
        OFF
        ON
TRANSFER=AUTO [3 ENUMERATED]
        AUTO
        LOW
        HIGH
DOUBLESTRIKE=OFF [2 ENUMERATED]
        OFF
        ON
ERRORPRINT=ON [3 ENUMERATED]
        OFF
        ON
        EXCEPTCDCC
DEMOLANG=ENGLISH [8 ENUMERATED]
        ENGLISH
        USA
        CANADA
        FRENCHDUTCH
        GERMANFRENCH
        SPANISHPORTUGUESE
        ITALIAN
        NORDIC
STRINGCODESET=HPROMAN8 [4 ENUMERATED]
        HPROMAN8
        ISO88592
        ISO88595
        JISX02011976
LESSPAPERCURL=OFF [2 ENUMERATED]
        OFF
        ON
FIXINTENSITYUP=OFF [2 ENUMERATED]
        OFF
        ON
DENSITYLEVELUP=OFF [2 ENUMERATED]
        OFF
        ON
ENABLEEMAILREPORTS=OFF [2 ENUMERATED]
        OFF
        ON

@PJL INFO CONFIG
IN TRAYS [2 ENUMERATED]
        INTRAY1 MP
        INTRAY2 PC
OUT TRAYS [1 ENUMERATED]
        NORMAL FACEDOWN
PAPERS [17 ENUMERATED]
        LETTER
        LEGAL
        FOLIO
        EXECUTIVE
        A4
        A5
        A6
        JISB5
        B5
        B6
        A4LONG
        COM10
        MONARCH
        C5
        DL
        DLL
        POSTCARD
LANGUAGES [2 ENUMERATED]
        PCL
        PCLXL
USTATUS [4 ENUMERATED]
        DEVICE
        JOB
        PAGE
        TIMED
MEMORY=16777216
DISPLAY LINES=1
DISPLAY CHARACTER SIZE=16
LOCAL=ENGLISH
FEATURES [5 ENUMERATED]
        USB
        R600
        PAGEP
        DLF0
        BRNET

@PJL INFO MEMORY
TOTAL=8380032
LARGEST=8380032

@PJL INFO PAGECOUNT
PAGECOUNT=103904

@PJL INFO STATUS
CODE=10001
DISPLAY="READY           "
ONLINE=TRUE


root@ids:~#

### Python 中连接并使用打印机的方法 在 Python 中,可以通过多种方式实现与打印机的交互。以下是几种常见的方法及其适用场景: #### 方法一:使用 `ShellExecute` 打印预格式化文件 如果目标是打印一些标准类型的文件(如 `.doc`, `.pdf`, 或 `.txt`),可以利用 Windows 的 `ShellExecute` 函数来调用系统的默认应用程序完成打印操作。 ```python import tempfile import win32api import win32print # 创建临时文件 filename = tempfile.mktemp(".txt") open(filename, "w").write("This is a test") # 使用 ShellExecute 调用系统默认打印机 win32api.ShellExecute( 0, "print", filename, '/d:"%s"' % win32print.GetDefaultPrinter(), # 可选,默认使用默认打印机 ".", 0 ) ``` 这种方法简单易用,适用于不需要复杂配置的情况[^2]。 --- #### 方法二:使用 `win32print` 和 `win32ui` 实现更精细控制 当需要对打印过程进行更多自定义设置时,可以借助 `pywin32` 库中的 `win32print` 模块。此模块允许访问底层 API 来管理打印机队列、调整打印参数等。 以下是一个批量打印的例子,支持双面打印、多份打印以及颜色模式的选择: ```python import os import win32print def print_files_in_folder(folder_path, double_sided=False, copies=1, color=False): printer_name = win32print.GetDefaultPrinter() hPrinter = win32print.OpenPrinter(printer_name) try: for file_name in os.listdir(folder_path): file_path = os.path.join(folder_path, file_name) with open(file_path, 'rb') as f: file_contents = f.read() # 设置打印参数 print_flags = 0 if double_sided: print_flags |= 2 # 启用双面打印 if copies > 1: print_flags |= 1 # 多份打印 if color: print_flags |= 16384 # 彩色打印 # 开始打印 win32print.StartDocPrinter(hPrinter, 1, (file_name, None, 'RAW')) try: win32print.StartPagePrinter(hPrinter) win32print.WritePrinter(hPrinter, file_contents) win32print.EndPagePrinter(hPrinter) print(f"文件 '{file_name}' 已成功打印:{'双面' if double_sided else '单面'}, {copies}份, {'彩色' if color else '黑白'}打印") finally: win32print.EndDocPrinter(hPrinter) finally: win32print.ClosePrinter(hPrinter) ``` 该方法提供了更高的灵活性,适合处理复杂的打印任务[^3]。 --- #### 方法三:针对特定设备的 USB 接口打印 对于某些专用硬件(例如标签打印机或收银机热敏打印机),通常会提供专门的 SDK 或协议接口。在这种情况下,可以直接通过串口或 USB 发送命令流至打印机。 下面展示了一个基于 USB 的通用打印方案: ```python import usb.core import usb.util # 查找设备 dev = usb.core.find(idVendor=0xXXXX, idProduct=0xYYYY) # 替换为实际厂商ID和产品ID if dev is None: raise ValueError("未找到指定的USB设备") # 配置端点 endpoint_address = 0xXX # 根据具体设备手册获取地址 data_to_send = b"This is a raw data stream" # 发送数据 with dev: # 自动释放资源 dev.write(endpoint_address, data_to_send) ``` 需要注意的是,不同品牌和型号的打印机可能具有独特的指令集,因此需查阅对应的技术文档[^4]。 --- #### 如何检测纸张不足? 目前大多数操作系统并未直接暴露此类事件供第三方程序监听。不过,在 Windows 平台上可通过 WMI 查询当前状态或者轮询作业列表判断是否存在错误码提示缺纸等问题。另外也可以考虑集成 SNMP 协议监控网络型打印装置的状态变化情况。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值