首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与兄弟P950NW一起使用全页宽度

与兄弟P950NW一起使用全页宽度
EN

Stack Overflow用户
提问于 2018-04-19 20:18:19
回答 2查看 639关注 0票数 14

我想使用我的兄弟P950NW打印机的18毫米条的全宽度作为图像。目前,我使用的是ESC/P (不是ESC/POS,这台打印机似乎不支持ESC/POS),但是如果不可能的话,我可以使用其他任何打印机支持的协议。(更新:使用Brother的Windows软件,可以实现全宽度打印,但它使用的是LPR协议,似乎没有任何Python库。)

我正在使用ESC/P命令ESC*,密度为72 (打印机文件显示的最高值),它只允许用48个点的步骤填充宽度。

如何在ESC/P中的条带上打印200像素宽--说出高度为200的图像?那应该很容易就能装在条子上。然而,由于ESC*72只接受48块,192以上的所有东西都输出在另一个带上。

下面是我的演示代码:

代码语言:javascript
复制
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()

我不介意使用原始二进制的解决方案;下面是由上面的程序生成的二进制文件缩短六转储

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-13 15:25:02

PT-P950NW兄弟和BortherPT-9800PCN都支持“光栅协议”(代码1,而不是ESC iA后的0)。使用此协议,可以打印全宽度的光栅图形。

然而,我找不到任何文档(最近的文档是此PDF格式用于另一台打印机),所以我对它进行了反向设计(并进行了大量的尝试)。结果是项目格列斯特普林,可作为一个PyPi包使用。使用rasterprynt,您可以打印任意图像,如下所示:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-04-28 14:46:41

基于DOC的第8页,我们可以在打印一行之前指定打印位置,即使是图像,它也可以一行一行地打印出来,ESC $可以指定绝对水平位置,ESC J将指定Finishes input of the current line, then moves the vertical print position forward by n/180 inch.combine这两条,也许可以使用所有234个可打印区域。

代码语言:javascript
复制
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.34cm)。

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英寸)。

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

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

n1和n2都可以指定的最大点数是1023/60英寸。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49929551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档