@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 +106 -0
- package/README.md +198 -20
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +487 -84
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +488 -83
- package/dist/index.js.map +1 -1
- package/dist/printEngine/constants.d.ts +2 -2
- package/dist/printEngine/renderers/PageNumberRenderer.d.ts +22 -0
- package/dist/printEngine/renderers/index.d.ts +1 -0
- package/dist/printEngine.d.ts +19 -3
- package/dist/sdk.d.ts +2 -2
- package/dist/types.d.ts +25 -0
- package/dist/utils/resourceLoader.d.ts +19 -0
- package/package.json +2 -1
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 {
|
|
43
|
+
import { createPrintSDK } from '@jcyao/print-sdk';
|
|
28
44
|
|
|
29
|
-
//
|
|
30
|
-
|
|
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
|
-
### `
|
|
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
|
-
|
|
114
|
+
批量打印(同模板多数据)。
|
|
98
115
|
|
|
99
116
|
```typescript
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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