1

I have an app that can print tickets with Thermal Printers using ESC POS language. The code I'm using right now is:

       /* <-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");

And it works fine. The thing is that now I'm capturing the user's signature with the tablet and I want to print it in the end of the ticket. I have it as a bitmap object but I don't know how to send it to the printer. Can someone help me? Thanks!

EDIT 1:

I'm trying to do something but I think I'm not going in the right way...

/**
* 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);
}
2
  • Is it a question about the ESC POS protocol, or about Java specifically? Commented Jun 23, 2015 at 12:01
  • It's about ESC POS, but if I can get a sample of how to do it in Java, it will be awesome. Commented Jun 23, 2015 at 12:55

1 Answer 1

1

I have completed this task before in c++ and it isn't trivial. You need to get pixel by pixel access to the image (which should be easy if you have a bitmap).

Then you have to divide the image into 8 pixel horizontal bands and get a character representing each column of eight pixels (using a bitwise or). The POS documentation should tell you how to print a single row of graphics using this method.

None of this is very hard but it took a bit of fiddling to get it perfect for all image sizes and shapes.

A more detailed description: The printer can print images left to right in 8 pixel vertical bands, that means it first print the top 8 pixels of the image - then scrolls the paper and prints the next 8 pixel row. So you do it like this:

Go down the image starting at the top and divide it into 8 pixel high bands.For each band:

Send the ESC POS sequence that puts the printer into 'graphics mode'. Loop through the image band left to right. For each column of 8 pixels in the band:

Work out the bit values of the pixels top to bottom. Convert this to a simple byte values like so IsPixelBlack(0)*1+IsPixelBlack(1)*2+IsPixelBlack(2)*4+...+IsPixelBlack(7)*128 where IsPixelBlack(x) is 1 if the x pixel in the column is black or 0 otherwise. Then send this byte value to the printer as a character.

So you end up sending one character for every 8 pixel column expressed as string of one band of data to be printed.

Also I thought Epson had an android SDK for ESC/POS devices; I've never used it but thought it was free to use.

Sign up to request clarification or add additional context in comments.

3 Comments

It's easy to get pixel by pixel access, but I'm not sure about how to divide the image into 8 pixel horizontal bands. I'm not sure about how esc pos words for printing images... each band is a row? A row can be created with multiple bands? If u can help me with your c++ code I'll be really happy.
Unfortunately this code is not public and so I can't paste it here but I will add a more complete description of what I mean.
Hi Elemental, I'm trying to do what u told me but I'm pretty newbie with ESC POS and I'm lost. I'm trying to do something with this code: stackoverflow.com/questions/14099239/… but I'm not sure about how to divide the Bitmap in pixels. I have it in a Byte array but I don't know how to continue...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.