Используйте полную ширину страницы с 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'\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()

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

2 ответа

Решение

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

Однако я не смог найти никакой документации (самым близким был этот PDF для другого принтера), поэтому я перепроектировал его (и много пробовал). В результате получается растровый проект, доступный в виде пакета 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)

На основе страницы 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'\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 Если 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 дюйма) для следующих данных.

Position Абсолютная позиция печати определяет горизонтальную позицию печати от левого поля.

 Следующий символ печатается в позиции (n1 + 256 * n2) / 60 дюймов от левого поля.

 Максимальное количество точек, которое может быть указано как n1, так и n2, составляет 1023/60 дюймов.

Другие вопросы по тегам