使用Brother P950NW

时间:2018-04-19 20:18:20

标签: python python-3.x printing escp

我想在Brother P950NW打印机上使用18mm条带的全宽来拍摄图像。目前,我正在使用ESC / P(不是ESC / POS,这个打印机似乎不支持),但是如果它不可能,我可以使用任何其他协议,这个打印机支持。 (更新:使用Brother的Windows软件,可以进行全宽度打印,但它使用LPR协议,因为它似乎不是任何Python库。)

我使用密度为72的ESC / P命令ESC *(根据the printer's documentation提供的最高值),只允许以48点的步长填充宽度。

如何在ESC / P中的条带上打印200像素宽的高清200?这应该很容易适应条带。但是,由于ESC * 72仅接受48个块,超过192的所有内容都在另一个条带上输出。

这是我的演示代码:

import socket
import struct

def escp(density_code=72):
    stack_size_in_bytes = {72: 6}[density_code]
    height = 200
    width = 130

    yield b'\x1bia\x00'  # ESC/P command mode: ESC/P standard
    yield b'\x1b@'  # Initialize
    yield b'\x1bim\x00\x00'  # margin: 0
    yield b'\x1biXE2\x00\x00\x00'  # barcode margin: 0
    yield b'\x1b3' + struct.pack('!B', 24)  # line feed length: 24 dots (i.e. no space between lines)

    for y_offset in range(0, height, 8 * stack_size_in_bytes):
        yield b'\x1b*' + struct.pack('!B', density_code) + struct.pack('<H', width)
        yield b'\xff' * width * stack_size_in_bytes
        yield b'\x0a'  # linefeed (move position 24 dots down)
    yield b'\x0c' # Print start

c = socket.create_connection(('10.222.2.206', 9100))
c.sendall(b''.join(escp()))
c.close()

我对原始二进制解决方案很好;这是由上述程序生成的the binary fileshortened hexdump

1 个答案:

答案 0 :(得分:1)

基于DOC的第8页,我们可以在打印一行之前指定打印位置,即使使用图像,它也会逐行打印一行。ESC $可以指定绝对水平位置和{{1将} ESC J。结合这两个,也许你可以使用所有234个可打印区域。

Finishes input of the current line, then moves the vertical print position forward by n/180 inch

import socket import struct def escp(density_code=72): stack_size_in_bytes = {72: 6}[density_code] height = 200 width = 130 yield b'\x1bia\x00' # ESC/P command mode: ESC/P standard yield b'\x1b@' # Initialize yield b'\x1bim\x00\x00' # margin: 0 yield b'\x1biXE2\x00\x00\x00' # barcode margin: 0 yield b'\x1b3' + struct.pack('!B', 24) # line feed length: 24 dots (i.e. no space between lines) for y_offset in range(0, height, 8 * stack_size_in_bytes): yield b'\x1b*' + struct.pack('!B', density_code) + struct.pack('<H', width) yield b'\xff' * width * stack_size_in_bytes # the added command ECS J yield b'\x1b4a' + struct.pack('!B', 42) # ESC $ is b'1b24'+struct.pack('!B', 0)+struct.pack('!B', 0) yield b'\x0a' # linefeed (move position 24 dots down) yield b'\x0c' # Print start c = socket.create_connection(('10.222.2.206', 9100)) c.sendall(b''.join(escp())) c.close() isESC J正向供纸

ASCII:ESC J n

十进制:27 74 n

十六进制:1B 4A n

参数

0≤n≤255

描述

完成当前行的输入,然后将垂直打印位置向前移动n / 180英寸。

如果n小于24,则进给量为24/180英寸(约0.34 cm)。

b'\x1b4a' + struct.pack('!B', 42)是ESC $指定绝对水平位置

ASCII:ESC $ n1 n2

十进制:27 36 n1 n2

十六进制:1B 24 n1 n2

参数

0≤n1≤255,0≤n2≤255

描述

指定下一个数据的绝对打印位置(以1/60英寸为单位)。

绝对打印位置指定左边距的水平打印位置。

下一个字符打印在距离左边距的位置(n1 + 256 * n2)/ 60英寸处。

n1和n2指定的最大点数为1023/60英寸。