Most thermal receipt printers are controlled using the ESC/POS protocol. This is a standard set of control codes to control font size and style, print images and barcodes, etc. (though not all printers support all features — some testing is generally required). The escpos-php library is a fantastic piece of software which wraps this protocol in an easy-to-use set of PHP classes.

Installing the escpos-php library is fairly easy, however it uses the composer dependency manager which I was previously unfamiliar with.

These are the steps I took to install escpos-php on my Linux server VM and print using my thermal receipt printer:

Install composer:

sudo apt install composer

Install the php-intl module:

sudo apt-get install php-intl
sudo service apache2 restart

Create a folder for escpos-php in your web directory, then install it:

mkdir /var/www/_escpos
cd /var/www/_escpos
composer require mike42/escpos-php

Create a PHP file printerTest.php in a suitable location:

require_once ('/var/www/_escpos/vendor/autoload.php');
use Mike42\Escpos\Printer;
use Mike42\Escpos\PrintConnectors\FilePrintConnector;

$connector = new FilePrintConnector ('php://stdout');
$printer = new Printer ($connector);

$printer->initialize();
$printer->text ("test\n");
$printer->close();

This PHP file will output the binary control codes to stdout. We run the program and pipe the output to our printer as follows:

php printerTest.php | lp -s -d THERMALPRINTER

In theory, we could use a CupsPrintConnector instead of the FilePrintConnector which would save us the step of redirecting the output. However, in my (very brief) test, the output seems to go into a print queue and must be manually released before it will print. This may have been a one-time hiccup or there may be a workaround, but using the FilePrintConnector avoided the issue and suits my needs for now.