Imprime desde la web a impresoras térmicas usando t2bprinter.js.
La API de Text2 Barcode permite listar impresoras, detectar la predeterminada, filtrar por nombre y enviar comandos de impresión (ZPL, ESC/POS, TSPL). También puede convertir imágenes/PDF a formatos de impresión.
t2bprinter.js en el navegador. Esta se encarga de encontrar y
enviar datos a la impresora (USB/Bluetooth/Driver/Red) a través del conector compatible.
https://labeldictate.com/text2barcode/lib/t2bprinter.js.Incluye la librería y llama a los métodos:
<script src="https://labeldictate.com/text2barcode/lib/t2bprinter.js"></script>
T2bPrinter expone propiedades de configuración que puedes sobreescribir antes de llamar a cualquier método. Todas tienen valores por defecto funcionales.
// Habilitar logs de depuración en consola
T2bPrinter.enableDebug = true;
false)true, la librería imprime en console.debug / console.warn detalles de cada solicitud HTTP (URL, opciones y errores de reconexión).
Útil durante el desarrollo para diagnosticar problemas de conectividad.
9100)useSecureConnection es false o cuando la conexión segura falla y la librería reintenta con HTTP plano.
9101)useSecureConnection es true. Las solicitudes se realizan sobre HTTPS hacia 127.0.0.1.
true)securePort) o HTTP (defaultPort).
La librería tiene un mecanismo de fallback automático: si la petición segura falla, reintenta automáticamente con HTTP en el puerto no seguro y actualiza esta propiedad a false para las siguientes llamadas.
La mayoría de los métodos de T2bPrinter devuelven objetos de tipo Printer.
type Printer = {
"uid": string;
"name": string;
"manufacturer": string;
"connection": "driver" | "bluetooth" | "network" | "ttb";
"deviceType": string;
"version": number;
};
driver: Controlador específico (Windows/macOS).bluetooth: Conexión Bluetooth (Android/iOS).network: Conexión de red (IP/host).ttb: Conexión a través de Text2Barcode.printer).Verifica si el servidor de Text2 Barcode está en ejecución y accesible desde el navegador.
No recibe parámetros. Realiza una petición GET / al servidor local. Devuelve true si el servidor responde correctamente, o false si no está disponible — nunca lanza una excepción.
false.
const running = await T2bPrinter.isAvailable();
if (running) {
console.log("Text2 Barcode está disponible ✓");
} else {
console.warn("Text2 Barcode no está disponible. ¿Está instalado y en ejecución?");
}
true // Servidor disponible:
flase // Servidor no disponible o no instalado:
Ejecuta T2bPrinter.isAvailable() y muestra si el servidor de Text2 Barcode responde en este equipo.
No requiere ningún parámetro. Nunca lanza error: devuelve true o false.
Lista todas las impresoras disponibles en el dispositivo.
No recibe parámetros. Devuelve un objeto con la clave printer que contiene un array de objetos Printer.
const available = await T2bPrinter.available();
for (const printer of (available.printer || [])) {
console.debug("printer", JSON.stringify(printer, null, 2));
}
{
"printer":[
{
"uid":"ZDesigner GK420t Plus (ZPL)",
"name":"ZDesigner GK420t Plus (ZPL)",
"manufacturer":"Zebra Technologies",
"connection":"driver",
"deviceType":"printer",
"version":4
},
{ ... }
]
}
Ejecuta T2bPrinter.available() y muestra la lista completa de impresoras detectadas en este dispositivo.
No requiere ningún parámetro.
Obtiene la impresora predeterminada del dispositivo.
No recibe parámetros. Devuelve un único objeto Printer correspondiente a la impresora marcada como predeterminada en el sistema operativo.
const printer = await T2bPrinter.default();
console.debug("defaultPrinter:", JSON.stringify(printer, null, 2));
{
"uid":"ZDesigner GK420t Plus (ZPL)",
"name":"ZDesigner GK420t Plus (ZPL)",
"manufacturer":"Zebra Technologies",
"connection":"driver",
"deviceType":"printer",
"version":4
}
Ejecuta T2bPrinter.default() y retorna el objeto Printer de la impresora predeterminada del sistema.
No requiere ningún parámetro.
Devuelve todas las impresoras que cumplen un criterio (predicado).
Printer y debe retornar true para incluirlo en el resultado.const printers = await T2bPrinter.filter(it => it.name.includes("ZPL"));
console.debug("printers:", JSON.stringify(printers, null, 2));
[
{
"uid":"ZDesigner GK420t Plus (ZPL)",
"name":"ZDesigner GK420t Plus (ZPL)",
"manufacturer":"Zebra Technologies",
"connection":"driver",
"deviceType":"printer",
"version":4
},
{ ... }
]
Filtra las impresoras disponibles según el texto ingresado. Se busca coincidencia parcial (case-insensitive) en el campo name de cada Printer.
it.name.toLowerCase().includes(texto)Devuelve la primera impresora que cumple un criterio.
Printer y debe retornar true para seleccionarlo. Si ninguna impresora cumple el criterio, retorna null.const printer = await T2bPrinter.find(it => it.name === "Zebra GK420d");
// o por uid: await T2bPrinter.find(it => it.uid === "ZDesigner GK420t Plus (ZPL)");
console.debug("printer:", JSON.stringify(printer, null, 2));
{
"uid":"ZDesigner GK420t Plus (ZPL)",
"name":"ZDesigner GK420t Plus (ZPL)",
"manufacturer":"Zebra Technologies",
"connection":"driver",
"deviceType":"printer",
"version":4
}
Busca la primera impresora que coincida. Elige el campo y el valor para construir el predicado.
it.name === "…"Envía datos en texto plano (ZPL, ESC/POS, TSPL) directamente a una impresora. Internamente serializa el payload como Content-Type: text/plain con la estructura { device, data }.
Printer obtenido con find(), default(), filter(), etc. Debe incluir al menos uid, name y connection.^XA y ^XZ.<EscPos> y </EscPos>.{ "device": <Printer>, "data": "<string>" } — la propiedad device identifica la impresora y data contiene los comandos a imprimir.
const result = await T2bPrinter.write(printer, `
^XA
^PW609
^LL403
^PON
^CI28
^FO38,30^GB545,349,5^FS
^FO85,60^A0N,33,33^FH^FDZPL PRINT TEST - 3"^FS
^BY2,2,44^FO90,280^BCN,,Y,N
^FD123456789012^FS
^FO465,20^BQN,2,4
^FH\\^FDLA,123456789012^FS
^PQ1,0,1,Y
^XZ
`);
console.debug("write", JSON.stringify(result, null, 2));
{
"result": true,
"message": "messages"
}
Selecciona una impresora disponible y edita el contenido a enviar. El panel carga automáticamente las impresoras del dispositivo al abrirse.
Envía datos binarios directamente a la impresora sin conversión de texto. Internamente construye un FormData con dos campos: json (metadatos del dispositivo) y blob (los datos binarios).
Printer destino. Se serializa como JSON en el campo json del FormData.type recomendado es "application/octet-stream".json → JSON.stringify({ "device": <Printer> })blob → contenido binario del Blob
const zpl = '^XA^FO50,50^A0N,50,50^FDHello^FS^XZ';
const blob = new Blob([zpl], { type: "application/octet-stream" });
const result = await T2bPrinter.writeAsBlob(printer, blob);
console.debug("writeAsBlob", JSON.stringify(result, null, 2));
{
"result": true,
"message": "messages"
}
Escribe el contenido del campo de texto como un Blob de tipo application/octet-stream y lo envía a la impresora seleccionada.
application/octet-stream.
Convierte una imagen o PDF a ZPL/ESC-POS/TSPL y, opcionalmente, imprime o almacena el resultado. Internamente construye un FormData con los campos json (opciones) y blob (el archivo fuente).
File de un <input type="file"> o cualquier Blob. Se adjunta como campo blob en el FormData.json del FormData:
action ("print" | "store" | "return") — Acción tras convertir:"print": convierte e imprime directamente (requiere device)."return": devuelve el resultado en base64 sin imprimir."store": almacena el resultado en el servidor (usa storageName para nombrar el archivo).
storageName (string, opcional) — Nombre del archivo a guardar en el servidor cuando action es "store".fromFormat ("png" | "jpg" | "pdf") — Formato del archivo fuente (resource).toFormat ("zpl" | "esc-pos" | "tspl") — Formato destino de la conversión.resize ({ width?: number, height?: number }, opcional) — Redimensiona la imagen antes de convertir. Puedes especificar solo width o solo height; el otro lado se calcula proporcionalmente.dithering (string, opcional) — Algoritmo de dithering para la conversión a blanco/negro. Valores:
"FloydSteinbergDithering" — Difusión de error Floyd-Steinberg (recomendado para fotografías)."AtkinsonDithering" — Algoritmo Atkinson, genera patrones más compactos."NoDithering" — Sin dithering, umbral simple.action es "print") — Objeto Printer destino.json → JSON.stringify(payload)blob → contenido del archivo resource
const fileInput = document.querySelector('#file');
const resource = fileInput.files[0]; // File / Blob
const payload = {
options: {
action: "print", // "print" | "return" | "store"
storageName: "mi-etiqueta.zpl", // solo si action === "store"
fromFormat: "png", // "png" | "jpg" | "pdf"
toFormat: "zpl", // "zpl" | "esc-pos" | "tspl"
resize: { width: 600 }, // redimensionar antes de convertir
dithering: "FloydSteinbergDithering" // "FloydSteinbergDithering" | "AtkinsonDithering" | "NoDithering"
},
device: { // requerido si action === "print"
uid: "ZDesigner GK420t Plus (ZPL)",
name: "ZDesigner GK420t Plus (ZPL)",
manufacturer: "Zebra Technologies",
connection: "driver",
deviceType: "printer",
version: 4
}
};
const result = await T2bPrinter.convert(resource, payload);
console.debug("converted", JSON.stringify(result, null, 2));
{
"data": "base64-encoded ZPL or format",
"width": 600,
"height": 400,
"filename": "converted.zpl"
}
Selecciona un archivo imagen o PDF y configura las opciones de conversión. Si action es "print", también debes elegir la impresora destino.
Ejemplo mínimo para imprimir una etiqueta ZPL buscando por name:
<!DOCTYPE html>
<html>
<head>
<script src="https://labeldictate.com/text2barcode/lib/t2bprinter.js"></script>
<script>
const printLabel = async () => {
const printerName = "Zebra GK420d";
const labelContent = `
^XA
^PW609
^LL403
^PON
^CI28
^FO85,60^A0N,33,33^FH^FDZPL PRINT TEST - 3"^FS
^BY2,2,44^FO90,280^BCN,,Y,N
^FD123456789012^FS
^FO465,20^BQN,2,4
^FH\\^FDLA,123456789012^FS
^PQ1,0,1,Y
^XZ
`;
try {
const printer = await T2bPrinter.find(it => it.name === printerName);
if (printer) {
const res = await T2bPrinter.write(printer, labelContent);
alert(JSON.stringify(res, null, 2));
} else {
alert(\`Printer "${printerName}" not found.\`);
}
} catch (err) {
alert(err);
}
};
window.onload = printLabel;
</script>
</head>
<body></body>
</html>
Ejemplo mínimo para imprimir en ESC/POS:
<!DOCTYPE html>
<html>
<head>
<script src="https://labeldictate.com/text2barcode/lib/t2bprinter.js"></script>
<script>
const printLabel = async () => {
const printerName = "Bixolon SRP-330II";
const labelContent = `
<EscPos>
<Init/>
<QrCode justification="right">QR Test Text</QrCode>
<Feed lines="1"/>
<BarCode>1234567890</BarCode>
<Feed lines="1"/>
<Text fontWidth="3" fontHeight="3">Large Text</Text>
<Text fontWidth="2" fontHeight="2">Medium Text</Text>
<Text fontWidth="1" fontHeight="1">Small Text</Text>
<Feed lines="1"/>
<Text justification="left">Left</Text>
<Text justification="center">Center</Text>
<Text justification="right">Right</Text>
<Feed lines="1"/>
<Text underline="one-dot-thick">Underline</Text>
<Text bold="true">Bold</Text>
<Text inverse="true">Inverted</Text>
<Feed lines="3" />
<Cut mode="full" />
</EscPos>
`;
try {
const printer = await T2bPrinter.find(it => it.name === printerName);
if (printer) {
const res = await T2bPrinter.write(printer, labelContent);
alert(JSON.stringify(res, null, 2));
} else {
alert(\`Printer "${printerName}" not found.\`);
}
} catch (err) {
alert(err);
}
};
window.onload = printLabel;
</script>
</head>
<body></body>
</html>
available() para listar y copia el name real o filtra por uid.^CI28 en ZPL o las banderas correctas en ESC/POS para charset/UTF-8.write.