Я хотел бы использовать полную ширину 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, сгенерированный вышеуказанной программой.