@jcyao/print-sdk 1.0.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/LICENSE +21 -0
- package/README.md +218 -0
- package/dist/PrintSDK.d.ts +72 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.esm.js +1668 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +1702 -0
- package/dist/index.js.map +1 -0
- package/dist/pipes/executors/CurrencyPipe.d.ts +5 -0
- package/dist/pipes/executors/DatePipe.d.ts +5 -0
- package/dist/pipes/executors/MoneyPipe.d.ts +6 -0
- package/dist/pipes/executors/index.d.ts +15 -0
- package/dist/pipes/index.d.ts +7 -0
- package/dist/pipes/registry.d.ts +24 -0
- package/dist/pipes/types.d.ts +24 -0
- package/dist/printEngine/constants.d.ts +99 -0
- package/dist/printEngine/htmlTemplate.d.ts +44 -0
- package/dist/printEngine/renderers/BarcodeRenderer.d.ts +11 -0
- package/dist/printEngine/renderers/ImageRenderer.d.ts +10 -0
- package/dist/printEngine/renderers/LineRenderer.d.ts +10 -0
- package/dist/printEngine/renderers/QRCodeRenderer.d.ts +11 -0
- package/dist/printEngine/renderers/RectRenderer.d.ts +10 -0
- package/dist/printEngine/renderers/TableRenderer.d.ts +18 -0
- package/dist/printEngine/renderers/TextRenderer.d.ts +10 -0
- package/dist/printEngine/renderers/index.d.ts +10 -0
- package/dist/printEngine/types.d.ts +99 -0
- package/dist/printEngine/utils/styleBuilder.d.ts +20 -0
- package/dist/printEngine.d.ts +118 -0
- package/dist/sdk.d.ts +12 -0
- package/dist/types.d.ts +114 -0
- package/package.json +59 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 打印引擎插件化架构 - 类型定义
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentNode, DataBinding, PipeConfig } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* 渲染上下文
|
|
7
|
+
* 提供给渲染器插件使用的公共方法和数据
|
|
8
|
+
*/
|
|
9
|
+
export interface RenderContext {
|
|
10
|
+
/**
|
|
11
|
+
* 业务数据
|
|
12
|
+
*/
|
|
13
|
+
data: any;
|
|
14
|
+
/**
|
|
15
|
+
* 解析数据绑定,返回最终值
|
|
16
|
+
*/
|
|
17
|
+
resolveBinding(binding?: DataBinding): string;
|
|
18
|
+
/**
|
|
19
|
+
* 应用管道转换
|
|
20
|
+
*/
|
|
21
|
+
applyPipes(value: any, pipes?: PipeConfig[]): any;
|
|
22
|
+
/**
|
|
23
|
+
* 根据路径获取数据值
|
|
24
|
+
*/
|
|
25
|
+
getValueByPath(path: string, fallback?: string): any;
|
|
26
|
+
/**
|
|
27
|
+
* 格式化日期
|
|
28
|
+
*/
|
|
29
|
+
formatDate(value: any, format: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* mm 转 px 系数(3.78)
|
|
32
|
+
*/
|
|
33
|
+
mmToPx: number;
|
|
34
|
+
/**
|
|
35
|
+
* 页面信息(用于计算可用宽度)
|
|
36
|
+
*/
|
|
37
|
+
pageInfo?: {
|
|
38
|
+
widthMm: number;
|
|
39
|
+
heightMm: number;
|
|
40
|
+
marginMm: {
|
|
41
|
+
top: number;
|
|
42
|
+
right: number;
|
|
43
|
+
bottom: number;
|
|
44
|
+
left: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 组件渲染器接口
|
|
50
|
+
* 所有组件渲染器必须实现此接口
|
|
51
|
+
*/
|
|
52
|
+
export interface ComponentRenderer {
|
|
53
|
+
/**
|
|
54
|
+
* 组件类型标识
|
|
55
|
+
*/
|
|
56
|
+
readonly type: string;
|
|
57
|
+
/**
|
|
58
|
+
* 渲染组件为 HTML 字符串
|
|
59
|
+
* @param component 组件配置
|
|
60
|
+
* @param context 渲染上下文
|
|
61
|
+
* @returns HTML 字符串
|
|
62
|
+
*/
|
|
63
|
+
render(component: ComponentNode, context: RenderContext): string;
|
|
64
|
+
/**
|
|
65
|
+
* 计算组件高度(可选,用于分页)
|
|
66
|
+
* @param component 组件配置
|
|
67
|
+
* @param context 渲染上下文
|
|
68
|
+
* @returns 高度(mm)
|
|
69
|
+
*/
|
|
70
|
+
calculateHeight?(component: ComponentNode, context: RenderContext): number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 样式对象类型
|
|
74
|
+
*/
|
|
75
|
+
export type StyleObject = Record<string, string | number>;
|
|
76
|
+
/**
|
|
77
|
+
* 样式构建辅助函数类型
|
|
78
|
+
*/
|
|
79
|
+
export type StyleBuilder = (styles: StyleObject) => string;
|
|
80
|
+
/**
|
|
81
|
+
* 分页项(单个组件在某页的信息)
|
|
82
|
+
*/
|
|
83
|
+
export interface PageItem {
|
|
84
|
+
type: ComponentNode['type'];
|
|
85
|
+
index: number;
|
|
86
|
+
begin?: number;
|
|
87
|
+
end?: number;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 页面层级(流式层 + 覆盖层)
|
|
91
|
+
*/
|
|
92
|
+
export interface PageLayers {
|
|
93
|
+
flowLayer: ComponentNode[];
|
|
94
|
+
overlayLayer: ComponentNode[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 分页结果(多页,每页包含流式层和覆盖层)
|
|
98
|
+
*/
|
|
99
|
+
export type Pages = PageLayers[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 样式构建工具函数
|
|
3
|
+
*/
|
|
4
|
+
import type { StyleObject } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* 将样式对象转换为 CSS 字符串
|
|
7
|
+
* @example
|
|
8
|
+
* buildStyleString({ fontSize: '14px', color: '#000' })
|
|
9
|
+
* // => "font-size: 14px; color: #000"
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildStyleString(styles: StyleObject): string;
|
|
12
|
+
/**
|
|
13
|
+
* 构建绝对定位样式
|
|
14
|
+
* @param xMm X坐标(mm)
|
|
15
|
+
* @param yMm Y坐标(mm)
|
|
16
|
+
* @param widthMm 宽度(mm)
|
|
17
|
+
* @param heightMm 高度(mm)
|
|
18
|
+
* @param mmToPx mm转px系数(默认3.78)
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildPositionStyle(xMm: number, yMm: number, widthMm?: number, heightMm?: number, mmToPx?: number): StyleObject;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 打印引擎核心类(插件化重构版)
|
|
3
|
+
* 负责:插件管理、数据绑定、Pipe 转换、虚拟分页计算
|
|
4
|
+
*/
|
|
5
|
+
import type { PrintTemplate, ComponentNode } from './types';
|
|
6
|
+
import type { ComponentRenderer } from './printEngine/types';
|
|
7
|
+
export type { ComponentRenderer, RenderContext } from './printEngine/types';
|
|
8
|
+
export { MM_TO_PX, COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, STYLE_DEFAULT, TABLE_STYLE_DEFAULT, BARCODE_CONFIG, QRCODE_CONFIG } from './printEngine/constants';
|
|
9
|
+
export declare class PrintEngine {
|
|
10
|
+
private template;
|
|
11
|
+
private data;
|
|
12
|
+
private renderers;
|
|
13
|
+
private readonly mmToPx;
|
|
14
|
+
constructor(template: PrintTemplate, data: any);
|
|
15
|
+
/**
|
|
16
|
+
* 注册默认渲染器
|
|
17
|
+
*/
|
|
18
|
+
private registerDefaultRenderers;
|
|
19
|
+
/**
|
|
20
|
+
* 注册渲染器插件
|
|
21
|
+
* @param renderer 组件渲染器
|
|
22
|
+
*/
|
|
23
|
+
registerRenderer(renderer: ComponentRenderer): void;
|
|
24
|
+
/**
|
|
25
|
+
* 注销渲染器插件
|
|
26
|
+
* @param type 组件类型
|
|
27
|
+
*/
|
|
28
|
+
unregisterRenderer(type: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* 根据数据路径获取值
|
|
31
|
+
* 支持嵌套路径,如:order.receiver.name
|
|
32
|
+
* 智能匹配:如果路径以 root. 开头但数据中没有 root 层,自动去掉 root. 前缀
|
|
33
|
+
*/
|
|
34
|
+
private getValueByPath;
|
|
35
|
+
/**
|
|
36
|
+
* 应用管道转换
|
|
37
|
+
*/
|
|
38
|
+
private applyPipes;
|
|
39
|
+
/**
|
|
40
|
+
* 执行单个管道转换
|
|
41
|
+
*/
|
|
42
|
+
private executePipe;
|
|
43
|
+
/**
|
|
44
|
+
* 简单的日期格式化
|
|
45
|
+
*/
|
|
46
|
+
private formatDate;
|
|
47
|
+
/**
|
|
48
|
+
* 解析数据绑定,返回最终渲染的值
|
|
49
|
+
*/
|
|
50
|
+
private resolveBinding;
|
|
51
|
+
/**
|
|
52
|
+
* 创建渲染上下文
|
|
53
|
+
*/
|
|
54
|
+
private createRenderContext;
|
|
55
|
+
/**
|
|
56
|
+
* 渲染单个组件(通过插件)
|
|
57
|
+
*/
|
|
58
|
+
renderComponent(component: ComponentNode): string;
|
|
59
|
+
/**
|
|
60
|
+
* 获取页面尺寸(mm)
|
|
61
|
+
*/
|
|
62
|
+
private getPageSize;
|
|
63
|
+
/**
|
|
64
|
+
* 判断是否需要换页
|
|
65
|
+
* @param currentHeight 当前页面累计高度
|
|
66
|
+
* @param componentHeight 组件高度
|
|
67
|
+
* @param gap 组件间距
|
|
68
|
+
* @param availableHeight 可用高度
|
|
69
|
+
* @param isFirstComponent 是否为页面第一个组件
|
|
70
|
+
*/
|
|
71
|
+
private shouldBreakPage;
|
|
72
|
+
/**
|
|
73
|
+
* 计算表头高度(mm)
|
|
74
|
+
*/
|
|
75
|
+
private calculateTableHeaderHeight;
|
|
76
|
+
/**
|
|
77
|
+
* 计算表格行高度(mm)
|
|
78
|
+
*/
|
|
79
|
+
private calculateTableRowHeight;
|
|
80
|
+
/**
|
|
81
|
+
* 渲染单个页面(直接渲染,不做智能布局)
|
|
82
|
+
*/
|
|
83
|
+
private renderSinglePage;
|
|
84
|
+
/**
|
|
85
|
+
* 虚拟分页:基于相对间距的流式布局
|
|
86
|
+
* 核心逻辑:
|
|
87
|
+
* 1. 计算每个组件与上一个组件的间距 (gap)
|
|
88
|
+
* 2. 按顺序累加高度,遇到表格就拆分
|
|
89
|
+
* 3. 换页时从 marginTop 开始,忽略原 gap
|
|
90
|
+
*/
|
|
91
|
+
private calculatePages;
|
|
92
|
+
/**
|
|
93
|
+
* 表格跨页拆分(基于相对间距)
|
|
94
|
+
* 支持 repeatHeader 配置、精确行高计算、空表格检查
|
|
95
|
+
*/
|
|
96
|
+
private splitTableWithGap;
|
|
97
|
+
/**
|
|
98
|
+
* 生成打印 HTML
|
|
99
|
+
*/
|
|
100
|
+
generatePrintHTML(): string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 工厂函数:创建打印引擎实例
|
|
104
|
+
*/
|
|
105
|
+
export declare function createPrintEngine(template: PrintTemplate, data: any): {
|
|
106
|
+
/**
|
|
107
|
+
* 生成完整打印 HTML
|
|
108
|
+
*/
|
|
109
|
+
generatePrintHTML(): string;
|
|
110
|
+
/**
|
|
111
|
+
* 注册自定义渲染器
|
|
112
|
+
*/
|
|
113
|
+
registerRenderer(renderer: ComponentRenderer): void;
|
|
114
|
+
/**
|
|
115
|
+
* 注销渲染器
|
|
116
|
+
*/
|
|
117
|
+
unregisterRenderer(type: string): void;
|
|
118
|
+
};
|
package/dist/sdk.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 打印 SDK 统一导出
|
|
3
|
+
* 这个文件将来可以直接独立为 @printer/sdk 包
|
|
4
|
+
*/
|
|
5
|
+
export { PrintSDK, createPrintSDK } from './PrintSDK';
|
|
6
|
+
export type { PrintOptions, BatchPrintOptions, BatchPrintProgress, } from './PrintSDK';
|
|
7
|
+
export { PrintEngine, createPrintEngine } from './printEngine';
|
|
8
|
+
export type { ComponentRenderer, RenderContext } from './printEngine';
|
|
9
|
+
export { MM_TO_PX, COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, STYLE_DEFAULT, TABLE_STYLE_DEFAULT, BARCODE_CONFIG, QRCODE_CONFIG } from './printEngine/constants';
|
|
10
|
+
export { generatePrintPageStyles, generateBatchPrintStyles, generatePrintHTML, getPageSizeFromConfig, } from './printEngine/htmlTemplate';
|
|
11
|
+
export { TextRenderer, TableRenderer, ImageRenderer, RectRenderer, LineRenderer, QRCodeRenderer, BarcodeRenderer, } from './printEngine/renderers';
|
|
12
|
+
export type { PrintTemplate, ComponentNode, DataBinding, PipeConfig, PageConfig, ComponentType, SchemaField, SchemaDictionary, MockData, } from './types';
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export type SchemaFieldType = 'string' | 'number' | 'boolean' | 'date' | 'datetime' | 'object' | 'array';
|
|
2
|
+
export interface SchemaField {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
type: SchemaFieldType;
|
|
6
|
+
description?: string;
|
|
7
|
+
children?: SchemaField[];
|
|
8
|
+
enum?: {
|
|
9
|
+
value: string | number;
|
|
10
|
+
label: string;
|
|
11
|
+
}[];
|
|
12
|
+
format?: 'date' | 'datetime' | 'money' | 'percent';
|
|
13
|
+
}
|
|
14
|
+
export interface SchemaDictionary {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
rootType: 'object' | 'array';
|
|
18
|
+
root: SchemaField;
|
|
19
|
+
version?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PageConfig {
|
|
23
|
+
size: 'A4' | 'A5' | 'CUSTOM' | 'CONTINUOUS';
|
|
24
|
+
widthMm?: number;
|
|
25
|
+
heightMm?: number;
|
|
26
|
+
minHeightMm?: number;
|
|
27
|
+
orientation: 'portrait' | 'landscape';
|
|
28
|
+
marginMm: {
|
|
29
|
+
top: number;
|
|
30
|
+
right: number;
|
|
31
|
+
bottom: number;
|
|
32
|
+
left: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export type ComponentType = 'text' | 'image' | 'rect' | 'container' | 'table' | 'line' | 'qrcode' | 'barcode';
|
|
36
|
+
export interface PipeConfig {
|
|
37
|
+
type: string;
|
|
38
|
+
options?: Record<string, any>;
|
|
39
|
+
}
|
|
40
|
+
export interface DataBinding {
|
|
41
|
+
path: string;
|
|
42
|
+
pipes?: PipeConfig[];
|
|
43
|
+
fallback?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TablePaginationConfig {
|
|
46
|
+
repeatHeader?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface TableColumnSummary {
|
|
49
|
+
type: 'sum' | 'avg' | 'max' | 'min' | 'count';
|
|
50
|
+
precision?: number;
|
|
51
|
+
prefix?: string;
|
|
52
|
+
suffix?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface TableColumn {
|
|
55
|
+
dataIndex: string;
|
|
56
|
+
title: string;
|
|
57
|
+
width?: number;
|
|
58
|
+
align?: 'left' | 'center' | 'right';
|
|
59
|
+
hidden?: boolean;
|
|
60
|
+
summary?: TableColumnSummary;
|
|
61
|
+
}
|
|
62
|
+
export interface TableSummaryStyle {
|
|
63
|
+
backgroundColor?: string;
|
|
64
|
+
fontWeight?: string;
|
|
65
|
+
fontSize?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface TableProps {
|
|
68
|
+
columns: TableColumn[];
|
|
69
|
+
showHeader?: boolean;
|
|
70
|
+
bordered?: boolean;
|
|
71
|
+
repeatHeader?: boolean;
|
|
72
|
+
showSummary?: boolean;
|
|
73
|
+
summaryMode?: 'page' | 'total';
|
|
74
|
+
summaryLabel?: string;
|
|
75
|
+
summaryStyle?: TableSummaryStyle;
|
|
76
|
+
_pageData?: any[];
|
|
77
|
+
_showHeader?: boolean;
|
|
78
|
+
_isLastPage?: boolean;
|
|
79
|
+
_totalData?: any[];
|
|
80
|
+
}
|
|
81
|
+
export interface ComponentNode {
|
|
82
|
+
id: string;
|
|
83
|
+
type: ComponentType;
|
|
84
|
+
layout: {
|
|
85
|
+
mode: 'absolute' | 'flow';
|
|
86
|
+
xMm?: number;
|
|
87
|
+
yMm?: number;
|
|
88
|
+
widthMm?: number;
|
|
89
|
+
heightMm?: number;
|
|
90
|
+
zIndex?: number;
|
|
91
|
+
};
|
|
92
|
+
style?: Record<string, any>;
|
|
93
|
+
binding?: DataBinding;
|
|
94
|
+
props?: Record<string, any>;
|
|
95
|
+
children?: ComponentNode[];
|
|
96
|
+
}
|
|
97
|
+
export interface PrintTemplate {
|
|
98
|
+
id: string;
|
|
99
|
+
name: string;
|
|
100
|
+
version: string;
|
|
101
|
+
description?: string;
|
|
102
|
+
schemaId: string;
|
|
103
|
+
page: PageConfig;
|
|
104
|
+
layoutMode: 'absolute' | 'flow';
|
|
105
|
+
components: ComponentNode[];
|
|
106
|
+
}
|
|
107
|
+
export interface MockData {
|
|
108
|
+
id: string;
|
|
109
|
+
name: string;
|
|
110
|
+
schemaId?: string;
|
|
111
|
+
templateId?: string;
|
|
112
|
+
data: any;
|
|
113
|
+
description?: string;
|
|
114
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jcyao/print-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Universal Print SDK - Client-side print solution",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.esm.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public",
|
|
11
|
+
"registry": "https://registry.npmjs.org/"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "rollup -c",
|
|
15
|
+
"dev": "rollup -c -w",
|
|
16
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/joker-yjc/printer"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/joker-yjc/printer#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/joker-yjc/printer/issues"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"print",
|
|
28
|
+
"sdk",
|
|
29
|
+
"client-side",
|
|
30
|
+
"template",
|
|
31
|
+
"printer",
|
|
32
|
+
"printing",
|
|
33
|
+
"pdf",
|
|
34
|
+
"browser-print",
|
|
35
|
+
"template-engine",
|
|
36
|
+
"qrcode",
|
|
37
|
+
"barcode",
|
|
38
|
+
"typescript"
|
|
39
|
+
],
|
|
40
|
+
"author": "joke_yao",
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
44
|
+
"@types/qrcode": "^1.5.6",
|
|
45
|
+
"rollup": "^4.9.6",
|
|
46
|
+
"tslib": "^2.6.2",
|
|
47
|
+
"typescript": "^5.3.3"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"decimal.js": "^10.6.0",
|
|
51
|
+
"jsbarcode": "^3.12.3",
|
|
52
|
+
"qrcode": "^1.5.4"
|
|
53
|
+
},
|
|
54
|
+
"files": [
|
|
55
|
+
"dist",
|
|
56
|
+
"README.md",
|
|
57
|
+
"LICENSE"
|
|
58
|
+
]
|
|
59
|
+
}
|