1<!doctype html><html lang=es dir=auto><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="index, follow"><title>Diseñador para impresoras térmicas - Gratuito y open source | Parzibyte</title><meta name=keywords content="android,aplicacion,bluetooth,creador,disenador,esc-pos-es,factura,generador,impresora,impresora-termica,imprimir,linux,multiplataforma,pos-printer-es,pwa,raspberry-pi,recibo,thermal-printer-es,ticket,usb,web,windows"><meta name=description content="En estos últimos meses he estado trabajando en un diseñador de tickets para imprimir en impresoras térmicas usando los comandos ESC POS. 2El diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y cualquier otro diseño para imprimir en impresoras térmicas. 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37Si quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: https://parzibyte.me/apps/ticket-designer/#/first-steps 38Vas a poder imprimir imágenes, texto con formato, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS. 39Esto funcionará con impresoras USB sobre Windows, Linux y Raspberry; además de impresoras Bluetooth en Android. Todo usando el mismo diseñador de recibos ESC POS."><meta name=author content="Parzibyte"><link rel=canonical href=https://parzibyte.me/blog/posts/disenador-impresoras-termicas-gratuito-open-source/><link crossorigin=anonymous href=/blog/assets/css/stylesheet.8fe10233a706bc87f2e08b3cf97b8bd4c0a80f10675a143675d59212121037c0.css integrity="sha256-j+ECM6cGvIfy4Is8+XuL1MCoDxBnWhQ2ddWSEhIQN8A=" rel="preload stylesheet" as=style><link rel=icon href=https://parzibyte.me/blog/favicon.ico><link rel=icon type=image/png sizes=16x16 href=https://parzibyte.me/blog/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://parzibyte.me/blog/favicon-32x32.png><link rel=apple-touch-icon href=https://parzibyte.me/blog/apple-touch-icon.png><link rel=mask-icon href=https://parzibyte.me/blog/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate hreflang=es href=https://parzibyte.me/blog/posts/disenador-impresoras-termicas-gratuito-open-source/><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript>
39<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4859317680104877" crossorigin=anonymous></script>
vendor: 63 bytes, line 39
39<script async src="https://www.googletagmanager.com/gtag/js?id=
39G-ZE4YV8W64J
vendor: 11 bytes, line 39
39"></script>
39<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag("js",new Date),gtag("config","G-ZE4YV8W64J")</script>
39<link rel=stylesheet href=/blog/css/styles.min.7599211aa9896a1105a594e5afc305bd24710a1a66c0ceb70e776fb3b9916ef8.css><meta property="og:url" content="https://parzibyte.me/blog/posts/disenador-impresoras-termicas-gratuito-open-source/"><meta property="og:site_name" content="Parzibyte"><meta property="og:title" content="Diseñador para impresoras térmicas - Gratuito y open source"><meta property="og:description" content="En estos últimos meses he estado trabajando en un diseñador de tickets para imprimir en impresoras térmicas usando los comandos ESC POS. 40El diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y cualquier otro diseño para imprimir en impresoras térmicas. 41Si quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: https://parzibyte.me/apps/ticket-designer/#/first-steps 42Vas a poder imprimir imágenes, texto con formato, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS. 43Esto funcionará con impresoras USB sobre Windows, Linux y Raspberry; además de impresoras Bluetooth en Android. Todo usando el mismo diseñador de recibos ESC POS."><meta property="og:locale" content="es"><meta property="og:type" content="article"><meta property="article:section" content="posts"><meta property="article:published_time" content="2023-12-07T00:00:00+00:00"><meta property="article:modified_time" content="2023-12-07T00:00:00+00:00"><meta property="article:tag" content="Android"><meta property="article:tag" content="Aplicacion"><meta property="article:tag" content="Bluetooth"><meta property="article:tag" content="Creador"><meta property="article:tag" content="Disenador"><meta property="article:tag" content="Esc-Pos-Es"><meta name=twitter:card content="summary"><meta name=twitter:title content="Diseñador para impresoras térmicas - Gratuito y open source"><meta name=twitter:description content="En estos últimos meses he estado trabajando en un diseña
43dor de tickets para imprimir en impresoras térmicas usando los comandos ESC POS. 44El diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y cualquier otro diseño para imprimir en impresoras térmicas. 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79Si quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: https://parzibyte.me/apps/ticket-designer/#/first-steps 80Vas a poder imprimir imágenes, texto con formato, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS. 81Esto funcionará con impresoras USB sobre Windows, Linux y Raspberry; además de impresoras Bluetooth en Android. Todo usando el mismo diseñador de recibos ESC POS.">
81<script type=application/ld+json>{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Posts","item":"https://parzibyte.me/blog/posts/"},{"@type":"ListItem","position":2,"name":"Diseñador para impresoras térmicas - Gratuito y open source","item":"https://parzibyte.me/blog/posts/disenador-impresoras-termicas-gratuito-open-source/"}]}</script>
81<script type=application/ld+json>{"@context":"https://schema.org","@type":"BlogPosting","headline":"Diseñador para impresoras térmicas - Gratuito y open source","name":"Diseñador para impresoras térmicas - Gratuito y open source","description":"En estos últimos meses he estado trabajando en un diseñador de tickets para imprimir en impresoras térmicas usando los comandos ESC POS.\nEl diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y cualquier otro diseño para imprimir en impresoras térmicas.\nSi quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: https://parzibyte.me/apps/ticket-designer/#/first-steps\nVas a poder imprimir imágenes, texto con formato, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS.\nEsto funcionará con impresoras USB sobre Windows, Linux y Raspberry; además de impresoras Bluetooth en Android. Todo usando el mismo diseñador de recibos ESC POS.\n","keywords":["android","aplicacion","bluetooth","creador","disenador","esc-pos-es","factura","generador","impresora","impresora-termica","imprimir","linux","multiplataforma","pos-printer-es","pwa","raspberry-pi","recibo","thermal-printer-es","ticket","usb","web","windows"],"articleBody":"En estos últimos meses he estado trabajando en un diseña
81dor de tickets para imprimir en impresoras térmicas usando los comandos ESC POS.\nEl diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y cualquier otro diseño para imprimir en impresoras térmicas.\nSi quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: https://parzibyte.me/apps/ticket-designer/#/first-steps\nVas a poder imprimir imágenes, texto con formato, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS.\nEsto funcionará con impresoras USB sobre Windows, Linux y Raspberry; además de impresoras Bluetooth en Android. Todo usando el mismo diseñador de recibos ESC POS.\nCaracterÃsticas del diseñador Con el ESC POS ticket designer vas a poder:\nVer una guÃa completa de cómo configurar tu impresora y entorno para que sea compatible con el diseñador Exportar e importar operaciones, asà nunca perderás tus diseños Imprimir tus diseños en tu impresora térmica sin ningún lÃmite Crear varios diseños eligiendo la plataforma y la impresora Generar código fuente del diseño en distintos lenguajes de programación para imprimirlos de manera programada cuando asà lo requieras Elegir entre varias operaciones como código de barras, imagen, código QR, texto, corte, avance de papel, imagen de internet, imagen local, caracteres personalizados, texto con acentos, corte parcial, apertura del cajón, cambiar tamaño de fuente, subrayado, enfatizado, rotación de 90 grados, alineación o imprimir según una página de caracteres. Te repito que el diseñador es web y se puede instalar como una app nativa gracias a que es una PWA. Asà que debe funcionar en casi todos los entornos que cuenten con un navegador web actualizado.\nNota importante: si quieres más información sobre el diseñador o tienes dudas, te invito a revisar los vÃdeos que he grabado hablando sobre el software: https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL\nGuÃa de configuración Dentro del diseñador vas a encontrar una guÃa paso a paso que te dirá lo que tienes que hacer para configurar tu impresora térmica y descargar las herramientas necesarias según tu sistema operativo.\nComo puedes ver, es una guÃa paso a paso para instalar tu impresora, compartirla en donde sea necesario y finalmente realizar una prueba de impresión.\nSolo debes seguir la guÃa cuidadosamente una vez, y cuando consigas imprimir un recibo de prueba ya podrás diseñar tus tickets para imprimirlos en la impresora térmica más adelante.\nDiseños La parte principal es la lista de diseños. Ahà aparecerán todos los tickets que has creado con la opción de editar sus operaciones, sus datos (como la impresora térmica donde serán impresos), eliminarlos o imprimirlos directamente.\nTambién tendrán un indicador de la conexión exitosa con el plugin. Por ejemplo, en la siguiente captura todavÃa no he configurado mi impresora, asà que el diseñador me lo indica:\nEn este apartado podemos crear un nuevo diseño indicando su nombre y seleccionando la impresora, o podemos hacer clic en Operaciones de cualquier diseño para ir al módulo principal: las operaciones que se pueden hacer para nuestros diseños.\nDiseñando un ticket Al inicio, no habrá ninguna operación. Podremos elegir entre todas las operaciones disponibles:\nBasta con elegir una operación para agregarla al ticket, y desde que la agregamos los cambios se van a ir guardando automáticamente. Podemos imprimir para revisar nuestro diseño, y exportar o importar la lista de operaciones para tener un respaldo siempre.\nPor ejemplo, aquà tengo un diseño de un ticket de venta que hice usando el propio creador de recibos web y es el que pudiste ver impreso al inicio del post:\nTambién puedes fijarte que el estado de la conexión ahora es exitoso, pues ya estoy ejecutando el plugin.\nEn este caso te estoy enseñando solo algunas operaciones que puedes agregar a tus diseños para imprimir en tiqueteras, pero más adelante subiré vÃdeos explicando cada operación en profundidad: https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL\nNota: al menos en el escritorio, puedes arrastrar y soltar las operaciones para intercambiarlas de lugar.\nEjecutando en otros sistemas operativos He probado este diseñador de tickets para impresoras térmicas en varios lugares como en Raspberry Pi OS con Chromium, Android con Chrome, Windows 10 con Chrome, Windows 11 con Chrome y Linux con Firefox. Solo necesitas un navegador actualizado.\nPor ejemplo, aquà una captura del diseñador en Android. FÃjate en que la conexión también es exitosa:\nGenerador de código fuente Otra caracterÃstica muy importante del diseñador es que cuenta con un generador de código fuente a partir del diseño que estás haciendo. Con esto, puedes crear tu ticket y luego copiar el código fuente para imprimirlo de manera programada.\nPara ello, habilita el Modo desarrollador en Ajustes. Después, ve a las operaciones del diseño y elige tu lenguaje de programación a la derecha.\nLo he llevado tan lejos que incluso genera código para el lenguaje de programación C:\nPor ahora el diseñador de tickets genera código para ejecutarse en:\nAngular C# Curl C y C++ Dart Golang JavaScript Laravel PHP Python React Vue 3 Si te lo preguntas, el código que se genera a partir del diseño de la imagen es el siguiente:\n#include #include struct RespuestaHttp { char *datos; size_t size; }; size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) { // Esta función puede ser invocada varias veces por CURL. https://curl.se/libcurl/c/CURLOPT_WRITEFUNCTION.html size_t realsize = size * nmemb; struct RespuestaHttp *mem = (struct RespuestaHttp *)userp; mem-\u003edatos = malloc(realsize + 1); if (mem-\u003edatos == NULL) { printf(\"No se pudo asignar memoria\\n\"); return CURL_WRITEFUNC_ERROR; } memcpy(mem-\u003edatos, contents, realsize); mem-\u003esize = realsize; mem-\u003edatos[realsize] = 0; return realsize; } int main(void) { CURL *curl; CURLcode res; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if (!curl) { printf(\"No se pudo inicializar CURL\\n\"); return 0; } struct RespuestaHttp respuesta; respuesta.datos = NULL; respuesta.size = 0; curl_easy_setopt(curl, CURLOPT_URL, \"http://localhost:8000/imprimir\"); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, \"{\\\"nombreImpresora\\\":\\\"PT210\\\",\\\"serial\\\":\\\"\\\",\\\"o
81peraciones\\\":[{\\\"nombre\\\":\\\"EstablecerAlineacion\\\",\\\"argumentos\\\":[1]},{\\\"nombre\\\":\\\"ImprimirCodigoQr\\\",\\\"argumentos\\\":[\\\"https://parzibyte.me/blog/\\\",200,1,0]},{\\\"nombre\\\":\\\"EscribirTexto\\\",\\\"argumentos\\\":[\\\"https://parzibyte.me/blog/\\\\n\\\"]}]}\"); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)\u0026respuesta); res = curl_easy_perform(curl); if (res == CURLE_OK) { if (strcmp(respuesta.datos, \"true\\n\") == 0) { printf(\"Impreso correctamente\"); } else { printf(\"Error con el plugin: %s\", respuesta.datos); } } else { fprintf(stderr, \"Error en la petición: %s\\n\", curl_easy_strerror(res)); } free(respuesta.datos); curl_easy_cleanup(curl); curl_global_cleanup(); return 0; } Código fuente y descargas El código fuente del diseñador está en GitHub: https://github.com/parzibyte/esc-pos-ticket-designer\nPara el caso del diseñador en sÃ, es una aplicación totalmente web; no necesitas internet para usarla y todos los datos se guardan en tu computadora. Recomiendo instalarla como PWA para que sea todavÃa más rápida.\nEn caso de que se te haya olvidado, aquà puedes usar el diseñador de tickets para impresoras térmicas.\nConclusión Siempre quise hacer un creador de facturas para que cualquier persona con una impresora térmica pueda imprimir tickets sin ningún lÃmite, y al fin lo he creado.\nEs una herramienta que usa otra de las herramientas que yo he creado: mi plugin. Con esto, tanto usuarios como programadores pueden diseñar facturas para imprimir en POS printers de manera programada o usando la herramienta, revisando el código fuente generado.\nSu desarrollo ha sido largo y complejo, ya que además de la complejidad que representa hacer el diseñador que sea compatible con varios plugins utilicé tecnologÃas nuevas para mà como Vue 3, Tailwind y SQLite3 en la web con OPFS.\n","wordCount":"1199","inLanguage":"es","datePublished":"2023-12-07T00:00:00Z","dateModified":"2023-12-07T00:00:00Z","author":{"@type":"Person","name":"Parzibyte"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://parzibyte.me/blog/posts/disenador-impresoras-termicas-gratuito-open-source/"},"publisher":{"@type":"Organization","name":"Parzibyte","logo":{"@type":"ImageObject","url":"https://parzibyte.me/blog/favicon.ico"}}}</script>
81</head><body id=top>
81<script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script>
81<header class=header><nav class=nav><div class=logo><a href=https://parzibyte.me/blog/ accesskey=h title="Parzibyte (Alt + H)">Parzibyte</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)" aria-label="Toggle theme"> 82<svg id="moon" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg> 83<svg id="sun" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button><ul class=lang-switch><li>|</li><li><a href=https://parzibyte.me/blog/en/ title=English aria-label=English>En</a></li></ul></div></div><ul id=menu><li><a href=https://parzibyte.me/blog/categories/ title=CategorÃas><span>CategorÃas</span></a></li><li><a href=https://parzibyte.me/blog/tags/ title=Etiquetas><span>Etiquetas</span></a></li><li><a href=https://parzibyte.me/blog/pages/sistemas-gratuitos title="Mis apps"><span>Mis apps</span></a></li><li><a href=https://parzibyte.me/blog/pages/contacto title=Contacto>
83<span>Contacto</span></a></li></ul></nav></header><main class=main><article class=post-single><header class=post-header><div class=breadcrumbs><a href=https://parzibyte.me/blog/>Inicio</a> » <a href=https://parzibyte.me/blog/posts/>Posts</a></div><h1 class="post-title entry-hint-parent">Diseñador para impresoras térmicas - Gratuito y open source</h1><div class=post-meta><span title='2023-12-07 00:00:00 +0000 UTC'>diciembre 7, 2023</span> · 6 min · 1199 palabras · Parzibyte</div></header><div class=toc><details><summary accesskey=c title="(Alt + C)"><span class=details>Tabla de Contenidos</span></summary><div class=inner><nav id=TableOfContents><ul><li><a href=#caracterÃsticas-del-diseñador>CaracterÃsticas del diseñador</a></li><li><a href=#guÃa-de-configuración>GuÃa de configuración</a></li><li><a href=#diseños>Diseños</a></li><li><a href=#diseñando-un-ticket>Diseñando un ticket</a></li><li><a href=#ejecutando-en-otros-sistemas-operativos>Ejecutando en otros sistemas operativos</a></li><li><a href=#generador-de-código-fuente>Generador de código fuente</a></li><li><a href=#código-fuente-y-descargas>Código fuente y descargas</a></li><li><a href=#conclusión>Conclusión</a></li></ul></nav></div></details></div><div class=post-content><p>En estos últimos meses he estado trabajando en un <strong>diseñador de tickets para imprimir en impresoras térmicas</strong> usando los comandos ESC POS.</p><p>El diseñador gratuito es web y se puede usar para crear tus propios tickets, ya sea ticket de venta, factura de venta, recibo de compra y <strong>cualquier otro diseño</strong> para imprimir en impresoras térmicas.</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Ticket-de-venta-impreso-desde-disenador_hu_bdb908240b4acfc.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Ticket-de-venta-impreso-desde-disenador_hu_d0d4d19ff49bbb46.webp 576w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Ticket-de-venta-impreso-desde-disenador_hu_71cf614e075350fb.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Ticket-de-venta-impreso-desde-disenador_hu_d88469643d0f465d.jpg 576w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Ticket-de-venta-impreso-desde-disenador_hu_d88469643d0f465d.jpg alt="Ticket de venta impreso desde diseñador" width=576 height=1280 loading=lazy></picture><p>Si quieres puedes probarlo ya mismo con el enlace a continuación, pero te recomiendo revisar el contenido del post antes de probarlo: <a href=https://parzibyte.me/apps/ticket-designer/#/first-steps>https://parzibyte.me/apps/ticket-designer/#/first-steps</a></p><p>Vas a poder imprimir imágenes, <strong>texto con formato</strong>, tablas, códigos QR, códigos de barras, cortar el papel, avanzarlo, abrir el cajón y diseñar cualquier recibo para tu impresora POS.</p><p>Esto funcionará con impresoras <strong>USB</strong> sobre Windows, Linux y Raspberry; además de impresoras <strong>Bluetooth</strong> en Android. Todo usando el mismo diseñador de recibos ESC POS.</p><h2 id=caracterÃsticas-del-diseñador>CaracterÃsticas del diseñador<a hidden class=anchor aria-hidden=true href=#caracterÃsticas-del-diseñador>#</a></h2><p>Con el <strong>ESC POS ticket designer</strong> vas a poder:</p><ol><li>Ver una <strong>guÃa completa</strong> de cómo configurar tu impresora y entorno para que sea compatible con el diseñador</li><li>Exportar e importar operaciones, asà nunca perderás tus diseños</li><li>Imprimir tus diseños en tu impresora térmica sin ningún lÃmite</li><li>Crear varios diseños eligiendo la plataforma y la impresora</li><li>Generar <strong>código fuente del diseño en distintos lenguajes de programación</strong> para imprimirlos de manera programada cuando asà lo requieras</li><li>Elegir entre varias operaciones como <strong>código de barras</strong>, imagen, código <strong>QR</strong>, texto, corte, avance de papel, imagen de internet, imagen local, caracteres personalizados, <strong>texto con acentos</strong>, corte parcial, <strong>apertura del cajón</strong>, cambiar tamaño de fuente, subrayado, enfatizado, rotación de 90 grados, alineación o imprimir según una página de caracteres.</li></ol><p>Te repito que el diseñador es web y <strong>se puede instalar como una app nativa gracias a que es una PWA</strong>. Asà que debe funcionar en casi todos los entornos que cuenten con un navegador web actualizado.</p><blockquote><p><strong>Nota importante:</strong> si quieres más información sobre el diseñador o tienes dudas, te invito a revisar los vÃdeos que he grabado hablando sobre el software: <a href="https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL">https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL</a></p></blockquote><h2 id=guÃa-de-configuración>GuÃa de configuración<a hidden class=anchor aria-hidden=true href=#guÃa-de-configuración>#</a></h2><p>Dentro del diseñador vas a encontrar una guÃa paso a paso que te dirá lo que tienes que hacer para configurar tu impresora térmica y descargar las herramientas necesarias según tu sistema operativo.</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_ccdb9ff57ce4f988.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_b53ba0d75de49482.webp 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_e8d51fd9a7e9df.webp 800w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_a71
837289adde35180.webp 1000w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_5876251643150ec4.webp 1897w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_658bd3fb291861fc.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_9a1f30ae41f6fcf7.jpg 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_94dc78972138b5f1.jpg 800w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_32f28176aae7bd80.jpg 1000w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_1ee8b54179f4d8fa.jpg 1897w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Guia-de-configuracion-de-impresora-termica-Disenador-de-recibos_hu_1ee8b54179f4d8fa.jpg alt="GuÃa de configuración de impresora térmica - Diseñador de recibos" width=1897 height=922 loading=lazy></picture><p>Como puedes ver, es una guÃa paso a paso para instalar tu impresora, compartirla en donde sea necesario y finalmente realizar una prueba de impresión.</p><p>Solo <strong>debes seguir la guÃa cuidadosamente una vez</strong>, y cuando consigas imprimir un recibo de prueba ya podrás diseñar tus tickets para imprimirlos en la impresora térmica más adelante.</p><h2 id=diseños>Diseños<a hidden class=anchor aria-hidden=true href=#diseños>#</a></h2><p>La parte principal es la lista de diseños. Ahà aparecerán todos los tickets que has creado con la opción de editar sus operaciones, sus datos (como la impresora térmica donde serán impresos), eliminarlos o imprimirlos directamente.</p><p>También tendrán un <strong>indicador de la conexión exitosa con el plugin</strong>. Por ejemplo, en la siguiente captura todavÃa no he configurado mi impresora, asà que el diseñador me lo indica:</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Tickets-en-el-disenador-ESC-POS_hu_7bbea2b4fe92ffb1.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Tickets-en-el-disenador-ESC-POS_hu_aa471816c2348fc7.webp 592w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Tickets-en-el-disenador-ESC-POS_hu_159187f8db4a787d.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Tickets-en-el-disenador-ESC-POS_hu_44537619fc6c13e8.jpg 592w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Tickets-en-el-disenador-ESC-POS_hu_44537619fc6c13e8.jpg alt="Tickets en el diseñador ESC POS" width=592 height=698 loading=lazy></picture><p>En este apartado podemos crear un nuevo diseño indicando su nombre y seleccionando la impresora, o podemos hacer clic en <strong>Operaciones</strong> de cualquier diseño para ir al módulo principal: las operaciones que se pueden hacer para nuestros diseños.</p><h2 id=diseñando-un-ticket>Diseñando un ticket<a hidden class=anchor aria-hidden=true href=#diseñando-un-ticket>#</a></h2><p>Al inicio, no habrá ninguna operación. Podremos elegir entre todas las operaciones disponibles:</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_cd9938dce11f039c.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_d02cb9f4e472087c.webp 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_ff62fd17bc6edb2c.webp 720w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_9fe238923793781f.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_c91fbf8a1f39eff5.jpg 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_39b54553b094c1c4.jpg 720w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Operaciones-del-diseno-Elegir-operacion-para-ticket_hu_39b54553b094c1c4.jpg alt="Operaciones del diseño - Elegir operación para ticket" width=720 height=960 loading=lazy></picture><p>Basta con elegir una operación para agregarla al ticket, y desde que la agregamos <strong>los cambios se van a ir guardando automáticamente</strong>. Podemos imprimir para revisar nuestro diseño, y exportar o importar la lista de operaciones para tener un respaldo siempre.</p><p>Por ejemplo, aquà tengo un <strong>diseño de un ticket de venta que hice usando el propio creador de recibos web</strong> y es el que pudiste ver impreso al inicio del post:</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_efe1bffb9d2e1985.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_1840d88cf57a0ddf.webp 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_41c77a80531b53f5.webp 720w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_c6e28b6c4e982304.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_f0e9db7b83bcf000.jpg 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_8f7d207453f5121b.jpg 720w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Recibo-de-venta-creado-con-el-disenador-de-tickets-online_hu_8f7d207453f5121b.jpg alt="Recibo de venta creado con el diseñador de tickets online" width=720 height=1036 loading=lazy></picture><p>También puedes fijarte que el estado de la conexión ahora es exitoso, pues ya estoy ejecutando el plugin.</p><p>En este caso te estoy enseñando solo algunas operaciones que puedes agregar a tus diseños para imprimir en tiqueteras, pero más adelante subiré vÃdeos <strong>explicando cada operación en profundidad</strong>: <a href="https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL">https://www.youtube.com/playlist?list=PLat1rFhO_zZiFR2CdNJWkcCcRKO0sYQVL</a></p><p><strong>Nota:</strong> al menos en el escritorio, puedes arrastrar y soltar las operaciones para intercambiarlas de lugar.</p><h2 id=ejecutando-en-otros-sistemas-operativos>Ejecutando en otros sistemas operativos<a hidden class=anchor aria-hidden=true href=#ejecutando-en-otros-sistemas-operativos>#</a></h2><p>He probado este diseñador de tickets para impresoras térmicas en varios lugares como en Raspberry Pi OS con Chromium, Android con Chrome, Windows 10 con Chrome, Windows 11 con Chrome y Linux con Firefox. Solo <strong>necesitas un navegador actualizado</strong>.</p><p>Por ejemplo, aquà una captura del <strong>diseñador en Android</strong>. FÃjate en que la conexión también es exitosa:</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Disenando-ticket-para-impresora-termica-en-Android_hu_495bdf012209a7a8.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Disenando-ticket-para-impresora-termica-en-Android_hu_551248b0451fee68.webp 576w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Disenando-ticket-para-impresora-termica-en-Android_hu_e5060b436d36613a.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Disenando-ticket-para-impresora-termica-en-Android_hu_dd01be25425dd89b.jpg 576w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Disenando-ticket-para-impresora-termica-en-Android_hu_dd01be25425dd89b.jpg alt="Diseñando ticket para impresora térmica en Android" width=576 height=1280 loading=lazy></picture><h2 id=generador-de-código-fuente>Generador de código fuente<a hidden class=anchor aria-hidden=true href=#generador-de-código-fuente>#</a></h2><p>Otra caracterÃstica muy importante del diseñador es que cuenta con un <strong>generador de código fuente a partir del diseño</strong> que estás haciendo. Con esto, puedes crear tu ticket y luego copiar el código fuente para imprimirlo de manera programada.</p><p>Para ello, habilita el <strong>Modo desarrollador</strong> en <strong>Ajustes</strong>. Después, ve a las operaciones del diseño y elige tu lenguaje de programación a la derecha.</p><p>Lo he llevado tan lejos que incluso genera código <strong>para el lenguaje de programación C</strong>:</p><picture><source type=image/webp srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_3cbf6f7015751159.webp 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_58fba1679f28bfc7.webp 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_a0f708ccf62ab127.webp 800w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_cb6f303f7bd004c1.webp 1000w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_4ddd5c89560aa37c.webp 1080w" sizes="(max-width: 768px) 91.25vw, 720px"><source type=image/jpeg srcset="/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_5469ceca9c568e69.jpg 320w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_fdbd1c6d70d3487d.jpg 600w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_215752ad6df75a46.jpg 800w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_cd6d117525c108e3.jpg 1000w, /blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_2a0e9fe0303a3bdb.jpg 1080w" sizes="(max-width: 768px) 91.25vw, 720px"><img src=/blog/posts/disenador-impresoras-termicas-gratuito-open-source/Generando-codigo-fuente-a-partir-de-diseno-para-impresora-termica-Lenguaje-ANSI-C_hu_2a0e9fe0303a3bdb.jpg alt="Generando código fuente a partir de diseño para impresora térmica - Lenguaje ANSI C" width=1080 height=750 loading=lazy></picture><p>Por ahora el diseñador de tickets genera código para ejecutarse en:</p><ul><li>Angular</li><li>C#</li><li>Curl</li><li>C y C++</li><li>Dart</li><li>Golang</li><li>JavaScript</li><li>Laravel</li><li>PHP</li><li>Python</li><li>React</li><li>Vue 3</li></ul><p>Si te lo preguntas, el código que se genera a partir del diseño de la imagen es el siguiente:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-c data-lang=c><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e><stdio.h></span><span style=color:#75715e> 84</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e><curl/curl.h></span><span style=color:#75715e> 85</span></span></span><span style=display:flex><span><span style=color:#75715e></span> 86</span></span><span style=display:flex><span><span style=color:#66d9ef>struct</span> RespuestaHttp 87</span></span><span style=display:flex><span>{ 88</span></span><span style=display:flex><span> <span style=color:#66d9ef>char</span> <span style=color:#f92672>*</span>datos; 89</span></span><span style=display:flex><span> <span style=color:#66d9ef>
89size_t</span> size; 90</span></span><span style=display:flex><span>}; 91</span></span><span style=display:flex><span> 92</span></span><span style=display:flex><span><span style=color:#66d9ef>size_t</span> <span style=color:#a6e22e>write_callback</span>(<span style=color:#66d9ef>void</span> <span style=color:#f92672>*</span>contents, <span style=color:#66d9ef>size_t</span> size, <span style=color:#66d9ef>size_t</span> nmemb, <span style=color:#66d9ef>void</span> <span style=color:#f92672>*</span>userp) 93</span></span><span style=display:flex><span>{ 94</span></span><span style=display:flex><span> <span style=color:#75715e>// Esta función puede ser invocada varias veces por CURL. https://curl.se/libcurl/c/CURLOPT_WRITEFUNCTION.html 95</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>size_t</span> realsize <span style=color:#f92672>=</span> size <span style=color:#f92672>*</span> nmemb; 96</span></span><span style=display:flex><span> <span style=color:#66d9ef>struct</span> RespuestaHttp <span style=color:#f92672>*</span>mem <span style=color:#f92672>=</span> (<span style=color:#66d9ef>struct</span> RespuestaHttp <span style=color:#f92672>*</span>)userp; 97</span></span><span style=display:flex><span> mem<span style=color:#f92672>-></span>datos <span style=color:#f92672>=</span> <span style=color:#a6e22e>malloc</span>(realsize <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>); 98</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (mem<span style=color:#f92672>-></span>datos <span style=color:#f92672>==</span> NULL) 99</span></span><span style=display:flex><span> { 100</span></span><span style=display:flex><span> <span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"No se pudo asignar memoria</span><span style=color:#ae81ff>\n</span><span style=color:#e6db74>"</span>); 101</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> CURL_WRITEFUNC_ERROR; 102</span></span><span style=display:flex><span> } 103</span></span><span style=display:flex><span> <span style=color:#a6e22e>memcpy</span>(mem<span style=color:#f92672>-></span>datos, contents, realsize); 104</span></span><span style=display:flex><span> mem<span style=color:#f92672>-></span>size <span style=color:#f92672>=</span> realsize; 105</span></span><span style=display:flex><span> mem<span style=color:#f92672>-></span>datos[realsize] <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>; 106</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> realsize; 107</span></span><span style=display:flex><span>} 108</span></span><span style=display:flex><span> 109</span></span><span style=display:flex><span><span style=color:#66d9ef>int</span> <span style=color:#a6e22e>main</span>(<span style=color:#66d9ef>void</span>) 110</span></span><span style=display:flex><span>{ 111</span></span><span style=display:flex><span> CURL <span style=color:#f92672>*</span>curl; 112</span></span><span style=display:flex><span> CURLcode res; 113</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_global_init</span>(CURL_GLOBAL_DEFAULT); 114</span></span><span style=display:flex><span> 115</span></span><span style=display:flex><span> curl <span style=color:#f92672>=</span> <span style=color:#a6e22e>curl_easy_init</span>(); 116</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (<span style=color:#f92672>!</span>curl) 117</span></span><span style=display:flex><span> { 118</span></span><span style=display:flex><span> <span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"No se pudo inicializar CURL</span><span style=color:#ae81ff>\n</span><span style=color:#e6db74>"</span>); 119</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>; 120</span></span><span style=display:flex><span> } 121</span></span><span style=display:flex><span> <span style=color:#66d9ef>struct</span> RespuestaHttp respuesta; 122</span></span><span style=display:flex><span> respuesta.datos <span style=color:#f92672>=</span> NULL; 123</span></span><span style=display:flex><span> respuesta.size <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>; 124</span></span><span style=display:flex><span> <span style=color:#a6e22e>
124curl_easy_setopt</span>(curl, CURLOPT_URL, <span style=color:#e6db74>"http://localhost:8000/imprimir"</span>); 125</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_easy_setopt</span>(curl, CURLOPT_POST, <span style=color:#ae81ff>1L</span>); 126</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_easy_setopt</span>(curl, CURLOPT_POSTFIELDS, <span style=color:#e6db74>"{</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>nombreImpresora</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>PT210</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>,</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>serial</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:</span><span style=color:#ae81ff>\"\"</span><span style=color:#e6db74>,</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>operaciones</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:[{</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>nombre</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>EstablecerAlineacion</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>,</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>argumentos</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:[1]},{</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>nombre</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>ImprimirCodigoQr</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>,</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>argumentos</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:[</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>https://parzibyte.me/blog/</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>,200,1,0]},{</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>nombre</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>EscribirTexto</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>,</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>argumentos</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>:[</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>https://parzibyte.me/blog/</span><span style=color:#ae81ff>\\</span><span style=color:#e6db74>n</span><span style=color:#ae81ff>\"</span><span style=color:#e6db74>]}]}"</span>); 127</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_easy_setopt</span>(curl, CURLOPT_WRITEFUNCTION, write_callback); 128</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_easy_setopt</span>(curl, CURLOPT_WRITEDATA, (<span style=color:#66d9ef>void</span> <span style=color:#f92672>*</span>)<span style=color:#f92672>&</span>respuesta); 129</span></span><span style=display:flex><span> res <span style=color:#f92672>=</span> <span style=color:#a6e22e>curl_easy_perform</span>(curl); 130</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (res <span style=color:#f92672>==</span> CURLE_OK) 131</span></span><span style=display:flex><span> { 132</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (<span style=color:#a6e22e>strcmp</span>(respuesta.datos, <span style=color:#e6db74>"true</span><span style=color:#ae81ff>\n</span><span style=color:#e6db74>"</span>) <span style=color:#f92672>==</span> <span style=color:#ae81ff>0</span>) 133</span></span><span style=display:flex><span> { 134</span></span><span style=display:flex><span> <span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"Impreso correctamente"</span>); 135</span></span><span style=display:flex><span> } 136</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span> 137</span></span><span style=display:flex><span> { 138</span></span><span style=display:flex><span> <span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>"Error con el plugin: %s"</span>, respuesta.datos); 139</span></span><span style=display:flex><span> } 140</span></span><span style=display:flex><span> } 141</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span> 142</span></span><span style=display:flex><span> { 143</span></span><span style=display:flex><span> <span style=color:#a6e22e>fprintf</span>(stderr, <span style=color:#e6db74>"Error en la petición: %s</span><span style=color:#ae81ff>\n</span><span style=color:#e6db74>"</span>, <span style=color:#a6e22e>curl_easy_strerror</span>(res)); 144</span></span><span style=display:flex><span> } 145</span></span><span style=display:flex><span> <span style=color:#a6e22e>free</span>(respuesta.datos); 146</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_easy_cleanup</span>(curl); 147</span></span><span style=display:flex><span> <span style=color:#a6e22e>curl_global_cleanup</span>(); 148</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> <span style=color:#ae81ff>0</span>; 149</span></span><span style=display:flex><span>} 150</span></span></code></pre></div><h2 id=código-fuente-y-descargas>Código fuente y descargas<a hidden class=anchor aria-hidden=true href=#código-fuente-y-descargas>#</a></h2><p>El código fuente del diseñador está en GitHub: <a href=https://github.com/parzibyte/esc-pos-ticket-designer>https://github.com/parzibyte/esc-pos-ticket-designer</a></p><p>Para el caso del diseñador en sÃ, es una aplicación totalmente web; no necesitas internet para usarla y todos los datos se guardan en tu computadora. <strong>Recomiendo instalarla como <a href=https://parzibyte.me/blog/posts/crear-publicar-progressive-web-app-convertir-app-web-pwa/>PWA</a></strong> para que sea todavÃa más rápida.</p><p>En caso de que se te haya olvidado, aquà puedes usar el <a href=https://parzibyte.me/apps/ticket-designer/#/first-steps>diseñador de tickets para impresoras térmicas</a>.</p><h2 id=conclusión>Conclusión<a hidden class=anchor aria-hidden=true href=#conclusión>#</a></h2><p>Siempre quise hacer un creador de facturas para que cualquier persona con una impresora térmica pueda imprimir tickets sin ningún lÃmite, y al fin lo he creado.</p><p>Es una herramienta que usa otra de las herramientas que yo he creado: mi plugin. Con esto, <strong>tanto usuarios como programadores pueden diseñar facturas para imprimir en POS printers</strong> de manera programada o usando la herramienta, revisando el código fuente generado.</p><p>Su desarrollo ha sido largo y complejo, ya que además de la complejidad que representa hacer el diseñador que sea compatible con varios plugins utilicé tecnologÃas nuevas para mà como Vue 3, Tailwind y <a href=https://parzibyte.me/blog/posts/sqlite3-javascript-puro-opfs-tutorial/>SQLite3 en la web con OPFS</a>.</p><div>Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya 151actualizado algún sistema o publicado un nuevo software. 152<a href=https://facebook.com/parzibyte.fanpage target=_blank>Facebook</a> 153| <a href=https://x.com/parzibyte target=_blank>X</a> 154| <a href=https://instagram.com/parzibyte target=_blank>Instagram</a> 155| <a href=https://t.me/parzibyte_channel target=_blank>Telegram</a> | 156También estoy a tus órdenes para cualquier <strong>contratación</strong> en <a href=https://parzibyte.me/#contacto target=_blank>mi página de contacto</a></div></div><footer class=post-footer>
156<ul class=post-tags><li><a href=https://parzibyte.me/blog/tags/android/>Android</a></li><li><a href=https://parzibyte.me/blog/tags/aplicacion/>Aplicacion</a></li><li><a href=https://parzibyte.me/blog/tags/bluetooth/>Bluetooth</a></li><li><a href=https://parzibyte.me/blog/tags/creador/>Creador</a></li><li><a href=https://parzibyte.me/blog/tags/disenador/>Disenador</a></li><li><a href=https://parzibyte.me/blog/tags/esc-pos-es/>Esc-Pos-Es</a></li><li><a href=https://parzibyte.me/blog/tags/factura/>Factura</a></li><li><a href=https://parzibyte.me/blog/tags/generador/>Generador</a></li><li><a href=https://parzibyte.me/blog/tags/impresora/>Impresora</a></li><li><a href=https://parzibyte.me/blog/tags/impresora-termica/>Impresora-Termica</a></li><li><a href=https://parzibyte.me/blog/tags/imprimir/>Imprimir</a></li><li><a href=https://parzibyte.me/blog/tags/linux/>Linux</a></li><li><a href=https://parzibyte.me/blog/tags/multiplataforma/>Multiplataforma</a></li><li><a href=https://parzibyte.me/blog/tags/pos-printer-es/>Pos-Printer-Es</a></li><li><a href=https://parzibyte.me/blog/tags/pwa/>Pwa</a></li><li><a href=https://parzibyte.me/blog/tags/raspberry-pi/>Raspberry-Pi</a></li><li><a href=https://parzibyte.me/blog/tags/recibo/>Recibo</a></li><li><a href=https://parzibyte.me/blog/tags/thermal-printer-es/>Thermal-Printer-Es</a></li><li><a href=https://parzibyte.me/blog/tags/ticket/>Ticket</a></li><li><a href=https://parzibyte.me/blog/tags/usb/>Usb</a></li><li><a href=https://parzibyte.me/blog/tags/web/>Web</a></li><li><a href=https://parzibyte.me/blog/tags/windows/>Windows</a></li></ul><nav class=paginav><a class=prev href=https://parzibyte.me/blog/posts/incluir-windows-h-gcc/><span class=title>« Anterior</span><br><span>Incluir windows.h con GCC</span> 157</a><a class=next href=https://parzibyte.me/blog/posts/calcular-edad-persona-javascript/><span class=title>Siguiente »</span><br><span>Calcular edad de una persona con JavaScript</span></a></nav><ul class=share-buttons><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on x" href="https://x.com/intent/tweet/?text=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source&url=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f&hashtags=android%2caplicacion%2cbluetooth%2ccreador%2cdisenador%2cesc-pos-es%2cfactura%2cgenerador%2cimpresora%2cimpresora-termica%2cimprimir%2clinux%2cmultiplataforma%2cpos-printer-es%2cpwa%2craspberry-pi%2crecibo%2cthermal-printer-es%2cticket%2cusb%2cweb%2cwindows"><svg viewBox="0 0 512 512" height="30" width="30" fill="currentColor"><path d="M512 62.554V449.446C512 483.97 483.97 512 449.446 512H62.554C28.03 512 0 483.97.0 449.446V62.554C0 28.03 28.029.0 62.554.0H449.446C483.971.0 512 28.03 512 62.554zM269.951 190.75 182.567 75.216H56L207.216 272.95 63.9 436.783h61.366L235.9 310.383l96.667 126.4H456L298.367 228.367l134-153.151H371.033zM127.633 110h36.468l219.38 290.065H349.5z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f&title=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source&summary=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source&source=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f"><svg viewBox="0 0 512 512" height="30" width="30" fill="currentColor"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM160.461 423.278V197.561h-75.04v225.717h75.04zm270.539.0V293.839c0-69.333-37.018-101.586-86.381-101.586-39.804.0-57.634 21.891-67.617 37.266v-31.958h-75.021c.995 21.181.0 225.717.0 225.717h75.02V297.222c0-6.748.486-13.492 2.474-18.315 5.414-13.475 17.767-27.434 38.494-27.434 27.135.0 38.007 20.707 38.007 51.037v120.768H431zM123.448 88.722C97.774 88.722 81 105.601 81 127.724c0 21.658 16.264 39.002 41.455 39.002h.484c26.165.0 42.452-17.344 42.452-39.002-.485-22.092-16.241-38.954-41.943-39.002z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on reddit" href="https://reddit.com/submit?url=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f&title=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source"><svg viewBox="0 0 512 512" height="30" width="30" fill="currentColor"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zM446 265.638c0-22.964-18.616-41.58-41.58-41.58-11.211.0-21.361 4.457-28.841 11.666-28.424-20.508-67.586-33.757-111.204-35.278l18.941-89.121 61.884 13.157c.756 15.734 13.642 28.29 29.56 28.29 16.407.0 29.706-13.299 29.706-29.701.0-16.403-13.299-29.702-29.706-29.702-11.
157666.0-21.657 6.792-26.515 16.578l-69.105-14.69c-1.922-.418-3.939-.042-5.585 1.036-1.658 1.073-2.811 2.761-3.224 4.686l-21.152 99.438c-44.258 1.228-84.046 14.494-112.837 35.232-7.468-7.164-17.589-11.591-28.757-11.591-22.965.0-41.585 18.616-41.585 41.58.0 16.896 10.095 31.41 24.568 37.918-.639 4.135-.99 8.328-.99 12.576.0 63.977 74.469 115.836 166.33 115.836s166.334-51.859 166.334-115.836c0-4.218-.347-8.387-.977-12.493 14.564-6.47 24.735-21.034 24.735-38.001zM326.526 373.831c-20.27 20.241-59.115 21.816-70.534 21.816-11.428.0-50.277-1.575-70.522-21.82-3.007-3.008-3.007-7.882.0-10.889 3.003-2.999 7.882-3.003 10.885.0 12.777 12.781 40.11 17.317 59.637 17.317 19.522.0 46.86-4.536 59.657-17.321 3.016-2.999 7.886-2.995 10.885.008 3.008 3.011 3.003 7.882-.008 10.889zm-5.23-48.781c-16.373.0-29.701-13.324-29.701-29.698.0-16.381 13.328-29.714 29.701-29.714 16.378.0 29.706 13.333 29.706 29.714.0 16.374-13.328 29.698-29.706 29.698zM160.91 295.348c0-16.381 13.328-29.71 29.714-29.71 16.369.0 29.689 13.329 29.689 29.71.0 16.373-13.32 29.693-29.689 29.693-16.386.0-29.714-13.32-29.714-29.693z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on facebook" href="https://facebook.com/sharer/sharer.php?u=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f"><svg viewBox="0 0 512 512" height="30" width="30" fill="currentColor"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H342.978V319.085h66.6l12.672-82.621h-79.272v-53.617c0-22.603 11.073-44.636 46.58-44.636H425.6v-70.34s-32.71-5.582-63.982-5.582c-65.288.0-107.96 39.569-107.96 111.204v62.971h-72.573v82.621h72.573V512h-191.104c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on whatsapp" href="https://api.whatsapp.com/send?text=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source%20-%20https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f"><svg viewBox="0 0 512 512" height="30" width="30" fill="currentColor"><path d="M449.446.0C483.971.0 512 28.03 512 62.554v386.892C512 483.97 483.97 512 449.446 512H62.554c-34.524.0-62.554-28.03-62.554-62.554V62.554c0-34.524 28.029-62.554 62.554-62.554h386.892zm-58.673 127.703c-33.842-33.881-78.847-52.548-126.798-52.568-98.799.0-179.21 80.405-179.249 179.234-.013 31.593 8.241 62.428 23.927 89.612l-25.429 92.884 95.021-24.925c26.181 14.28 55.659 21.807 85.658 21.816h.074c98.789.0 179.206-80.413 179.247-179.243.018-47.895-18.61-92.93-52.451-126.81zM263.976 403.485h-.06c-26.734-.01-52.954-7.193-75.828-20.767l-5.441-3.229-56.386 14.792 15.05-54.977-3.542-5.637c-14.913-23.72-22.791-51.136-22.779-79.287.033-82.142 66.867-148.971 149.046-148.971 39.793.014 77.199 15.531 105.329 43.692 28.128 28.16 43.609 65.592 43.594 105.4-.034 82.149-66.866 148.983-148.983 148.984zm81.721-111.581c-4.479-2.242-26.499-13.075-30.604-14.571-4.105-1.495-7.091-2.241-10.077 2.241-2.986 4.483-11.569 14.572-14.182 17.562-2.612 2.988-5.225 3.364-9.703 1.12-4.479-2.241-18.91-6.97-36.017-22.23C231.8 264.15 222.81 249.484 220.198 245s-.279-6.908 1.963-9.14c2.016-2.007 4.48-5.232 6.719-7.847 2.24-2.615 2.986-4.484 4.479-7.472 1.493-2.99.747-5.604-.374-7.846-1.119-2.241-10.077-24.288-13.809-33.256-3.635-8.733-7.327-7.55-10.077-7.688-2.609-.13-5.598-.158-8.583-.158-2.986.0-7.839 1.121-11.944 5.604-4.105 4.484-15.675 15.32-15.675 37.364.0 22.046 16.048 43.342 18.287 46.332 2.24 2.99 31.582 48.227 76.511 67.627 10.685 4.615 19.028 7.371 25.533 9.434 10.728 3.41 20.492 2.929 28.209 1.775 8.605-1.285 26.499-10.833 30.231-21.295 3.732-10.464 3.732-19.431 2.612-21.298-1.119-1.869-4.105-2.99-8.583-5.232z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on telegram" href="https://telegram.me/share/url?text=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source&url=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f"><svg viewBox="2 2 28 28" height="30" width="30" fill="currentColor"><path d="M26.49 29.86H5.5a3.37 3.37.0 01-2.47-1 3.35 3.35.0 01-1-2.47V5.48A3.36 3.36.0 013 3 3.37 3.37.0 015.5 2h21A3.38 3.38.0 0129 3a3.36 3.36.0 011 2.46V26.37a3.35 3.35.0 01-1 2.47 3.38 3.38.0 01-2.51 1.02zm-5.38-6.71a.79.79.0 00.85-.66L24.73 9.24a.55.55.0 00-.18-.46.62.62.0 00-.41-.17q-.08.0-16.53 6.11a.59.59.0 00-.41.59.57.57.0 00.43.52l4 1.24 1.61 4.83a.62.62.0 00.63.43.56.56.0 00.4-.17L16.54 20l4.09 3A.9.9.0 0021.11 23.15zM13.8 20.71l-1.21-4q8.72-5.55 8.78-5.55c.15.0.23.0.23.16a.18.18.0 010 .06s-2.51 2.3-7.52 6.8z"/></svg></a></li><li><a target=_blank rel="noopener noreferrer" aria-label="share Diseñador para impresoras térmicas - Gratuito y open source on ycombinator" href="https://news.ycombinator.com/submitlink?t=Dise%c3%b1ador%20para%20impresoras%20t%c3%a9rmicas%20-%20Gratuito%20y%20open%20source&u=https%3a%2f%2fparzibyte.me%2fblog%2fposts%2fdisenador-impresoras-termicas-gratuito-open-source%2f"><svg width="30" height="30" viewBox="0 0 512 512" fill="currentColor"><path d="M449.446.0C483.971.0 512 28.03 512 62.554V449.446C512 483.97 483.97 512 449.446 512H62.554C28.03 512 0 483.97.0 449.446V62.5
15754C0 28.03 28.029.0 62.554.0H449.446zM183.8767 87.9921h-62.034L230.6673 292.4508V424.0079h50.6655V292.4508L390.1575 87.9921H328.1233L256 238.2489z"/></svg></a></li></ul></footer></article></main><footer class=footer><span>© 2026 <a href=https://parzibyte.me/blog/>Parzibyte</a></span> · 158<span>Powered by 159<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> & 160<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg viewBox="0 0 12 6" fill="currentColor"><path d="M12 6H0l6-6z"/></svg> 161</a>
161<script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script>
161<script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script>
161<script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script>
161<script>document.querySelectorAll("pre > code").forEach(e=>{const n=e.parentNode.parentNode,t=document.createElement("button");t.classList.add("copy-code"),t.innerHTML="copiar";function s(){t.innerHTML="¡copiado!",setTimeout(()=>{t.innerHTML="copiar"},2e3)}t.addEventListener("click",t=>{if("clipboard"in navigator){navigator.clipboard.writeText(e.textContent),s();return}const n=document.createRange();n.selectNodeContents(e);const o=window.getSelection();o.removeAllRanges(),o.addRange(n);try{document.execCommand("copy"),s()}catch{}o.removeRange(n)}),n.classList.contains("highlight")?n.appendChild(t):n.parentNode.firstChild==n||(e.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName=="TABLE"?e.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(t):e.parentNode.appendChild(t))})</script>
161</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.