Использовать полную ширину страницы с помощью 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 дюймов.