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