node-thermal-printer icon indicating copy to clipboard operation
node-thermal-printer copied to clipboard

If the image width exceeds 580 pixels the image gets cut off.

Open adnanlah opened this issue 2 years ago • 1 comments

Hello,

When attempting to print images, images with a width exceeding 580 pixels are not printed in full when I tried it with my X-Printer Q371U. Instead, the portion of the image beyond 580 pixels in width is cut off, resulting in incomplete prints.

I am not sure if 580px is the same max width for all printers or just mine.

Is there any workaround or a way to solve this? This is the only package that prints images properly.

Thanks.

adnanlah avatar Apr 03 '24 02:04 adnanlah

So, continuing with the topic from the other issue (https://github.com/Klemen1337/node-thermal-printer/issues/250), I couldn't make the print occupy the entire page. I just increased the size of the image to the maximum I needed.

In my case, I used the libraries pngjs and sharp to handle the image buffer resizing.

import { PNG } from 'pngjs'
import sharp from 'sharp'

async function resizePNGBuffer(buffer, newWidth) {
  try {
    const png = PNG.sync.read(buffer)
    const scale = newWidth / png.width;
    const newHeight = Math.round(png.height * scale);
    const newBuffer = await sharp(buffer)
      .resize({ width: newWidth, height: newHeight })
      .toBuffer();
    return newBuffer;
  } catch (error) {
    console.error('Error resizing image:', error);
    return null;
  }
}

// 510px was the maximum size I managed to resize the image without slowing down the printing.
async function getLayout() {
  try {
    const url = 'URL'
    const payload = {}
    const result = await axios.post(url, payload, { responseType: 'arraybuffer' })
    const resizedBuffer = await resizePNGBuffer(result.data, 510)
    await printFromBuffer(resizedBuffer)
  } catch (e) {
    console.log(e)
  }
}

async function printFromBuffer(buffer) {
  try {
    let isConnected = await printer.isPrinterConnected()
    if (!isConnected) {
      throw Error("not connected")
    }
    
    await printer.printImageBuffer(buffer)
    printer.cut()
    await printer.execute()
    printer.clear()
  } catch (e) {
    console.log(e)
  }
}

I hope this can help you in some way, but the print still has margins on the paper's edge that I don't know how to solve yet.

hugocalheira avatar Apr 08 '24 17:04 hugocalheira