使用 Brother P950NW 的全页宽度
Use full page width with Brother P950NW
我想在我的 Brother P950NW 打印机中使用 18mm 条带的整个宽度来打印图像。目前,我正在使用 ESC/P(不是 ESC/POS,这台打印机似乎不支持),但如果无法使用,我可以使用任何其他协议本打印机支持。 (更新:Brother的Windows软件可以全角打印,但是使用的是LPR协议,好像没有Python库。)
我正在使用密度为 72 的 ESC/P 命令 ESC*(根据 the printer's documentation,可用的最高密度),它只允许以 48 点为步长填充宽度。
如何在 ESC/P-speak 高度为 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 file and shortened hexdump。
基于DOC的第8页,我们可以在打印一行之前指定打印位置,即使是图像,它也会一行一行打印。ESC $
可以指定绝对水平位置和ESC J
将 Finishes input of the current line, then moves the vertical print position forward by n/180 inch
. 将这两个结合起来,也许你可以使用所有 234 个可打印区域。
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()
b'\x1b4a' + struct.pack('!B', 42)
isESC J 向前进纸
ASCII: ESC J n
十进制:27 74 n
十六进制:1B 4A n
参数
0≤n≤255
描述
完成当前行的输入,然后垂直打印位置向前移动n/180英寸。
如果n小于24,则进纸量为24/180英寸(约0.34厘米)。
b'1b24'+struct.pack('!B', 0)+struct.pack('!B', 0)
是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英寸
Brother PT-P950NW 和 Borther PT-9800PCN 都支持 "raster protocol"(代码 1 而不是 ESC iA
之后的 0)。使用此协议,可以全宽打印光栅图形。
但是,我找不到任何文档(最接近的是 this PDF for another printer), so I reverse-engineered it (and tried out a lot). The result is the project rasterprynt, available as a PyPi package。使用 rasterprynt,您可以打印任意图像,如下所示:
import rasterprynt
import PIL.Image
# Enter the IP address of your printer below
printer_ip = '192.168.1.123'
img1 = PIL.Image.open('example1.png')
img2 = PIL.Image.open('example2.png')
data = rasterprynt.prynt([img1, img2, img1], printer_ip)
我想在我的 Brother P950NW 打印机中使用 18mm 条带的整个宽度来打印图像。目前,我正在使用 ESC/P(不是 ESC/POS,这台打印机似乎不支持),但如果无法使用,我可以使用任何其他协议本打印机支持。 (更新:Brother的Windows软件可以全角打印,但是使用的是LPR协议,好像没有Python库。)
我正在使用密度为 72 的 ESC/P 命令 ESC*(根据 the printer's documentation,可用的最高密度),它只允许以 48 点为步长填充宽度。
如何在 ESC/P-speak 高度为 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 file and shortened hexdump。
基于DOC的第8页,我们可以在打印一行之前指定打印位置,即使是图像,它也会一行一行打印。ESC $
可以指定绝对水平位置和ESC J
将 Finishes input of the current line, then moves the vertical print position forward by n/180 inch
. 将这两个结合起来,也许你可以使用所有 234 个可打印区域。
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()
b'\x1b4a' + struct.pack('!B', 42)
isESC J 向前进纸
ASCII: ESC J n
十进制:27 74 n
十六进制:1B 4A n
参数
0≤n≤255
描述
完成当前行的输入,然后垂直打印位置向前移动n/180英寸。
如果n小于24,则进纸量为24/180英寸(约0.34厘米)。
b'1b24'+struct.pack('!B', 0)+struct.pack('!B', 0)
是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英寸
Brother PT-P950NW 和 Borther PT-9800PCN 都支持 "raster protocol"(代码 1 而不是 ESC iA
之后的 0)。使用此协议,可以全宽打印光栅图形。
但是,我找不到任何文档(最接近的是 this PDF for another printer), so I reverse-engineered it (and tried out a lot). The result is the project rasterprynt, available as a PyPi package。使用 rasterprynt,您可以打印任意图像,如下所示:
import rasterprynt
import PIL.Image
# Enter the IP address of your printer below
printer_ip = '192.168.1.123'
img1 = PIL.Image.open('example1.png')
img2 = PIL.Image.open('example2.png')
data = rasterprynt.prynt([img1, img2, img1], printer_ip)