[
Autor de escpos-php aquí.
Si sus impresoras son compatibles con ESC/POS (la mayoría de las impresoras térmicas de recibos parecen usar un subconjunto), entonces creo que el controlador es adecuado para su caso de uso: USB o impresión en red, logotipo, cualquier formato. Algunas de estas son adiciones relativamente recientes.
impresión USB
escpos-php imprime en un puntero de archivo. En Linux, puede usar el archivo para hacer que la impresora USB sea visible como un archivo usblp
conductor, y luego solo fopen()
it (Ejemplo de recibo USB, publicación de blog sobre la instalación de una impresora USB en Linux).
Por lo tanto, imprimir «Hello World» en una impresora USB es solo un poco diferente de imprimir en una impresora de red:
<?php
require __DIR__ . '/vendor/autoload.php';
use Mike42EscposPrintConnectorsFilePrintConnector;
use Mike42EscposPrinter;
$connector = new FilePrintConnector("/dev/usb/lp0");
$printer = new Printer($connector);
$printer -> text("Hello World!n");
$printer -> cut();
$printer -> close();
O, de manera similar al código que está utilizando actualmente con éxito, puede escribir en un archivo temporal y copiarlo:
<?php
require __DIR__ . '/vendor/autoload.php';
use Mike42EscposPrintConnectorsFilePrintConnector;
use Mike42EscposPrinter;
/* Open file */
$tmpdir = sys_get_temp_dir();
$file = tempnam($tmpdir, 'ctk');
/* Do some printing */
$connector = new FilePrintConnector($file);
$printer = new Printer($connector);
$printer -> text("Hello World!n");
$printer -> cut();
$printer -> close();
/* Copy it over to the printer */
copy($file, "//localhost/KoTickets");
unlink($file);
Entonces, en su sistema POS, necesita una función que devuelva un puntero de archivo basado en la configuración de su cliente y el destino preferido. Las impresoras de recibos son bastante receptivas, pero si tiene algunos iPad que están cumpliendo con los pedidos, considere encerrar las operaciones para cada impresora con un bloqueo de archivo (rebaño()) para evitar problemas relacionados con la concurrencia.
También tenga en cuenta que la compatibilidad con USB no se ha probado en Windows.
logotipo y formato
Una vez que descubra cómo desea comunicarse con la impresora, puede usar el conjunto completo de comandos de imagen y formato.
Se puede imprimir un logotipo desde un archivo PNG de la siguiente manera:
use Mike42EscposEscposImage;
$logo = EscposImage::load("foo.png");
$printer -> graphics($logo);
Y para formatear, el README.md y el ejemplo a continuación deberían ayudarlo a comenzar. Para la mayoría de los recibos, todo lo que necesita es:
selectPrintMode()
para cambiar los tamaños de fuente.setEmphasis()
alternar negrita.setJustification()
para alinear a la izquierda o centrar texto o imágenes.cut()
después de cada recibo.
También sugeriría que, en el lugar donde se encuentre actualmente, use un ejemplo que dibuje cuadros como este:
=========
| |
=========
Puede utilizar los caracteres de la página de códigos 437 de IBM diseñados para dibujar cuadros admitidos por muchas impresoras, simplemente incluya los caracteres 0xB3 a 0xDA en la salida. No son perfectos, pero parece mucho menos «texto».
$box = "xda".str_repeat("xc4", 10)."xbfn";
$box .= "xb3".str_repeat(" ", 10)."xb3n";
$box .= "xc0".str_repeat("xc4", 10)."xd9n";
$printer -> textRaw($box);
ejemplo completo
El siguiente ejemplo ahora también está incluido en el controlador. Creo que parece un formato de recibo de venta bastante típico y podría modificarse fácilmente para adaptarse al entorno de su cocina.
Salida escaneada:
Código fuente de PHP para generar:
<?php
require __DIR__ . '/vendor/autoload.php';
use Mike42EscposPrinter;
use Mike42EscposEscposImage;
use Mike42EscposPrintConnectorsFilePrintConnector;
/* Open the printer; this will change depending on how it is connected */
$connector = new FilePrintConnector("/dev/usb/lp0");
$printer = new Printer($connector);
/* Information for the receipt */
$items = array(
new item("Example item #1", "4.00"),
new item("Another thing", "3.50"),
new item("Something else", "1.00"),
new item("A final item", "4.45"),
);
$subtotal = new item('Subtotal', '12.95');
$tax = new item('A local tax', '1.30');
$total = new item('Total', '14.25', true);
/* Date is kept the same for testing */
// $date = date('l jS of F Y h:i:s A');
$date = "Monday 6th of April 2015 02:56:25 PM";
/* Start the printer */
$logo = EscposImage::load("resources/escpos-php.png", false);
$printer = new Printer($connector);
/* Print top logo */
$printer -> setJustification(Printer::JUSTIFY_CENTER);
$printer -> graphics($logo);
/* Name of shop */
$printer -> selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
$printer -> text("ExampleMart Ltd.n");
$printer -> selectPrintMode();
$printer -> text("Shop No. 42.n");
$printer -> feed();
/* Title of receipt */
$printer -> setEmphasis(true);
$printer -> text("SALES INVOICEn");
$printer -> setEmphasis(false);
/* Items */
$printer -> setJustification(Printer::JUSTIFY_LEFT);
$printer -> setEmphasis(true);
$printer -> text(new item('', '$'));
$printer -> setEmphasis(false);
foreach ($items as $item) {
$printer -> text($item);
}
$printer -> setEmphasis(true);
$printer -> text($subtotal);
$printer -> setEmphasis(false);
$printer -> feed();
/* Tax and total */
$printer -> text($tax);
$printer -> selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
$printer -> text($total);
$printer -> selectPrintMode();
/* Footer */
$printer -> feed(2);
$printer ->...