Использовать полную ширину страницы с помощью Brother P950NW

Я хотел бы использовать полную ширину 18-миллиметровых полосок в моем принтере Brother P950NW для изображения. На данный момент я использую ESC/P (не ESC/POS, который, как представляется, не поддерживает этот принтер), но если это невозможно, я в порядке с любым другим протоколом, поддерживаемым этим принтером. (Обновление: с помощью программного обеспечения Brother для Windows возможна полноширокая печать, но он использует протокол LPR, для которого, похоже, не существуют библиотеки Python.)

Я использую команду ESC/P ESC * с плотностью 72 (самая высокая доступная в соответствии с документацией на принтер), которая позволяет только заполнять ширину с шагом в 48 точек.

Как напечатать ширину 200 пикселей на полосе в ESC/P - произнести изображение с высотой 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'\[email protected]'  # 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()

Я в порядке с решениями в raw binary; вот двоичный файл и сокращенный hexdump, сгенерированный вышеуказанной программой.

Ответы

Ответ 1

Оба устройства Brother PT-P950NW и Borther PT-9800PCN поддерживают "растровый протокол" (код 1 вместо 0 после ESC iA). С помощью этого протокола можно печатать растровые изображения на полной ширине.

Тем не менее, я не смог найти документацию (ближайший был этот PDF для другого принтера), поэтому я обратил его в обратном порядке (и много пробовал). Результатом является проект rasterprynt, доступный как пакет PyPi. С помощью 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)

Ответ 2

Настройте страницу 8 DOC, мы можем указать позицию печати перед печатью одной строки, и даже с изображением она напечатает одну строку на одну строку. 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'\[email protected]'  # 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 дюймов.