Skip to content

Instantly share code, notes, and snippets.

@rjoffray
Created February 15, 2023 21:42
Show Gist options
  • Save rjoffray/8b4912a2e005f3e20ca09f28fea04a1c to your computer and use it in GitHub Desktop.
Save rjoffray/8b4912a2e005f3e20ca09f28fea04a1c to your computer and use it in GitHub Desktop.
Chat GPT code writing

Chat GPT

Question

write code using node.js that implements all of the esc/pos language to print a receipt including a logo, a list of items with prices, a tag line and a barcode

Chat GPT

Here's an example code using Node.js that implements ESC/POS language to print a receipt:

const escpos = require('escpos');
const device = new escpos.USB();
const printer = new escpos.Printer(device);

// Set the character encoding to support extended characters
printer
  .encoding('GB18030')
  .align('center');

// Print logo
printer.image('logo.png')
  .then(() => {
    // Print a line of text
    printer.text('Welcome to My Store\n');

    // Print a list of items with prices
    const items = [
      {name: 'Item 1', price: 10.00},
      {name: 'Item 2', price: 15.50},
      {name: 'Item 3', price: 20.00},
    ];
    printer.tableCustom(
      [
        {text: 'Item', align: 'LEFT', width: 0.5},
        {text: 'Price', align: 'RIGHT', width: 0.5},
      ],
      {encoding: 'cp857', size: [1, 1]},
      items.map(({name, price}) => [name, price.toFixed(2)])
    );

    // Print a tag line
    printer.text('Thank you for shopping with us!\n\n');

    // Print a barcode
    printer.barcode('123456789012', 'EAN13', {height: 64});

    // Cut the paper
    printer.cut();
  })
  .then(() => {
    console.log('Receipt printed successfully!');
  })
  .catch((err) => {
    console.error(err);
  })
  .finally(() => {
    // Close the printer connection
    device.close();
  });

This example code assumes that you have a logo file named logo.png in the same directory as the script. You'll need to replace 123456789012 with your actual barcode value. Also, the example code is using the escpos package for Node.js and assumes that you have the necessary drivers installed to connect to your ESC/POS-compatible printer.

Question

can you add to the code you wrote the capability to read the the vendorId from esc/pos capable printers

Chat GPT

Yes, here's an updated example code that adds the capability to read the vendor ID of the ESC/POS-compatible printer:

const escpos = require('escpos');
const device = new escpos.USB();
const printer = new escpos.Printer(device);

// Get the vendor ID of the printer
const vendorId = device.usbDeviceDescriptor.idVendor;
console.log(`Vendor ID: ${vendorId}`);

// Set the character encoding to support extended characters
printer
  .encoding('GB18030')
  .align('center');

// Print logo
printer.image('logo.png')
  .then(() => {
    // Print a line of text
    printer.text('Welcome to My Store\n');

    // Print a list of items with prices
    const items = [
      {name: 'Item 1', price: 10.00},
      {name: 'Item 2', price: 15.50},
      {name: 'Item 3', price: 20.00},
    ];
    printer.tableCustom(
      [
        {text: 'Item', align: 'LEFT', width: 0.5},
        {text: 'Price', align: 'RIGHT', width: 0.5},
      ],
      {encoding: 'cp857', size: [1, 1]},
      items.map(({name, price}) => [name, price.toFixed(2)])
    );

    // Print a tag line
    printer.text('Thank you for shopping with us!\n\n');

    // Print a barcode
    printer.barcode('123456789012', 'EAN13', {height: 64});

    // Cut the paper
    printer.cut();
  })
  .then(() => {
    console.log('Receipt printed successfully!');
  })
  .catch((err) => {
    console.error(err);
  })
  .finally(() => {
    // Close the printer connection
    device.close();
  });

This example code uses the idVendor property of the usbDeviceDescriptor object of the USB device to get the vendor ID. Note that this property is only available after the open method of the USB object is called.

Question

can you add code to add the productid and list all usb printers connected to this computer

Chat GPT

Yes, here's an updated example code that adds the capability to read the product ID of the ESC/POS-compatible printer and list all USB printers connected to the computer:

const escpos = require('escpos');
const usb = require('escpos-usb');
const device = new escpos.USB();
const printer = new escpos.Printer(device);

// List all USB printers connected to the computer
usb.getDeviceList().then((devices) => {
  console.log('USB printers connected:');
  devices.forEach((device) => {
    console.log(`  ${device.deviceDescriptor.idVendor}:${device.deviceDescriptor.idProduct}`);
  });
});

// Get the vendor ID and product ID of the printer
device.open(() => {
  const vendorId = device.usbDeviceDescriptor.idVendor;
  const productId = device.usbDeviceDescriptor.idProduct;
  console.log(`Vendor ID: ${vendorId}`);
  console.log(`Product ID: ${productId}`);

  // Set the character encoding to support extended characters
  printer
    .encoding('GB18030')
    .align('center');

  // Print logo
  printer.image('logo.png')
    .then(() => {
      // Print a line of text
      printer.text('Welcome to My Store\n');

      // Print a list of items with prices
      const items = [
        {name: 'Item 1', price: 10.00},
        {name: 'Item 2', price: 15.50},
        {name: 'Item 3', price: 20.00},
      ];
      printer.tableCustom(
        [
          {text: 'Item', align: 'LEFT', width: 0.5},
          {text: 'Price', align: 'RIGHT', width: 0.5},
        ],
        {encoding: 'cp857', size: [1, 1]},
        items.map(({name, price}) => [name, price.toFixed(2)])
      );

      // Print a tag line
      printer.text('Thank you for shopping with us!\n\n');

      // Print a barcode
      printer.barcode('123456789012', 'EAN13', {height: 64});

      // Cut the paper
      printer.cut();
    })
    .then(() => {
      console.log('Receipt printed successfully!');
    })
    .catch((err) => {
      console.error(err);
    })
    .finally(() => {
      // Close the printer connection
      device.close();
    });
});

This example code uses the escpos-usb package to list all USB printers connected to the computer. The getDeviceList function returns a promise that resolves to an array of USB devices. For each device, the idVendor and idProduct properties of the deviceDescriptor object are logged to the console.

The code also uses the open method of the USB object to get the vendor ID and product ID of the ESC/POS-compatible printer. The usbDeviceDescriptor object of the USB device contains the idVendor and idProduct properties. Note that the open method takes a callback function that is called when the device is successfully opened. Inside this callback, the ESC/POS commands can be sent to the printer.

Question

can you write the same come in es6

Chat GPT

Sure! Here's the same code using ES6 syntax:

import escpos from 'escpos';
import usb from 'escpos-usb';

const device = new escpos.USB();
const printer = new escpos.Printer(device);

// List all USB printers connected to the computer
usb.getDeviceList().then(devices => {
  console.log('USB printers connected:');
  devices.forEach(device => {
    console.log(`  ${device.deviceDescriptor.idVendor}:${device.deviceDescriptor.idProduct}`);
  });
});

// Get the vendor ID and product ID of the printer
device.open(() => {
  const vendorId = device.usbDeviceDescriptor.idVendor;
  const productId = device.usbDeviceDescriptor.idProduct;
  console.log(`Vendor ID: ${vendorId}`);
  console.log(`Product ID: ${productId}`);

  // Set the character encoding to support extended characters
  printer
    .encoding('GB18030')
    .align('center');

  // Print logo
  printer.image('logo.png')
    .then(() => {
      // Print a line of text
      printer.text('Welcome to My Store\n');

      // Print a list of items with prices
      const items = [
        {name: 'Item 1', price: 10.00},
        {name: 'Item 2', price: 15.50},
        {name: 'Item 3', price: 20.00},
      ];
      printer.tableCustom(
        [
          {text: 'Item', align: 'LEFT', width: 0.5},
          {text: 'Price', align: 'RIGHT', width: 0.5},
        ],
        {encoding: 'cp857', size: [1, 1]},
        items.map(({name, price}) => [name, price.toFixed(2)])
      );

      // Print a tag line
      printer.text('Thank you for shopping with us!\n\n');

      // Print a barcode
      printer.barcode('123456789012', 'EAN13', {height: 64});

      // Cut the paper
      printer.cut();
    })
    .then(() => {
      console.log('Receipt printed successfully!');
    })
    .catch(err => {
      console.error(err);
    })
    .finally(() => {
      // Close the printer connection
      device.close();
    });
});

This code uses the import statement to import the escpos and escpos-usb modules. The const keyword is used to declare constant variables.

Arrow functions are used instead of traditional function expressions for the callback functions in the getDeviceList and then methods. The destructuring assignment syntax is used to extract the idVendor and idProduct properties of the deviceDescriptor object.

Object literal shorthand syntax is used to define the items array of objects. Arrow function syntax is used to map the items array to an array of arrays that can be passed to the tableCustom method.

The catch and finally methods are called on the promise returned by the then method. The finally method is used to close the connection to the printer regardless of whether the promise is fulfilled or rejected.

Question

going back to the node.js version, can you add the ability to run an express server that will receive the items, image as a data url , the tagline and the the barcode? also can you change the barcode to a QR Code that also is sent to the express server as a url.

Chat GPT

Sure, here's an updated version of the code that includes an Express server that receives the data for the receipt, and generates a QR code using the qrcode package:

const express = require('express');
const escpos = require('escpos');
const usb = require('escpos-usb');
const qrcode = require('qrcode');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;

// Create a new USB device for the printer
const device = new usb.USB();
const printer = new escpos.Printer(device);

// Configure middleware to parse JSON in the request body
app.use(bodyParser.json());

// Handle POST requests to /print
app.post('/print', async (req, res) => {
  try {
    // Get data from request body
    const {items, image, tagline, barcodeUrl, qrCodeUrl} = req.body;

    // Open connection to the printer
    await device.open();

    // Set character encoding and alignment
    printer.encoding('GB18030').align('center');

    // Print image
    if (image) {
      const buffer = Buffer.from(image.replace(/^data:image\/png;base64,/, ''), 'base64');
      await printer.image(buffer);
    }

    // Print items with prices
    const header = [{text: 'Item', align: 'LEFT', width: 0.5}, {text: 'Price', align: 'RIGHT', width: 0.5}];
    const data = {encoding: 'cp857', size: [1, 1]};
    const tableData = items.map(({name, price}) => [name, price.toFixed(2)]);
    await printer.tableCustom(header, data, tableData);

    // Print tagline
    if (tagline) {
      printer.text(`${tagline}\n\n`);
    }

    // Print barcode
    if (barcodeUrl) {
      await printer.barcode(barcodeUrl, 'EAN13', {height: 64});
    }

    // Generate QR code and print it
    if (qrCodeUrl) {
      const qrCodeBuffer = await qrcode.toBuffer(qrCodeUrl);
      await printer.image(qrCodeBuffer);
    }

    // Cut the paper and flush the buffer
    printer.cut().flush();

    res.send('Receipt printed successfully!');
  } catch (error) {
    res.status(500).send(`Error: ${error.message}`);
  } finally {
    // Close connection to the printer
    device.close();
  }
});

// Start the server
app.listen(port, () => {
  console.log(`Listening at http://localhost:${port}`);
});

This code creates an Express server using the express package, and listens for POST requests to the /print endpoint. The body-parser package is used to parse JSON data in the request body.

The async/await syntax is used to make the code easier to read and write. The code first extracts the data from the request body, and then opens a connection to the printer.

The image data is converted from a data URL to a buffer, and then printed using the image method. The items are printed using the tableCustom method, and the tagline is printed using the text method.

If a barcode URL is provided, it is printed using the barcode method. If a QR code URL is provided, it is generated using the qrcode package, and printed using the image method.

Finally, the paper is cut and the buffer is flushed. If an error occurs at any point, a 500 error is returned to the client.

Question

can you add an exaple json that should be sent to the print endpoint

Chat GPT

Sure, here's an example JSON payload that could be sent to the /print endpoint of the server:

{
  "items": [
    { "name": "Item 1", "price": 10.00 },
    { "name": "Item 2", "price": 20.00 },
    { "name": "Item 3", "price": 30.00 }
  ],
  "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA\nAAAAyCAIAAABvI1wMAAAADklEQVR4nGNgYGBgAAAABQABh6FO1AAAAABJRU\n5ErkJggg==",
  "tagline": "Thank you for your business!",
  "barcodeUrl": "012345678901",
  "qrCodeUrl": "https://example.com"
}

This payload includes an array of items, an image in a data URL format, a tagline string, a barcodeUrl string, and a qrCodeUrl string. You can adjust the values as needed for your use case.

Question

can you write an ajax post request to the node.js print endpoint that sends this json example

Chat GPT

Sure, here's an example AJAX POST request in JavaScript that sends the example JSON payload to the /print endpoint of the Node.js server:

const payload = {
  "items": [
    { "name": "Item 1", "price": 10.00 },
    { "name": "Item 2", "price": 20.00 },
    { "name": "Item 3", "price": 30.00 }
  ],
  "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA\nAAAAyCAIAAABvI1wMAAAADklEQVR4nGNgYGBgAAAABQABh6FO1AAAAABJRU\n5ErkJggg==",
  "tagline": "Thank you for your business!",
  "barcodeUrl": "012345678901",
  "qrCodeUrl": "https://example.com"
};

const requestOptions = {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(payload)
};

fetch('/print', requestOptions)
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => {
    console.log('Print request successful:', data);
  })
  .catch(error => {
    console.error('Error sending print request:', error);
  });

This example uses the fetch() function to send a POST request with the JSON payload to the /print endpoint of the server. You can adjust the values in the payload variable to match your desired data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment