@jcyao/print-sdk 1.0.0 → 1.1.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,106 @@
1
+ # Changelog
2
+
3
+ 所有版本的变更记录都列在这里,遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/) 规范。
4
+
5
+ ## [1.1.0] - 2026-04-15
6
+
7
+ ### 🎯 重大改进
8
+
9
+ #### 表格分页精度革命性提升
10
+ - **渲染后测量方案**:将表格真实渲染到隐藏 DOM 中,测量每行实际高度
11
+ - **彻底解决长文本换行问题**:不再依赖估算行高,避免分页截断
12
+ - **表头高度真实测量**:支持表头换行场景
13
+ - **合计行高度真实测量**:避免合计行间距不一致
14
+
15
+ #### 组件定位逻辑优化
16
+ - **支持负 gap(组件重叠)**:完全保留设计时的相对位置关系
17
+ - **表格跨页后精确定位**:后续组件定位到表格实际底部
18
+ - **新页面组件间距处理**:正确处理与页面顶部的间距
19
+
20
+ #### 表格渲染改进
21
+ - **列宽均分方案**:按列数百分比均分,避免宽度溢出
22
+ - **单元格垂直居中**:文字垂直居中对齐
23
+ - **min-height 替代固定高度**:允许内容自然撑开
24
+
25
+ ### 🔧 工程改进
26
+
27
+ - **iframe 生命周期优化**:使用 `afterprint` 事件 + 5秒兜底,确保可靠清理
28
+ - **DOMParser 替代正则**:批量打印时更健壮地提取 body 内容
29
+ - **Decimal.js 错误处理**:添加友好的"计算错误"提示
30
+ - **表格宽度溢出检测**:`xMm` 越界时输出明确错误提示
31
+ - **异步架构改造**:核心方法改为 `async/await`,支持渲染后测量
32
+
33
+ ### 🐛 问题修复
34
+
35
+ | 问题 | 修复内容 |
36
+ |------|----------|
37
+ | 分页计算精度丢失 | 使用真实渲染高度代替估算高度 |
38
+ | 表格高度计算不一致 | 渲染后测量 + min-height |
39
+ | 组件间距为负数 | 保留设计意图,支持组件重叠 |
40
+ | iframe 移除时机 | afterprint 事件 + 兜底定时器 |
41
+ | 表格宽度溢出 | 添加 xMm 越界检测 |
42
+ | 正则提取 body | 使用 DOMParser |
43
+ | Decimal.js 错误 | 添加错误处理和友好提示 |
44
+
45
+ ### ⚠️ 已知限制
46
+
47
+ - 页码宽高固定(20mm x 6mm),大字体时可能溢出
48
+ - 连续纸模式高度为 Infinity(设计如此,适配连续纸打印)
49
+
50
+ ---
51
+
52
+ ## [1.0.1] - 2026-01-22
53
+
54
+ ### ✨ 新增功能
55
+
56
+ - **页码功能**:支持6种位置、3种格式、自定义样式
57
+ - 位置:上左/上中/上右/下左/下中/下右
58
+ - 格式:simple、slash、text
59
+ - 支持偏移量、前后缀、样式自定义
60
+
61
+ - **批量打印预览**:支持多份文档一次性预览和打印
62
+ - 自动合并 HTML
63
+ - 显示文档分割线和序号
64
+ - 支持进度回调
65
+
66
+ - **PageNumberRenderer**:新增页码渲染器插件
67
+
68
+ ### 🎨 体验优化
69
+
70
+ - 组件库和数据资产支持双击快速添加
71
+ - 组件库和数据资产支持拖拽精确定位
72
+ - 智能计算画布中心位置
73
+
74
+ ### 🔧 架构优化
75
+
76
+ - 页码功能从组件模式重构为页面配置模式
77
+ - SDK 增加 PageNumberRenderer 支持
78
+
79
+ ---
80
+
81
+ ## [1.0.0] - 2026-01-20
82
+
83
+ ### 🎉 初始发布
84
+
85
+ **核心功能**
86
+ - 可视化模板设计器(拖拽 + 对齐 + 网格吸附)
87
+ - 7种基础组件:文本、图片、表格、二维码、条形码、矩形、线条
88
+ - Schema 字典管理 + Mock 数据管理
89
+ - 数据绑定 + Pipes 格式化
90
+ - SDK 打印引擎 + 表格分页渲染
91
+
92
+ **技术特性**
93
+ - 插件化架构(渲染器、管道)
94
+ - TypeScript 完整类型定义
95
+ - 客户端渲染,零服务端压力
96
+ - 使用 decimal.js 保证数值精度
97
+
98
+ ---
99
+
100
+ ## 版本号说明
101
+
102
+ 遵循 [语义化版本 2.0.0](https://semver.org/lang/zh-CN/):
103
+
104
+ - **主版本号**:不兼容的 API 修改
105
+ - **次版本号**:向下兼容的功能新增
106
+ - **修订号**:向下兼容的问题修复
package/README.md CHANGED
@@ -5,6 +5,22 @@
5
5
 
6
6
  通用打印 SDK - 客户端打印解决方案
7
7
 
8
+ **当前版本**: v1.1.0
9
+
10
+ ## 🆕 v1.1.0 重大改进
11
+
12
+ - ⭐ **表格分页精度大幅提升**:引入「渲染后测量」方案,彻底解决长文本换行导致的分页截断问题
13
+ - ⭐ **组件定位优化**:支持负 gap(组件重叠),表格跨页后后续组件精确定位
14
+ - ⭐ **表格渲染改进**:列宽均分、单元格垂直居中、使用 min-height 替代固定高度
15
+ - 🔧 **错误处理增强**:iframe 使用 afterprint 事件、DOMParser 替代正则、Decimal.js 错误友好提示
16
+
17
+ ## 📋 历史版本
18
+
19
+ ### v1.0.1
20
+ - 页码功能:支持6种位置、3种格式、自定义样式
21
+ - 批量打印预览:支持多份文档一次性预览和打印
22
+ - PageNumberRenderer:新增页码渲染器插件
23
+
8
24
  ## ✨ 特性
9
25
 
10
26
  - 🎨 **可视化模板设计** - 拖拽式设计打印模板
@@ -24,13 +40,13 @@ npm install @jcyao/print-sdk
24
40
  ## 🚀 快速开始
25
41
 
26
42
  ```typescript
27
- import { init, print } from '@jcyao/print-sdk';
43
+ import { createPrintSDK } from '@jcyao/print-sdk';
28
44
 
29
- // 初始化 SDK(全局执行一次)
30
- init();
45
+ // 创建 SDK 实例(无需配置)
46
+ const sdk = createPrintSDK();
31
47
 
32
48
  // 打印
33
- print({
49
+ sdk.print({
34
50
  template: {
35
51
  pageConfig: {
36
52
  size: 'A4',
@@ -71,14 +87,6 @@ print({
71
87
 
72
88
  ## 📖 API 文档
73
89
 
74
- ### `init()`
75
-
76
- 初始化打印 SDK,全局执行一次。
77
-
78
- ```typescript
79
- init();
80
- ```
81
-
82
90
  ### `print(options: PrintOptions)`
83
91
 
84
92
  执行打印操作。
@@ -92,14 +100,31 @@ interface PrintOptions {
92
100
  }
93
101
  ```
94
102
 
95
- ### `preview(options: PrintOptions): string`
103
+ ### `sdk.generateHTML(template, data)`
104
+
105
+ 生成预览 HTML(不执行打印)。
106
+
107
+ ```typescript
108
+ const html = await sdk.generateHTML(myTemplate, myData);
109
+ console.log(html); // 完整的 HTML 字符串
110
+ ```
111
+
112
+ ### `sdk.printMultiple(template, dataList, options)`
96
113
 
97
- 生成预览 HTML。
114
+ 批量打印(同模板多数据)。
98
115
 
99
116
  ```typescript
100
- const html = preview({
101
- template: myTemplate,
102
- data: myData
117
+ const dataList = [
118
+ { orderNo: 'ORDER001', ... },
119
+ { orderNo: 'ORDER002', ... },
120
+ { orderNo: 'ORDER003', ... },
121
+ ];
122
+
123
+ await sdk.printMultiple(myTemplate, dataList, {
124
+ preview: true, // 预览所有
125
+ onProgress: (progress) => {
126
+ console.log(`进度: ${progress.completed}/${progress.total}`);
127
+ }
103
128
  });
104
129
  ```
105
130
 
@@ -111,8 +136,7 @@ const html = preview({
111
136
  - **二维码组件** - 自动生成二维码
112
137
  - **条形码组件** - 多种条形码格式
113
138
  - **线条组件** - 实线/虚线装饰
114
- - **矩形组件** - 边框装饰
115
- - **页码组件** - 自动分页页码
139
+ - **矩形组件** - 边框装饰、背景色块
116
140
 
117
141
  ## 🔄 数据管道
118
142
 
@@ -184,19 +208,173 @@ const html = preview({
184
208
  }
185
209
  ```
186
210
 
211
+ ## 🔢 页码功能配置 ⭐ **v1.0.1 新增**
212
+
213
+ 页码功能通过页面配置实现,而非作为组件添加:
214
+
215
+ ### 基础配置
216
+
217
+ ```typescript
218
+ {
219
+ pageConfig: {
220
+ size: 'A4',
221
+ orientation: 'portrait',
222
+ marginMm: { top: 10, right: 10, bottom: 10, left: 10 },
223
+
224
+ // 页码配置
225
+ pageNumber: {
226
+ enabled: true,
227
+ position: 'bottom-center', // 6种位置
228
+ format: 'slash', // 3种格式
229
+ offsetX: 0, // 横向偏移 (mm)
230
+ offsetY: 0, // 纵向偏移 (mm)
231
+ prefix: '', // 前缀
232
+ suffix: '', // 后缀
233
+ style: {
234
+ fontSize: 12,
235
+ color: '#666',
236
+ fontWeight: 'normal'
237
+ }
238
+ }
239
+ },
240
+ components: [...]
241
+ }
242
+ ```
243
+
244
+ ### 位置选项 (position)
245
+
246
+ - `top-left` - 左上角
247
+ - `top-center` - 上中
248
+ - `top-right` - 右上角
249
+ - `bottom-left` - 左下角
250
+ - `bottom-center` - 下中 (默认)
251
+ - `bottom-right` - 右下角
252
+
253
+ ### 格式选项 (format)
254
+
255
+ 1. **`simple`** - 简单格式
256
+ ```
257
+ 显示:1 2 3
258
+ ```
259
+
260
+ 2. **`slash`** - 斜线格式 (默认)
261
+ ```
262
+ 显示:1/3 2/3 3/3
263
+ ```
264
+
265
+ 3. **`text`** - 文字格式
266
+ ```
267
+ 显示:第1页 共3页 第2页 共3页
268
+ ```
269
+
270
+ ### 完整示例
271
+
272
+ ```typescript
273
+ const template = {
274
+ pageConfig: {
275
+ size: 'A4',
276
+ orientation: 'portrait',
277
+ marginMm: { top: 10, right: 10, bottom: 10, left: 10 },
278
+ pageNumber: {
279
+ enabled: true,
280
+ position: 'bottom-right',
281
+ format: 'text',
282
+ offsetX: -5, // 向左偏移 5mm
283
+ offsetY: -3, // 向上偏移 3mm
284
+ prefix: '页码:',
285
+ suffix: '',
286
+ style: {
287
+ fontSize: 10,
288
+ color: '#999',
289
+ fontWeight: 'bold'
290
+ }
291
+ }
292
+ },
293
+ components: [...]
294
+ };
295
+
296
+ await sdk.print({ template, data });
297
+ // 打印输出:右下角显示 "页码:第1页 共3页"
298
+ ```
299
+
187
300
  ## 🔧 类型定义
188
301
 
189
302
  完整的 TypeScript 类型定义:
190
303
 
191
304
  ```typescript
192
305
  import type {
193
- Template,
306
+ PrintTemplate,
194
307
  ComponentNode,
195
308
  TableColumn,
196
309
  PipeConfig
197
310
  } from '@jcyao/print-sdk';
198
311
  ```
199
312
 
313
+ ## 💻 使用示例
314
+
315
+ ### 示例 1:基本打印
316
+
317
+ ```typescript
318
+ import { createPrintSDK } from '@jcyao/print-sdk';
319
+
320
+ const sdk = createPrintSDK();
321
+
322
+ // 准备模板和数据
323
+ const template = {
324
+ pageConfig: {
325
+ size: 'A4',
326
+ orientation: 'portrait',
327
+ marginMm: { top: 10, right: 10, bottom: 10, left: 10 }
328
+ },
329
+ components: [
330
+ {
331
+ id: 'text-1',
332
+ type: 'text',
333
+ layout: { xMm: 20, yMm: 20, widthMm: 170, heightMm: 10 },
334
+ binding: { path: 'orderNo' },
335
+ props: { label: '订单号:' }
336
+ }
337
+ ]
338
+ };
339
+
340
+ const data = { orderNo: 'SR202401', customerName: '张三' };
341
+
342
+ // 直接打印
343
+ await sdk.printDirect(template, data);
344
+ ```
345
+
346
+ ### 示例 2:预览后打印
347
+
348
+ ```typescript
349
+ import { createPrintSDK } from '@jcyao/print-sdk';
350
+
351
+ const sdk = createPrintSDK();
352
+
353
+ // 预览后打印
354
+ await sdk.printWithPreview(template, data);
355
+ ```
356
+
357
+ ### 示例 3:批量打印
358
+
359
+ ```typescript
360
+ import { createPrintSDK } from '@jcyao/print-sdk';
361
+
362
+ const sdk = createPrintSDK();
363
+
364
+ const orders = [
365
+ { orderNo: 'ORDER001', amount: 1000 },
366
+ { orderNo: 'ORDER002', amount: 2000 },
367
+ { orderNo: 'ORDER003', amount: 3000 },
368
+ ];
369
+
370
+ await sdk.printMultiple(template, orders, {
371
+ preview: true,
372
+ onProgress: (progress) => {
373
+ console.log(`打印进度: ${progress.completed}/${progress.total}`);
374
+ }
375
+ });
376
+ ```
377
+
200
378
  ## 📝 License
201
379
 
202
380
  MIT © joke_yao
package/dist/index.d.ts CHANGED
@@ -9,3 +9,4 @@
9
9
  */
10
10
  export * from './sdk';
11
11
  export * from './pipes';
12
+ export { waitForImagesLoaded, waitForPrintResourcesReady } from './utils/resourceLoader';