@devlas/capacitor-thermal-printer

中文文档
0.9.0发布于 2026/11/08MITTypeScriptESM + CJS零依赖近 30 天下载 4932

Adaptador universal de impresión térmica ESC/POS para Capacitor: USB (OTG), TCP/LAN/WiFi y Bluetooth SPP en Android; TCP/LAN/WiFi en iOS. Una sola API de bytes crudos.

原始使用文档
文档目录10 节
  1. Instalación
  2. API
  3. list({ transport })
  4. scan({ transport: 'ble', timeoutMs? })
  5. requestPermission(target)
  6. print(target & { data })
  7. Códigos de error
  8. Plataformas
  9. Publicar
  10. Licencia

@devlas/capacitor-thermal-printer

Adaptador universal de impresión térmica ESC/POS para Capacitor: USB (OTG), TCP/LAN/WiFi, Bluetooth SPP y Bluetooth Low Energy (BLE) en Android; TCP/LAN/WiFi en iOS — una sola API de bytes crudos en ambas plataformas.

  • Bytes crudos, no formateo: la app codifica el ticket ESC/POS (con su propio encoder) y el plugin solo lo transporta. Así el mismo encoder sirve para Electron, Web Serial, WebUSB y esta app nativa.
  • Stateless: cada print() conecta → escribe → cierra. Sin estado de conexión que se corrompa.
  • Sin dependencias nativas: UsbManager/Socket/BluetoothSocket en Android, Network.framework en iOS — nada más.
  • Permisos modernos: flujo USB compatible con Android 12/14+ (FLAG_MUTABLE + intent explícito + RECEIVER_NOT_EXPORTED), BLUETOOTH_CONNECT runtime en API 31+.
  • Base64 en el bridge: los bytes viajan como base64 — sin corrupción UTF-8 (el bug clásico de los plugins BT de la comunidad).
  • iOS solo TCP: USB y Bluetooth SPP requieren certificación MFi de Apple (no es un tema de código) — ver docs/TRANSPORTES.md.

Matriz de transportes, librerías evaluadas y decisiones de diseño: docs/TRANSPORTES.md

Instalación

npm i @devlas/capacitor-thermal-printer
npx cap sync android
npx cap sync ios

Android: sin pasos extra, no requiere JitPack ni repositorios Maven adicionales. iOS: agrega NSLocalNetworkUsageDescription al Info.plist de tu app (iOS pide permiso de "red local" la primera vez que se usa TCP).

API

import { ThermalPrinter, bytesToBase64 } from '@devlas/capacitor-thermal-printer'

list({ transport })

Lista dispositivos disponibles. transport: 'usb' | 'bluetooth' (TCP no es listable — la IP la ingresa el usuario).

const { devices } = await ThermalPrinter.list({ transport: 'usb' })
// [{ transport: 'usb', vendorId: 1155, productId: 22304, name: 'POS58 Printer',
//    canPrint: true, hasPermission: false, deviceId: 1002 }]

const { devices } = await ThermalPrinter.list({ transport: 'bluetooth' })
// [{ transport: 'bluetooth', address: '66:22:...', name: 'PT-210' }]
// (solo emparejados — la impresora se empareja desde Ajustes del sistema)

scan({ transport: 'ble', timeoutMs? })

Busca impresoras Bluetooth Low Energy cercanas (las que anuncian nombre), la más cercana primero. Las BLE no se emparejan en Ajustes, por eso list('bluetooth') no las ve. Pide el permiso si falta.

const { devices } = await ThermalPrinter.scan({ transport: 'ble', timeoutMs: 5000 })
// [{ transport: 'ble', address: 'DC:0D:...', name: 'SP-POS8811A', rssi: -48 }]
await ThermalPrinter.print({ transport: 'ble', address: devices[0].address, data })

list('bluetooth') devuelve además kind: 'classic' | 'le' | 'dual'. Si una impresora es dual, imprime por bluetooth (SPP), que es más estable y rápido.

requestPermission(target)

// USB: diálogo del sistema por dispositivo. El permiso persiste hasta desconectar
// el cable (o para siempre si el usuario marca "usar por defecto").
const { granted } = await ThermalPrinter.requestPermission({
  transport: 'usb', vendorId: 1155, productId: 22304,
})

// Bluetooth: permiso runtime BLUETOOTH_CONNECT (API 31+)
await ThermalPrinter.requestPermission({ transport: 'bluetooth', address: '66:22:...' })

// TCP: siempre { granted: true }

print(target & { data })

data = bytes ESC/POS en base64 (usa el helper bytesToBase64).

const bytes: Uint8Array = miEncoderEscPos(ticket)   // el encoder es de la app

// USB — si se omiten vendorId/productId usa la primera impresora detectada
await ThermalPrinter.print({ transport: 'usb', vendorId: 1155, productId: 22304, data: bytesToBase64(bytes) })

// TCP / LAN / WiFi — raw 9100 (JetDirect)
await ThermalPrinter.print({ transport: 'tcp', host: '192.168.1.50', port: 9100, data: bytesToBase64(bytes) })

// Bluetooth SPP
await ThermalPrinter.print({ transport: 'bluetooth', address: '66:22:...', data: bytesToBase64(bytes) })

Códigos de error

error.code estable para manejar en JS:

CódigoSignificado
unavailableEl transporte no existe en el equipo (sin USB host / sin adaptador BT)
not_foundDispositivo no encontrado (desconectado, MAC inválida)
permission_deniedPermiso USB o BLUETOOTH_CONNECT denegado
connect_failedNo se pudo abrir la conexión (timeout TCP, socket BT, claim USB)
write_failedLa escritura falló a mitad de trabajo
invalid_transport / invalid_dataParámetros mal formados

Plataformas

PlataformaEstado
Android (Capacitor WebView)✅ usb / tcp / bluetooth
iOS (Capacitor WebView)✅ tcp — ❌ usb / bluetooth (requieren MFi, ver docs/TRANSPORTES.md)
Web❌ stub — en navegador usa WebUSB / Web Serial directamente

Publicar

npm publish --access public

Licencia

MIT © Devlas SpA

版本与发布记录

@devlas/capacitor-thermal-printer 共发布 10 个版本,首次发布于 2026/07/07;过去 12 个月发布了 10 个版本。

版本发布日期距今
0.9.0latest2026/11/084 天前
0.8.12026/10/2419 天前
0.8.02026/08/292 个月前
0.7.02026/08/063 个月前
0.6.02026/07/283 个月前
0.5.02026/07/283 个月前

关于 @devlas/capacitor-thermal-printer 的常见问题

@devlas/capacitor-thermal-printer 是什么?

Adaptador universal de impresión térmica ESC/POS para Capacitor: USB (OTG), TCP/LAN/WiFi y Bluetooth SPP en Android; TCP/LAN/WiFi en iOS. Una sola API de bytes crudos.

如何安装 @devlas/capacitor-thermal-printer?

在项目目录运行 npm install @devlas/capacitor-thermal-printer,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@capacitor/core(>=5.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@devlas/capacitor-thermal-printer 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@devlas/capacitor-thermal-printer 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@devlas/capacitor-thermal-printer 可以商用吗?

@devlas/capacitor-thermal-printer 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@devlas/capacitor-thermal-printer 的下载量有多少?

根据 npm 官方下载统计,@devlas/capacitor-thermal-printer 在 2026/10/12 – 2026/11/10 这 30 天内被下载 4,932 次,日均约 164 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@devlas/capacitor-thermal-printer 还在维护吗?

最新版本 0.9.0 发布于 2026/11/08(4 天前);至今共发布 10 个版本,其中过去 12 个月发布了 10 个;首次发布于 2026/07/07。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。