Kamal Perera
Kamal Perera

Reputation: 1

How to print images using ESC/POS commands on a Star MC-Print3 printer with Groovy?

I'm working on a Groovy script to print tickets using a Star MC-Print3 thermal printer and ESC/POS commands. I have successfully implemented basic printing features like text alignment, printing text, and cutting the paper. However, I'm struggling to print images using the ESC/POS commands.

I want to print an image on the ticket (as the ticket i receive base64 string of a bitmap image. that's what i want to print), but I'm unsure how to send image data to the printer. I know that ESC/POS supports bitmap images, but I’m unclear on the exact steps to convert an image to the required format and send it correctly to the printer.

Here’s my current script (without image printing):

def printTicket(String ticketNumber) {
    println 'Printer'

    // Replace with your printer's IP address and port
    def PRINTER_IP = '192.168.1.3'
    def PRINTER_PORT = 9100

    try {
        // Create a socket connection to the printer
        Socket client = new Socket(PRINTER_IP, PRINTER_PORT)
        println 'Connected to printer'

        OutputStream out = client.getOutputStream()

        // Example ESC/POS commands for a basic ticket
        byte[] initPrinter = [0x1B, 0x40] // Initialize printer
        byte[] centerAlign = [0x1B, 0x1D, 0x61, 0x01] // Center alignment
        byte[] text = 'Hello, Star Printer!\n'.getBytes('UTF-8') // Ticket text
        byte[] ticketText = ticketNumber.getBytes('UTF-8') // Ticket number
        byte[] lineFeed = [0x0A] // Line feed
        byte[] cutPaper = [0x1B, 0x64, 0x03] // Cut paper

        // Send commands to printer
        out.write(initPrinter)  // Initialize printer
        out.write(centerAlign)  // Set alignment to center
        out.write(text)         // Print text
        out.write(lineFeed)     // Add line feed
        out.write(ticketText)   // Print ticket text
        out.write(lineFeed)     // Add another line feed
        out.write(cutPaper)     // Cut paper

        // Close the connection
        out.close()
        client.close()
        println 'Connection to printer closed'

    } catch (Exception e) {
        println "Printer connection error: ${e.message}"
    }
}

The issue: I’m having trouble printing images. From what I understand, ESC/POS allows printing bitmap images, but I don’t know how to:

  1. Convert an image (e.g., PNG/JPG or base64 string of bitmap) into a suitable byte array that the printer can interpret.
  2. Send this image data to the printer using ESC/POS commands.

What I’ve tried: I know I need to convert the image into a bitmap format (like monochrome, 1 bit per pixel). I have found references to GS v 0 command for printing bitmaps, but I’m unsure how to structure the image data or how to handle different image formats.

What I need help with: Image Conversion: How can I convert an image into the correct byte array format for ESC/POS? Do I need to convert it to monochrome first? ESC/POS Command: What commands do I need to use to send the image data to the printer? Groovy/Java Implementation: Any examples or code snippets in Groovy/Java for image printing would be greatly appreciated. If anyone has experience with this or can point me to resources or examples, it would be extremely helpful!

Thanks in advance for your help!

Upvotes: 0

Views: 53

Answers (1)

chubbsondubs
chubbsondubs

Reputation: 38706

If you need to convert from PNG/JPG to BMP you can do the following:

byte[] toBmp( String base64Image ) {
   BufferedImage src = ImageIO.read( new ByteArrayInputStream( 
   base64Image.decodeBase64() ) )
   def bmpImg = new ByteArrayOutputStream()
   ImageIO.write( src, "BMP", bmpImg )
   return bmpImg.toBytes()
}

printer.sendImage( toBmp( base64Image ) )

Words of Warning: this may not handle transparent PNGs properly because BMP's don't support transparency. Not that you can't do it, but this code probably needs to be modified

Upvotes: 0

Related Questions