taro-bluetooth-print 2.1.2 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +135 -52
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.es.js +3995 -126
  5. package/dist/index.umd.js +1 -1
  6. package/dist/types/adapters/WebBluetoothAdapter.d.ts +93 -0
  7. package/dist/types/barcode/BarcodeGenerator.d.ts +155 -0
  8. package/dist/types/barcode/index.d.ts +6 -0
  9. package/dist/types/cache/OfflineCache.d.ts +177 -0
  10. package/dist/types/cache/index.d.ts +6 -0
  11. package/dist/types/core/BluetoothPrinter.d.ts +92 -0
  12. package/dist/types/device/DeviceManager.d.ts +160 -0
  13. package/dist/types/device/index.d.ts +6 -0
  14. package/dist/types/drivers/EscPos.d.ts +18 -0
  15. package/dist/types/encoding/EncodingService.d.ts +140 -0
  16. package/dist/types/encoding/gbk-table.d.ts +66 -0
  17. package/dist/types/encoding/index.d.ts +6 -0
  18. package/dist/types/formatter/TextFormatter.d.ts +155 -0
  19. package/dist/types/formatter/index.d.ts +6 -0
  20. package/dist/types/index.d.ts +24 -0
  21. package/dist/types/preview/PreviewRenderer.d.ts +82 -0
  22. package/dist/types/preview/index.d.ts +6 -0
  23. package/dist/types/queue/PrintQueue.d.ts +221 -0
  24. package/dist/types/queue/index.d.ts +6 -0
  25. package/dist/types/services/CommandBuilder.d.ts +105 -0
  26. package/dist/types/services/ConnectionManager.d.ts +111 -17
  27. package/dist/types/services/PrintJobManager.d.ts +2 -2
  28. package/dist/types/services/interfaces/index.d.ts +59 -0
  29. package/dist/types/template/TemplateEngine.d.ts +206 -0
  30. package/dist/types/template/index.d.ts +6 -0
  31. package/package.json +3 -2
  32. package/src/adapters/AdapterFactory.ts +17 -0
  33. package/src/adapters/TaroAdapter.ts +8 -7
  34. package/src/adapters/WebBluetoothAdapter.ts +428 -0
  35. package/src/barcode/BarcodeGenerator.ts +481 -0
  36. package/src/barcode/index.ts +7 -0
  37. package/src/cache/OfflineCache.ts +462 -0
  38. package/src/cache/index.ts +15 -0
  39. package/src/core/BluetoothPrinter.ts +133 -4
  40. package/src/device/DeviceManager.ts +462 -0
  41. package/src/device/index.ts +12 -0
  42. package/src/drivers/EscPos.ts +40 -1
  43. package/src/encoding/EncodingService.ts +439 -0
  44. package/src/encoding/gbk-table.ts +611 -0
  45. package/src/encoding/index.ts +25 -0
  46. package/src/formatter/TextFormatter.ts +318 -0
  47. package/src/formatter/index.ts +7 -0
  48. package/src/index.ts +58 -0
  49. package/src/preview/PreviewRenderer.ts +561 -0
  50. package/src/preview/index.ts +8 -0
  51. package/src/queue/PrintQueue.ts +502 -0
  52. package/src/queue/index.ts +14 -0
  53. package/src/services/CommandBuilder.ts +152 -0
  54. package/src/services/ConnectionManager.ts +338 -31
  55. package/src/services/PrintJobManager.ts +15 -13
  56. package/src/services/interfaces/index.ts +72 -3
  57. package/src/template/TemplateEngine.ts +569 -0
  58. package/src/template/index.ts +19 -0
  59. package/src/utils/image.ts +31 -16
package/CHANGELOG.md CHANGED
@@ -5,6 +5,81 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.2.0] - 2026-01-04
9
+
10
+ ### Added
11
+
12
+ - **设备管理器 (DeviceManager)** - 蓝牙设备扫描和管理功能
13
+ - 支持设备过滤(名称、服务UUID)
14
+ - 设备发现事件监听
15
+ - 已配对设备管理
16
+
17
+ - **打印队列 (PrintQueue)** - 打印任务队列管理
18
+ - 优先级排序(LOW/NORMAL/HIGH/URGENT)
19
+ - FIFO 处理机制
20
+ - 失败自动重试
21
+ - 队列暂停/恢复/清空
22
+
23
+ - **离线缓存 (OfflineCache)** - 断网时自动缓存打印任务
24
+ - 本地存储持久化
25
+ - 任务过期清理
26
+ - 重连后自动同步
27
+
28
+ - **模板引擎 (TemplateEngine)** - 收据和标签模板渲染
29
+ - 内置收据模板(店铺信息、商品列表、支付信息)
30
+ - 内置标签模板(商品名称、价格、条码)
31
+ - 变量替换和条件渲染
32
+ - 模板验证功能
33
+
34
+ - **条码生成器 (BarcodeGenerator)** - 多格式条码支持
35
+ - Code128、Code39、EAN-13、EAN-8、UPC-A 格式
36
+ - 条码内容验证
37
+ - 可配置高度、宽度、文字位置
38
+
39
+ - **文本格式化器 (TextFormatter)** - ESC/POS 文本格式化
40
+ - 对齐方式(左/中/右)
41
+ - 字体缩放(1-8倍)
42
+ - 粗体、下划线、反白样式
43
+
44
+ - **预览渲染器 (PreviewRenderer)** - 打印预览功能
45
+ - ESC/POS 命令解析
46
+ - 渲染为 Base64 图像
47
+ - 支持文本、条码、二维码预览
48
+
49
+ - **Web Bluetooth 适配器 (WebBluetoothAdapter)** - H5 环境支持
50
+ - 浏览器兼容性检测
51
+ - 设备请求和选择
52
+ - 完整的连接/断开/写入功能
53
+
54
+ - **连接稳定性增强**
55
+ - 心跳检测机制
56
+ - 自动重连(可配置重试次数和间隔)
57
+ - 自适应传输参数(动态调整分片大小和延迟)
58
+
59
+ - **BluetoothPrinter 新方法**
60
+ - `align(alignment)` - 设置文本对齐
61
+ - `setSize(width, height)` - 设置字体大小
62
+ - `setBold(enabled)` - 设置粗体
63
+ - `setUnderline(enabled)` - 设置下划线
64
+ - `resetStyle()` - 重置样式
65
+ - `barcode(content, format, options)` - 打印条码
66
+
67
+ - **编码服务 (EncodingService)** - 完整的中文编码支持
68
+ - GBK、GB2312、Big5、UTF-8 编码
69
+ - 编码自动检测
70
+ - 不支持字符的替代处理
71
+
72
+ ### Changed
73
+
74
+ - 更新了 `src/index.ts`,导出所有新模块
75
+ - 更新了 `AdapterFactory`,支持 Web Bluetooth 平台
76
+ - 增强了 `ConnectionManager`,支持心跳和自动重连
77
+ - 更新了 API 文档和 README,添加新功能说明
78
+
79
+ ### Fixed
80
+
81
+ - 修复了格式化相关的 lint 错误
82
+
8
83
  ## [2.1.2] - 2025-12-16
9
84
 
10
85
  ### Added
package/README.md CHANGED
@@ -21,9 +21,16 @@
21
21
  - 🎨 **简洁 API** - 链式调用,易于使用
22
22
  - 🖼️ **图片打印** - 内置 Floyd-Steinberg 抖动算法,高质量图片转换
23
23
  - 📲 **二维码支持** - 原生 ESC/POS 二维码指令
24
+ - 📊 **条码支持** - 支持 Code128、Code39、EAN-13、EAN-8、UPC-A 格式
24
25
  - 🔄 **断点续传** - 支持打印任务暂停/恢复/取消
25
- - 📶 **弱网适配** - 智能分片与重试机制
26
+ - 📶 **弱网适配** - 智能分片与重试机制,自适应传输参数
26
27
  - 📊 **进度追踪** - 实时打印进度事件
28
+ - 💾 **离线缓存** - 断网时自动缓存,重连后自动同步
29
+ - 📋 **打印队列** - 优先级排序,失败自动重试
30
+ - 📝 **模板引擎** - 内置收据和标签模板
31
+ - 🔍 **打印预览** - ESC/POS 命令渲染为图像预览
32
+ - 🌐 **Web Bluetooth** - 支持 H5 环境的 Web Bluetooth API
33
+ - 💓 **连接稳定** - 心跳检测和自动重连机制
27
34
  - 🛠️ **TypeScript** - 完整的类型定义和 JSDoc 文档
28
35
  - 🧪 **高测试覆盖** - 76%+ 代码覆盖率
29
36
 
@@ -113,12 +120,7 @@ const printer = new BluetoothPrinter();
113
120
  await printer.connect(deviceId);
114
121
 
115
122
  // 构建大量打印内容
116
- printer
117
- .text('第1页内容...')
118
- .feed(10)
119
- .text('第2页内容...')
120
- .feed(10)
121
- .text('第3页内容...');
123
+ printer.text('第1页内容...').feed(10).text('第2页内容...').feed(10).text('第3页内容...');
122
124
 
123
125
  // 开始打印(异步)
124
126
  const printPromise = printer.print();
@@ -155,11 +157,8 @@ Taro.canvasGetImageData({
155
157
  height: 100,
156
158
  success: res => {
157
159
  const imageData = new Uint8Array(res.data);
158
-
159
- printer
160
- .image(imageData, res.width, res.height)
161
- .feed(2)
162
- .print();
160
+
161
+ printer.image(imageData, res.width, res.height).feed(2).print();
163
162
  },
164
163
  });
165
164
  ```
@@ -169,14 +168,84 @@ Taro.canvasGetImageData({
169
168
  ```typescript
170
169
  // 配置重试和分片参数
171
170
  printer.setOptions({
172
- chunkSize: 20, // 每次发送20字节
173
- delay: 30, // 分片间延迟30ms
174
- retries: 5, // 失败重试5次
171
+ chunkSize: 20, // 每次发送20字节
172
+ delay: 30, // 分片间延迟30ms
173
+ retries: 5, // 失败重试5次
175
174
  });
176
175
 
177
176
  await printer.text('测试内容').print();
178
177
  ```
179
178
 
179
+ ### 文本格式化 (v2.2+)
180
+
181
+ ```typescript
182
+ await printer
183
+ .align('center')
184
+ .setSize(2, 2)
185
+ .setBold(true)
186
+ .text('大标题')
187
+ .resetStyle()
188
+ .feed()
189
+ .align('left')
190
+ .text('正常文本')
191
+ .print();
192
+ ```
193
+
194
+ ### 条码打印 (v2.2+)
195
+
196
+ ```typescript
197
+ await printer.text('商品条码:').barcode('6901234567890', 'EAN13', { height: 80 }).feed(2).print();
198
+ ```
199
+
200
+ ### 设备管理 (v2.2+)
201
+
202
+ ```typescript
203
+ import { DeviceManager } from 'taro-bluetooth-print';
204
+
205
+ const deviceManager = new DeviceManager();
206
+
207
+ // 监听设备发现
208
+ deviceManager.on('device-found', device => {
209
+ console.log('发现设备:', device.name, device.deviceId);
210
+ });
211
+
212
+ // 开始扫描
213
+ await deviceManager.startScan({ timeout: 10000 });
214
+
215
+ // 获取已发现的设备
216
+ const devices = deviceManager.getDiscoveredDevices();
217
+ ```
218
+
219
+ ### 打印队列 (v2.2+)
220
+
221
+ ```typescript
222
+ import { PrintQueue } from 'taro-bluetooth-print';
223
+
224
+ const queue = new PrintQueue({ maxSize: 100 });
225
+
226
+ // 添加高优先级任务
227
+ queue.add(printData, { priority: 'HIGH' });
228
+
229
+ // 监听完成事件
230
+ queue.on('job-completed', job => {
231
+ console.log('任务完成:', job.id);
232
+ });
233
+ ```
234
+
235
+ ### 离线缓存 (v2.2+)
236
+
237
+ ```typescript
238
+ import { OfflineCache } from 'taro-bluetooth-print';
239
+
240
+ const cache = new OfflineCache();
241
+
242
+ // 断网时自动缓存
243
+ await cache.save({ id: 'job-1', data: printData });
244
+
245
+ // 重连后同步
246
+ await cache.sync();
247
+ ```
248
+
180
249
  ## 📚 文档
181
250
 
182
251
  完整文档请访问:**[https://agions.github.io/taro-bluetooth-print/](https://agions.github.io/taro-bluetooth-print/)**
@@ -192,59 +261,73 @@ await printer.text('测试内容').print();
192
261
 
193
262
  ### BluetoothPrinter
194
263
 
195
- | 方法 | 说明 | 返回值 |
196
- |------|------|--------|
197
- | `connect(deviceId)` | 连接蓝牙设备 | `Promise<this>` |
198
- | `disconnect()` | 断开连接 | `Promise<void>` |
199
- | `text(content, encoding?)` | 添加文本 | `this` |
200
- | `feed(lines?)` | 换行 | `this` |
201
- | `image(data, width, height)` | 打印图片 | `this` |
202
- | `qr(content, options?)` | 打印二维码 | `this` |
203
- | `cut()` | 切纸 | `this` |
204
- | `setOptions(options)` | 设置适配器参数 | `this` |
205
- | `print()` | 发送打印 | `Promise<void>` |
206
- | `pause()` | 暂停打印 | `void` |
207
- | `resume()` | 恢复打印 | `Promise<void>` |
208
- | `cancel()` | 取消打印 | `void` |
209
- | `remaining()` | 获取剩余字节数 | `number` |
264
+ | 方法 | 说明 | 返回值 |
265
+ | ------------------------------------ | -------------------- | --------------- |
266
+ | `connect(deviceId)` | 连接蓝牙设备 | `Promise<this>` |
267
+ | `disconnect()` | 断开连接 | `Promise<void>` |
268
+ | `text(content, encoding?)` | 添加文本 | `this` |
269
+ | `feed(lines?)` | 换行 | `this` |
270
+ | `image(data, width, height)` | 打印图片 | `this` |
271
+ | `qr(content, options?)` | 打印二维码 | `this` |
272
+ | `barcode(content, format, options?)` | 打印条码 (v2.2+) | `this` |
273
+ | `align(alignment)` | 设置对齐 (v2.2+) | `this` |
274
+ | `setSize(width, height)` | 设置字体大小 (v2.2+) | `this` |
275
+ | `setBold(enabled)` | 设置粗体 (v2.2+) | `this` |
276
+ | `setUnderline(enabled)` | 设置下划线 (v2.2+) | `this` |
277
+ | `resetStyle()` | 重置样式 (v2.2+) | `this` |
278
+ | `cut()` | 切纸 | `this` |
279
+ | `setOptions(options)` | 设置适配器参数 | `this` |
280
+ | `print()` | 发送打印 | `Promise<void>` |
281
+ | `pause()` | 暂停打印 | `void` |
282
+ | `resume()` | 恢复打印 | `Promise<void>` |
283
+ | `cancel()` | 取消打印 | `void` |
284
+ | `remaining()` | 获取剩余字节数 | `number` |
285
+ | `qr(content, options?)` | 打印二维码 | `this` |
286
+ | `cut()` | 切纸 | `this` |
287
+ | `setOptions(options)` | 设置适配器参数 | `this` |
288
+ | `print()` | 发送打印 | `Promise<void>` |
289
+ | `pause()` | 暂停打印 | `void` |
290
+ | `resume()` | 恢复打印 | `Promise<void>` |
291
+ | `cancel()` | 取消打印 | `void` |
292
+ | `remaining()` | 获取剩余字节数 | `number` |
210
293
 
211
294
  ### 事件
212
295
 
213
- | 事件名 | 数据类型 | 说明 |
214
- |--------|---------|------|
215
- | `state-change` | `PrinterState` | 连接状态变化 |
216
- | `progress` | `{ sent, total }` | 打印进度 |
217
- | `error` | `BluetoothPrintError` | 错误事件 |
218
- | `connected` | `string` (deviceId) | 已连接 |
219
- | `disconnected` | `string` (deviceId) | 已断开 |
220
- | `print-complete` | `void` | 打印完成 |
296
+ | 事件名 | 数据类型 | 说明 |
297
+ | ---------------- | --------------------- | ------------ |
298
+ | `state-change` | `PrinterState` | 连接状态变化 |
299
+ | `progress` | `{ sent, total }` | 打印进度 |
300
+ | `error` | `BluetoothPrintError` | 错误事件 |
301
+ | `connected` | `string` (deviceId) | 已连接 |
302
+ | `disconnected` | `string` (deviceId) | 已断开 |
303
+ | `print-complete` | `void` | 打印完成 |
221
304
 
222
305
  ## 🔧 配置选项
223
306
 
224
307
  ```typescript
225
308
  interface IAdapterOptions {
226
- chunkSize?: number; // 分片大小(默认: 20字节)
227
- delay?: number; // 分片延迟(默认: 20ms)
228
- retries?: number; // 重试次数(默认: 3)
309
+ chunkSize?: number; // 分片大小(默认: 20字节)
310
+ delay?: number; // 分片延迟(默认: 20ms)
311
+ retries?: number; // 重试次数(默认: 3)
229
312
  }
230
313
 
231
314
  interface IQrOptions {
232
- model?: 1 | 2; // 二维码模型(默认: 2)
233
- size?: number; // 模块大小 1-16(默认: 6)
234
- errorCorrection?: 'L'|'M'|'Q'|'H'; // 纠错级别(默认: 'M')
315
+ model?: 1 | 2; // 二维码模型(默认: 2)
316
+ size?: number; // 模块大小 1-16(默认: 6)
317
+ errorCorrection?: 'L' | 'M' | 'Q' | 'H'; // 纠错级别(默认: 'M')
235
318
  }
236
319
  ```
237
320
 
238
321
  ## 🌐 平台支持
239
322
 
240
- | 平台 | 支持情况 | 说明 |
241
- |------|---------|------|
242
- | 微信小程序 | ✅ | 完全支持 |
243
- | H5 | ✅ | 需要浏览器支持 Web Bluetooth |
244
- | React Native | ✅ | 通过 Taro RN |
245
- | 支付宝小程序 | ✅ | 完全支持 |
246
- | 百度小程序 | ✅ | 完全支持 |
247
- | 字节跳动小程序 | ✅ | 完全支持(抖音、头条等)
323
+ | 平台 | 支持情况 | 说明 |
324
+ | -------------- | -------- | ---------------------------- |
325
+ | 微信小程序 | ✅ | 完全支持 |
326
+ | H5 | ✅ | 需要浏览器支持 Web Bluetooth |
327
+ | React Native | ✅ | 通过 Taro RN |
328
+ | 支付宝小程序 | ✅ | 完全支持 |
329
+ | 百度小程序 | ✅ | 完全支持 |
330
+ | 字节跳动小程序 | ✅ | 完全支持(抖音、头条等) |
248
331
 
249
332
  ## 🏗️ 架构设计
250
333