2015-06-23 9 views
1

У меня есть приложение, которое может печатать билеты с помощью Thermal Printers с использованием языка ESC POS. Код, который я использую прямо сейчас:Как распечатать изображение с помощью Esc Pos с Android (Java)

 /* <-40char-> */ 
        Socket sock = new Socket(Impresora.getImpresora_Tickets().getIp(), Impresora.getImpresora_Tickets().getPuerto()); 
        OutputStreamWriter osw = new OutputStreamWriter(sock.getOutputStream(), Charset.forName("CP1252")); 
        PrintWriter oStream = new PrintWriter(osw); 

     /*Start*/ 
        for(int i = 0; i<Impresora.getImpresora_Tickets().getInic().size(); i++) 
         oStream.print(Impresora.getImpresora_Tickets().getInic().get(i)); 

     /*Set Font Size*/ 
        for(int i = 0; i<Impresora.getImpresora_Tickets().getLetra4().size(); i++) 
          oStream.print(Impresora.getImpresora_Tickets().getLetra4().get(i)); 

     oStream.println("HELLO WORLD"); 

И он отлично работает. Дело в том, что теперь я собираю подпись пользователя с планшетом, и я хочу распечатать его в конце билета. У меня это как растровый объект, но я не знаю, как отправить его на принтер. Кто-нибудь может мне помочь? Благодаря!

EDIT 1:

Я пытаюсь сделать что-то, но я думаю, что я не буду в правильном направлении ...

/** 
* Redimensionar imagen 
*/ 
Bitmap firma = Current_Mesa.getT().getFirma_credito(); 
firma = Bitmap.createScaledBitmap(firma, 255, 64, false); 

/** 
* Print imagen 
*/ 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
firma.compress(CompressFormat.JPEG, 70, stream); 
byte[] firma_bytes = stream.toByteArray(); 

byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33}; 
byte[] SET_LINE_SPACE_24 = {0x1B, 0x33, 24}; 
byte[] PRINT_AND_FEED_PAPER = new byte[]{0x0A}; 

for(byte b : SELECT_BIT_IMAGE_MODE) 
oStream.print((char)b); 

for(byte b : SET_LINE_SPACE_24) 
oStream.print((char)b); 

for(int i = 0; i < firma_bytes.length; i+=8) 
{ 
    for(int plus = 0; plus < 8; plus++) 
    oStream.print(firma_bytes[i+plus]); 

    for(byte b : PRINT_AND_FEED_PAPER) 
     oStream.print((char)b); 
} 
+0

Вопрос о протоколе ESC POS или о Java конкретно? – immibis

+0

Речь идет о ESC POS, но если я смогу получить образец того, как это сделать на Java, это будет потрясающе. –

ответ

1

Я выполнил эту задачу, прежде чем в C++ и не является тривиальным. Вам нужно получить пиксельный доступ к изображению (что должно быть легко, если у вас есть растровое изображение).

Затем вы должны разделить изображение на 8 пиксельных горизонтальных полос и получить символ, представляющий каждый столбец из восьми пикселей (с использованием побитового или). Документация POS должна рассказать вам, как печатать одну строку графики, используя этот метод.

Ничего из этого не очень сложно, но потребовалось немного возиться, чтобы добиться идеальности для всех размеров и форм изображения.

Более подробное описание: Принтер может печатать изображения слева направо в 8-пиксельных вертикальных полосах, что означает, что он сначала печатает верхние 8 пикселей изображения - затем прокручивает бумагу и печатает следующую строку из 8 пикселей. Таким образом, вы делаете это так:

Перейти вниз изображение, начиная с верхней и разделить его на 8 пикселей с высоким bands.For каждой группы:

Отправить последовательность ESC POS, которая помещает принтер в «графическом режиме» , Прокрутите изображение слева направо. Для каждого столбца из 8 пикселей в полосе:

Исследуйте значения бит пикселей сверху вниз. Преобразуйте это в простые байтовые значения, например, IsPixelBlack (0) * 1 + IsPixelBlack (1) * 2 + IsPixelBlack (2) * 4 + ... + IsPixelBlack (7) * 128 где IsPixelBlack (x) равен 1, если x пиксель в столбце черный или 0 в противном случае. Затем отправьте это байтовое значение на принтер как символ.

Итак, вы отправляете один символ для каждого столбца с 8 пикселями, выражаемый в виде строки одного диапазона данных для печати.

Также я думал, что у Epson был SDK Android для устройств ESC/POS; Я никогда не использовал его, но думал, что он свободен в использовании.

+0

Легко получить пиксельный доступ через пиксель, но я не уверен, как разделить изображение на 8-пиксельные горизонтальные полосы. Я не уверен, как esc pos слова для печати изображений ... каждая группа - это строка? Строка может быть создана с несколькими полосами? Если вы можете помочь мне с вашим кодом на C++, я буду очень рад. –

+0

К сожалению, этот код не является общедоступным, поэтому я не могу вставить его здесь, но я добавлю более полное описание того, что я имею в виду. – Elemental

+0

Привет Элементаль, я пытаюсь сделать то, что сказал мне, но я довольно новичок с ESC POS, и я потерялся. Я пытаюсь что-то сделать с помощью этого кода: http: // stackoverflow.com/questions/14099239/print-a-bit-map-image-to-pos-printer-via-comport-in-c-sharp, но я не уверен, как разделить битмап в пикселях. У меня это в массиве Byte, но я не знаю, как продолжить ... –