@borurio-print/print-designer 1.0.2 → 1.0.4
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/README.md +130 -128
- package/dist-lib/PrintDesigner.vue.d.ts +26 -1
- package/dist-lib/core/componentRegistry.d.ts +5 -2
- package/dist-lib/core/dataResolver.d.ts +6 -0
- package/dist-lib/core/pdfPageRenderer.d.ts +4 -0
- package/dist-lib/core/printPagination.d.ts +9 -0
- package/dist-lib/core/textBoxLayout.d.ts +13 -0
- package/dist-lib/core/types.d.ts +191 -5
- package/dist-lib/iconfont-DUQHAX2j.js +35 -0
- package/dist-lib/index-1josbkwh.js +10777 -0
- package/dist-lib/index.d.ts +13 -2
- package/dist-lib/{index.es-BwhKze_p.js → index.es-Cyq100NQ.js} +2 -2
- package/dist-lib/index.js +1 -1
- package/dist-lib/locales/en-US.d.ts +120 -0
- package/dist-lib/locales/zh-CN.d.ts +120 -0
- package/dist-lib/pdf-BS8Eyhri.js +19080 -0
- package/dist-lib/{pdfGenerator-cShpHBr8.js → pdfGenerator-CNTPnLGu.js} +1299 -1238
- package/dist-lib/style.css +1 -1
- package/dist-lib/views/print-designer/components/BarcodeSvgElement.vue.d.ts +2 -0
- package/dist-lib/views/print-designer/components/ComponentPanel.vue.d.ts +10 -4
- package/dist-lib/views/print-designer/components/ElementListPanel.vue.d.ts +7 -1
- package/dist-lib/views/print-designer/components/ElementPropertiesPanel.vue.d.ts +2 -0
- package/dist-lib/views/print-designer/components/ImageSvgElement.vue.d.ts +11 -0
- package/dist-lib/views/print-designer/components/PdfPagesRenderer.vue.d.ts +2 -3
- package/dist-lib/views/print-designer/components/PdfSvgElement.vue.d.ts +11 -0
- package/dist-lib/views/print-designer/components/QrcodeSvgElement.vue.d.ts +2 -0
- package/dist-lib/views/print-designer/components/SvgElementsRenderer.vue.d.ts +6 -2
- package/dist-lib/views/print-designer/components/TableSvgElement.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/TemplateInfoPanel.vue.d.ts +2 -1
- package/dist-lib/views/print-designer/components/TextBoxSvgElement.vue.d.ts +15 -0
- package/dist-lib/views/print-designer/components/WorkspaceToolbar.vue.d.ts +4 -0
- package/dist-lib/views/print-designer/components/properties/DisplayTypeProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/LineHeightProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/MinFontSizeProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/PdfCropModeProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/PdfCropRatioProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/PositionProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/TableConfigProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/TextBoxFitModeProperty.vue.d.ts +12 -0
- package/dist-lib/views/print-designer/components/properties/TextBoxOverflowModeProperty.vue.d.ts +12 -0
- package/package.json +14 -9
- package/dist-lib/iconfont-BnrPP-u4.js +0 -35
- package/dist-lib/index-B7uQiXj_.js +0 -6971
package/README.md
CHANGED
|
@@ -1,128 +1,130 @@
|
|
|
1
|
-
# Borurio Print Designer
|
|
2
|
-
|
|
3
|
-
这是一个 Vue 3 标签打印设计器基础项目,同时支持独立 Web/iframe 页面和 npm 组件包两种使用方式。
|
|
4
|
-
|
|
5
|
-
## 入口说明
|
|
6
|
-
|
|
7
|
-
- `src/main.ts`:独立 Web/iframe 入口,创建 Vue 应用并挂载到 `#app`。
|
|
8
|
-
- `src/index.ts`:npm 包入口,只导出组件、类型和语言包,不创建应用。
|
|
9
|
-
- `src/PrintDesigner.vue`:设计器根组件,持有模板、网格和缩放状态。
|
|
10
|
-
|
|
11
|
-
## 目录职责
|
|
12
|
-
|
|
13
|
-
- `src/components`:可跨业务模块复用的基础组件,目前包含 Symbol 图标组件。
|
|
14
|
-
- `src/core`:与界面无关的领域类型。
|
|
15
|
-
- `src/locales`:中英文语言包及独立 Web 模式的 i18n 实例。
|
|
16
|
-
- `src/views/print-designer/components`:打印设计器内部使用的界面组件。
|
|
17
|
-
- `src/assets/iconfont`:Iconfont 平台生成的本地 Symbol 脚本,不建议手动修改。
|
|
18
|
-
|
|
19
|
-
## 构建配置
|
|
20
|
-
|
|
21
|
-
- `vite.config.ts`:生成可部署到服务器并通过 iframe 打开的 `dist`。
|
|
22
|
-
- `vite.lib.config.ts`:从 `src/index.ts` 生成 npm 使用的 `dist-lib`。
|
|
23
|
-
- `tsconfig.app.json`:检查 Web 应用源码,不输出文件。
|
|
24
|
-
- `tsconfig.lib.json`:为 npm 包生成 TypeScript 声明文件。
|
|
25
|
-
- `tsconfig.node.json`:检查 Vite 配置文件。
|
|
26
|
-
|
|
27
|
-
## 常用命令
|
|
28
|
-
|
|
29
|
-
- `pnpm dev`:启动本地 Web 开发服务。
|
|
30
|
-
- `pnpm build:web`:构建 iframe/Web 版本并执行类型检查。
|
|
31
|
-
- `pnpm build:lib`:构建 npm 版本并生成类型声明。
|
|
32
|
-
- `pnpm build`:依次构建 npm 和 Web 两种版本。
|
|
33
|
-
|
|
34
|
-
## npm 包使用
|
|
35
|
-
|
|
36
|
-
当前包名为 `@borurio-print/print-designer`。业务项目需要已安装下列 peer dependencies:
|
|
37
|
-
|
|
38
|
-
- Vue `>=3.2.45 <4.0.0`
|
|
39
|
-
- Element Plus `>=2.3.2 <3.0.0`
|
|
40
|
-
- vue-i18n `>=9.2.2 <12.0.0`
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
npm install @borurio-print/print-designer
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
如果业务项目尚未安装上述 peer dependencies,再按 npm 提示补充安装。
|
|
47
|
-
二维码、条形码和 PDF 生成库已包含在设计器产物中,业务项目无需另行安装。
|
|
48
|
-
|
|
49
|
-
在 Vue 页面中引入组件和独立样式文件:
|
|
50
|
-
|
|
51
|
-
```vue
|
|
52
|
-
<script setup lang="ts">
|
|
53
|
-
import { PrintDesigner } from '@borurio-print/print-designer'
|
|
54
|
-
import '@borurio-print/print-designer/style.css'
|
|
55
|
-
</script>
|
|
56
|
-
|
|
57
|
-
<template>
|
|
58
|
-
<div class="print-designer-page">
|
|
59
|
-
<PrintDesigner />
|
|
60
|
-
</div>
|
|
61
|
-
</template>
|
|
62
|
-
|
|
63
|
-
<style scoped>
|
|
64
|
-
.print-designer-page {
|
|
65
|
-
width: 100%;
|
|
66
|
-
height: 100vh;
|
|
67
|
-
}
|
|
68
|
-
</style>
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
组件使用业务应用已经注册的 `vue-i18n` 实例。业务应用需要把组件语言包合并到
|
|
72
|
-
对应语言中:
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
import { createI18n } from 'vue-i18n'
|
|
76
|
-
import {
|
|
77
|
-
enUS as printDesignerEnUS,
|
|
78
|
-
zhCN as printDesignerZhCN,
|
|
79
|
-
} from '@borurio-print/print-designer'
|
|
80
|
-
|
|
81
|
-
const i18n = createI18n({
|
|
82
|
-
legacy: false,
|
|
83
|
-
locale: 'zh-CN',
|
|
84
|
-
messages: {
|
|
85
|
-
'zh-CN': printDesignerZhCN,
|
|
86
|
-
'en-US': printDesignerEnUS,
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
app.use(i18n)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
如果业务应用已经存在语言包,可以使用 `mergeLocaleMessage` 合并,避免覆盖原有文案:
|
|
94
|
-
|
|
95
|
-
```ts
|
|
96
|
-
i18n.global.mergeLocaleMessage('zh-CN', printDesignerZhCN)
|
|
97
|
-
i18n.global.mergeLocaleMessage('en-US', printDesignerEnUS)
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
如果业务系统使用 `zh-cn` 和 `en` 作为语言代码,则按实际代码合并:
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
i18n.global.mergeLocaleMessage('zh-cn', printDesignerZhCN)
|
|
104
|
-
i18n.global.mergeLocaleMessage('en', printDesignerEnUS)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## npm 发布
|
|
108
|
-
|
|
109
|
-
首次发布前,需要确认当前 npm 账号拥有 `@borurio-print` 组织作用域的发布权限。先登录并检查
|
|
110
|
-
即将进入安装包的文件:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
npm login
|
|
114
|
-
pnpm build:lib
|
|
115
|
-
npm pack --dry-run
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
确认内容无误后发布公开包:
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
pnpm publish --access public
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
同一个版本号不能重复发布;后续修改需要先更新 `package.json` 中的版本号。
|
|
125
|
-
|
|
126
|
-
## 自动生成文件
|
|
127
|
-
|
|
128
|
-
`src/auto-imports.d.ts` 和 `src/components.d.ts` 由自动按需引入插件生成;`pnpm-lock.yaml` 由 pnpm 生成。这些文件不应手动添加说明或修改内容。
|
|
1
|
+
# Borurio Print Designer
|
|
2
|
+
|
|
3
|
+
这是一个 Vue 3 标签打印设计器基础项目,同时支持独立 Web/iframe 页面和 npm 组件包两种使用方式。
|
|
4
|
+
|
|
5
|
+
## 入口说明
|
|
6
|
+
|
|
7
|
+
- `src/main.ts`:独立 Web/iframe 入口,创建 Vue 应用并挂载到 `#app`。
|
|
8
|
+
- `src/index.ts`:npm 包入口,只导出组件、类型和语言包,不创建应用。
|
|
9
|
+
- `src/PrintDesigner.vue`:设计器根组件,持有模板、网格和缩放状态。
|
|
10
|
+
|
|
11
|
+
## 目录职责
|
|
12
|
+
|
|
13
|
+
- `src/components`:可跨业务模块复用的基础组件,目前包含 Symbol 图标组件。
|
|
14
|
+
- `src/core`:与界面无关的领域类型。
|
|
15
|
+
- `src/locales`:中英文语言包及独立 Web 模式的 i18n 实例。
|
|
16
|
+
- `src/views/print-designer/components`:打印设计器内部使用的界面组件。
|
|
17
|
+
- `src/assets/iconfont`:Iconfont 平台生成的本地 Symbol 脚本,不建议手动修改。
|
|
18
|
+
|
|
19
|
+
## 构建配置
|
|
20
|
+
|
|
21
|
+
- `vite.config.ts`:生成可部署到服务器并通过 iframe 打开的 `dist`。
|
|
22
|
+
- `vite.lib.config.ts`:从 `src/index.ts` 生成 npm 使用的 `dist-lib`。
|
|
23
|
+
- `tsconfig.app.json`:检查 Web 应用源码,不输出文件。
|
|
24
|
+
- `tsconfig.lib.json`:为 npm 包生成 TypeScript 声明文件。
|
|
25
|
+
- `tsconfig.node.json`:检查 Vite 配置文件。
|
|
26
|
+
|
|
27
|
+
## 常用命令
|
|
28
|
+
|
|
29
|
+
- `pnpm dev`:启动本地 Web 开发服务。
|
|
30
|
+
- `pnpm build:web`:构建 iframe/Web 版本并执行类型检查。
|
|
31
|
+
- `pnpm build:lib`:构建 npm 版本并生成类型声明。
|
|
32
|
+
- `pnpm build`:依次构建 npm 和 Web 两种版本。
|
|
33
|
+
|
|
34
|
+
## npm 包使用
|
|
35
|
+
|
|
36
|
+
当前包名为 `@borurio-print/print-designer`。业务项目需要已安装下列 peer dependencies:
|
|
37
|
+
|
|
38
|
+
- Vue `>=3.2.45 <4.0.0`
|
|
39
|
+
- Element Plus `>=2.3.2 <3.0.0`
|
|
40
|
+
- vue-i18n `>=9.2.2 <12.0.0`
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install @borurio-print/print-designer
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
如果业务项目尚未安装上述 peer dependencies,再按 npm 提示补充安装。
|
|
47
|
+
二维码、条形码和 PDF 生成库已包含在设计器产物中,业务项目无需另行安装。
|
|
48
|
+
|
|
49
|
+
在 Vue 页面中引入组件和独立样式文件:
|
|
50
|
+
|
|
51
|
+
```vue
|
|
52
|
+
<script setup lang="ts">
|
|
53
|
+
import { PrintDesigner } from '@borurio-print/print-designer'
|
|
54
|
+
import '@borurio-print/print-designer/style.css'
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<template>
|
|
58
|
+
<div class="print-designer-page">
|
|
59
|
+
<PrintDesigner />
|
|
60
|
+
</div>
|
|
61
|
+
</template>
|
|
62
|
+
|
|
63
|
+
<style scoped>
|
|
64
|
+
.print-designer-page {
|
|
65
|
+
width: 100%;
|
|
66
|
+
height: 100vh;
|
|
67
|
+
}
|
|
68
|
+
</style>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
组件使用业务应用已经注册的 `vue-i18n` 实例。业务应用需要把组件语言包合并到
|
|
72
|
+
对应语言中:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { createI18n } from 'vue-i18n'
|
|
76
|
+
import {
|
|
77
|
+
enUS as printDesignerEnUS,
|
|
78
|
+
zhCN as printDesignerZhCN,
|
|
79
|
+
} from '@borurio-print/print-designer'
|
|
80
|
+
|
|
81
|
+
const i18n = createI18n({
|
|
82
|
+
legacy: false,
|
|
83
|
+
locale: 'zh-CN',
|
|
84
|
+
messages: {
|
|
85
|
+
'zh-CN': printDesignerZhCN,
|
|
86
|
+
'en-US': printDesignerEnUS,
|
|
87
|
+
},
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
app.use(i18n)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
如果业务应用已经存在语言包,可以使用 `mergeLocaleMessage` 合并,避免覆盖原有文案:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
i18n.global.mergeLocaleMessage('zh-CN', printDesignerZhCN)
|
|
97
|
+
i18n.global.mergeLocaleMessage('en-US', printDesignerEnUS)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
如果业务系统使用 `zh-cn` 和 `en` 作为语言代码,则按实际代码合并:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
i18n.global.mergeLocaleMessage('zh-cn', printDesignerZhCN)
|
|
104
|
+
i18n.global.mergeLocaleMessage('en', printDesignerEnUS)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## npm 发布
|
|
108
|
+
|
|
109
|
+
首次发布前,需要确认当前 npm 账号拥有 `@borurio-print` 组织作用域的发布权限。先登录并检查
|
|
110
|
+
即将进入安装包的文件:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npm login
|
|
114
|
+
pnpm build:lib
|
|
115
|
+
npm pack --dry-run
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
确认内容无误后发布公开包:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
pnpm publish --access public
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
同一个版本号不能重复发布;后续修改需要先更新 `package.json` 中的版本号。
|
|
125
|
+
|
|
126
|
+
## 自动生成文件
|
|
127
|
+
|
|
128
|
+
`src/auto-imports.d.ts` 和 `src/components.d.ts` 由自动按需引入插件生成;`pnpm-lock.yaml` 由 pnpm 生成。这些文件不应手动添加说明或修改内容。
|
|
129
|
+
|
|
130
|
+
pnpm publish --access public
|
|
@@ -1,3 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
import type { BusinessFieldGroup, PrintResult, PrintTemplate } from '@/core/types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
/**
|
|
4
|
+
* 由业务系统提供的可打印字段目录。
|
|
5
|
+
* 设计器只保存字段路径和用户最终选择的展示类型,不感知 WMS、OMS 业务含义。
|
|
6
|
+
*/
|
|
7
|
+
fieldGroups?: readonly BusinessFieldGroup[];
|
|
8
|
+
};
|
|
9
|
+
declare function getTemplate(): PrintTemplate;
|
|
10
|
+
declare function loadTemplate(template: PrintTemplate): void;
|
|
11
|
+
/** 供业务系统获取 PDF Blob,后续可直接传给本地打印控件。 */
|
|
12
|
+
declare function generatePdf(data: unknown): Promise<Blob>;
|
|
13
|
+
/** 供业务系统直接在浏览器中打开数据打印预览。 */
|
|
14
|
+
declare function previewPdf(data: unknown): Promise<void>;
|
|
15
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
16
|
+
getTemplate: typeof getTemplate;
|
|
17
|
+
loadTemplate: typeof loadTemplate;
|
|
18
|
+
generatePdf: typeof generatePdf;
|
|
19
|
+
previewPdf: typeof previewPdf;
|
|
20
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
21
|
+
"print-result": (result: PrintResult) => any;
|
|
22
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
23
|
+
"onPrint-result"?: (result: PrintResult) => any;
|
|
24
|
+
}>, {
|
|
25
|
+
fieldGroups: readonly BusinessFieldGroup[];
|
|
26
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
2
27
|
declare const _default: typeof __VLS_export;
|
|
3
28
|
export default _default;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DesignerElementType, ElementPropertyConfig, ElementPropertyKey } from './types';
|
|
2
|
+
export type ComponentGroup = 'basic' | 'advanced';
|
|
2
3
|
/**
|
|
3
4
|
* 一个左侧组件的完整能力声明。
|
|
4
5
|
* properties 的顺序同时决定右侧属性编辑器的展示顺序,因此每个组件都能
|
|
@@ -6,6 +7,7 @@ import type { DesignerElementType, ElementPropertyConfig, ElementPropertyKey } f
|
|
|
6
7
|
*/
|
|
7
8
|
export interface ComponentDefinition {
|
|
8
9
|
field: DesignerElementType;
|
|
10
|
+
group: ComponentGroup;
|
|
9
11
|
icon: string;
|
|
10
12
|
titleKey: string;
|
|
11
13
|
properties: readonly ElementPropertyConfig[];
|
|
@@ -13,9 +15,10 @@ export interface ComponentDefinition {
|
|
|
13
15
|
/**
|
|
14
16
|
* 设计器组件注册表。
|
|
15
17
|
*
|
|
16
|
-
* -
|
|
17
|
-
* -
|
|
18
|
+
* - 文字开放内容、字号、加粗和旋转;文字框额外开放固定区域排版能力。
|
|
19
|
+
* - 二维码、条形码、图片开放内容、宽度、高度和旋转。
|
|
18
20
|
* - 边框开放宽高、线宽和旋转;横线、竖线只开放各自长度方向与线宽。
|
|
21
|
+
* - 表格开放坐标、宽高、列配置、字体、边框线宽和旋转。
|
|
19
22
|
* - 序号和时间暂时保留空属性数组,维持原有入口但不提前引入未完成逻辑。
|
|
20
23
|
*/
|
|
21
24
|
export declare const componentItems: readonly ComponentDefinition[];
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isRecord(value: unknown): value is Record<string, unknown>;
|
|
2
|
+
export declare function getValueByPath(source: unknown, path: string | undefined): unknown;
|
|
3
|
+
export declare function getRecordArrayByPath(source: unknown, path: string | undefined): Record<string, unknown>[];
|
|
4
|
+
export declare function formatFieldValue(value: unknown): string;
|
|
5
|
+
/** 将文字中的 {field.path} 占位符替换为当前业务记录中的字段值。 */
|
|
6
|
+
export declare function resolveFieldTemplate(template: string, source: unknown): string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** 将 PDF 指定页转换为可嵌入 SVG 的图片,并复用相同配置的渲染结果。 */
|
|
2
|
+
export declare function renderPdfPageToDataUrl(source: string, pageNumber: number, widthMm: number, heightMm: number): Promise<string>;
|
|
3
|
+
/** 打印前等待画布内已经发起的 PDF 页面渲染完成。 */
|
|
4
|
+
export declare function waitForPendingPdfRenders(): Promise<void>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DesignerElement, PrintRenderPage, TemplateMode } from './types';
|
|
2
|
+
interface PaginationOptions {
|
|
3
|
+
templateMode: TemplateMode;
|
|
4
|
+
firstElements: DesignerElement[];
|
|
5
|
+
continuationElements: DesignerElement[];
|
|
6
|
+
}
|
|
7
|
+
export declare function buildPrintRenderPages(data: unknown, options: PaginationOptions): PrintRenderPage[];
|
|
8
|
+
export declare function buildRepeatedPrintPages(pageCount: number, options: PaginationOptions): PrintRenderPage[];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { TextBoxDesignerElement } from './types';
|
|
2
|
+
export interface TextBoxLayoutResult {
|
|
3
|
+
lines: string[];
|
|
4
|
+
fontSizePt: number;
|
|
5
|
+
fontSizeMm: number;
|
|
6
|
+
lineHeightMm: number;
|
|
7
|
+
truncated: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 把运行时文字排入固定毫米矩形。设计画布和 PDF 共用该结果,避免预览与打印
|
|
11
|
+
* 分别依赖 CSS/SVG 的隐式换行规则而产生差异。
|
|
12
|
+
*/
|
|
13
|
+
export declare function layoutTextBox(element: TextBoxDesignerElement, content: string): TextBoxLayoutResult;
|
package/dist-lib/core/types.d.ts
CHANGED
|
@@ -3,9 +3,64 @@ export interface TemplateSize {
|
|
|
3
3
|
widthMm: number;
|
|
4
4
|
heightMm: number;
|
|
5
5
|
}
|
|
6
|
+
/** 模板打印模式:单模板所有页复用一套画布,双模板区分首页和续页。 */
|
|
7
|
+
export type TemplateMode = 'single' | 'dual';
|
|
8
|
+
/** 双模板模式下可编辑的模板页。 */
|
|
9
|
+
export type TemplatePage = 'first' | 'continuation';
|
|
6
10
|
/** 当前标签模板的基础信息。 */
|
|
7
11
|
export interface TemplateInfo extends TemplateSize {
|
|
8
12
|
name: string;
|
|
13
|
+
mode: TemplateMode;
|
|
14
|
+
}
|
|
15
|
+
/** 设计器保存和读取的完整模板快照。 */
|
|
16
|
+
export interface PrintTemplate {
|
|
17
|
+
version: 1;
|
|
18
|
+
info: TemplateInfo;
|
|
19
|
+
pages: Record<TemplatePage, DesignerElement[]>;
|
|
20
|
+
}
|
|
21
|
+
/** 打印阶段传给单个表格元素的真实业务数据。 */
|
|
22
|
+
export interface TableRuntimeGroup {
|
|
23
|
+
/** 原始分组数组中的下标,用于跨页后仍显示连续序号。 */
|
|
24
|
+
index: number;
|
|
25
|
+
record: Record<string, unknown>;
|
|
26
|
+
rows: Record<string, unknown>[];
|
|
27
|
+
}
|
|
28
|
+
export interface TableRuntimeData {
|
|
29
|
+
groups?: TableRuntimeGroup[];
|
|
30
|
+
rows?: Record<string, unknown>[];
|
|
31
|
+
}
|
|
32
|
+
/** 已完成分页的一张打印页。 */
|
|
33
|
+
export interface PrintRenderPage {
|
|
34
|
+
elements: DesignerElement[];
|
|
35
|
+
/** 当前打印页对应的根业务记录;同一记录拆分出的续页共享该数据。 */
|
|
36
|
+
data?: Record<string, unknown>;
|
|
37
|
+
tableData: Record<string, TableRuntimeData>;
|
|
38
|
+
}
|
|
39
|
+
/** 设计器完成 PDF 预览或内部测试打印后通知业务系统的结果。 */
|
|
40
|
+
export interface PrintResult {
|
|
41
|
+
success: boolean;
|
|
42
|
+
action: 'preview' | 'testPrint';
|
|
43
|
+
pageCount: number;
|
|
44
|
+
blob?: Blob;
|
|
45
|
+
error?: unknown;
|
|
46
|
+
}
|
|
47
|
+
/** 业务字段目前允许在标签中使用的三种展示方式。 */
|
|
48
|
+
export type FieldElementType = 'text' | 'textBox' | 'qrcode' | 'barcode';
|
|
49
|
+
/**
|
|
50
|
+
* 由业务系统传给设计器的字段定义。
|
|
51
|
+
*
|
|
52
|
+
* field 是打印时读取业务数据的字段路径,label 只负责设计器中的可读名称,
|
|
53
|
+
* type 决定字段第一次添加到画布时采用哪一种展示方式。
|
|
54
|
+
*/
|
|
55
|
+
export interface BusinessField {
|
|
56
|
+
field: string;
|
|
57
|
+
label: string;
|
|
58
|
+
type: FieldElementType;
|
|
59
|
+
}
|
|
60
|
+
/** 左侧字段列表的分组;不同业务系统可以传入完全不同的分组和字段。 */
|
|
61
|
+
export interface BusinessFieldGroup {
|
|
62
|
+
label: string;
|
|
63
|
+
fields: readonly BusinessField[];
|
|
9
64
|
}
|
|
10
65
|
/**
|
|
11
66
|
* 设计器支持的组件类型。
|
|
@@ -13,9 +68,9 @@ export interface TemplateInfo extends TemplateSize {
|
|
|
13
68
|
* 这里保留尚未实现编辑能力的组件类型,是为了让左侧组件注册表始终使用
|
|
14
69
|
* 稳定的业务标识;后续实现方框、线条等组件时不需要修改已有模板字段。
|
|
15
70
|
*/
|
|
16
|
-
export type DesignerElementType = 'text' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'serialNumber' | 'pageNumber' | 'time';
|
|
71
|
+
export type DesignerElementType = 'text' | 'textBox' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'image' | 'serialNumber' | 'pageNumber' | 'time' | 'table' | 'pdf';
|
|
17
72
|
/** 右侧属性面板中可独立组合的属性编辑器标识。 */
|
|
18
|
-
export type ElementPropertyKey = 'content' | 'width' | 'height' | 'fontSize' | 'fontWeight' | 'strokeWidth' | 'rotation' | 'timeMode' | 'includeTime' | 'fixedTime';
|
|
73
|
+
export type ElementPropertyKey = 'displayType' | 'content' | 'textBoxFitMode' | 'textBoxOverflowMode' | 'lineHeight' | 'minFontSize' | 'imageSource' | 'x' | 'y' | 'width' | 'height' | 'fontSize' | 'fontWeight' | 'strokeWidth' | 'rotation' | 'timeMode' | 'includeTime' | 'fixedTime' | 'tableConfig' | 'pdfSource' | 'pdfCropMode' | 'pdfCropRatio';
|
|
19
74
|
/**
|
|
20
75
|
* 单个属性编辑器的能力与数值约束。
|
|
21
76
|
* 数值范围跟随组件类型配置,输入框和 SVG 控制点共用,避免两处规则不一致。
|
|
@@ -36,7 +91,7 @@ export interface ElementPropertyConfig {
|
|
|
36
91
|
*/
|
|
37
92
|
export interface BaseDesignerElement {
|
|
38
93
|
id: string;
|
|
39
|
-
type: 'text' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'serialNumber' | 'pageNumber' | 'time';
|
|
94
|
+
type: 'text' | 'textBox' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'image' | 'serialNumber' | 'pageNumber' | 'time' | 'table' | 'pdf';
|
|
40
95
|
xMm: number;
|
|
41
96
|
yMm: number;
|
|
42
97
|
widthMm: number;
|
|
@@ -47,6 +102,8 @@ export interface BaseDesignerElement {
|
|
|
47
102
|
/** 普通文字元素独有的排版属性。 */
|
|
48
103
|
export interface TextDesignerElement extends BaseDesignerElement {
|
|
49
104
|
type: 'text';
|
|
105
|
+
/** 存在 field 时,打印阶段从业务数据读取;普通固定文字不设置该字段。 */
|
|
106
|
+
field?: string;
|
|
50
107
|
content: string;
|
|
51
108
|
fontSizePt: number;
|
|
52
109
|
fontWeight: 400 | 700;
|
|
@@ -78,12 +135,31 @@ export type TextStyleDesignerElement = TextDesignerElement | SerialNumberDesigne
|
|
|
78
135
|
/** 二维码首期只保存内容;纠错等级等高级选项可继续独立注册为属性。 */
|
|
79
136
|
export interface QrcodeDesignerElement extends BaseDesignerElement {
|
|
80
137
|
type: 'qrcode';
|
|
138
|
+
field?: string;
|
|
81
139
|
content: string;
|
|
82
140
|
}
|
|
83
141
|
/** 条形码首期固定使用通用的 CODE128 编码。 */
|
|
84
142
|
export interface BarcodeDesignerElement extends BaseDesignerElement {
|
|
85
143
|
type: 'barcode';
|
|
144
|
+
field?: string;
|
|
145
|
+
content: string;
|
|
146
|
+
}
|
|
147
|
+
/** 图片元素保存图片地址或 data URL,由 SVG image 负责保持原图比例渲染。 */
|
|
148
|
+
export interface ImageDesignerElement extends BaseDesignerElement {
|
|
149
|
+
type: 'image';
|
|
150
|
+
field?: string;
|
|
151
|
+
content: string;
|
|
152
|
+
}
|
|
153
|
+
/** PDF 页面在固定元素区域内的裁切方式。 */
|
|
154
|
+
export type PdfCropMode = 'none' | 'currentSize' | 'scale' | 'cropWidth' | 'cropHeight';
|
|
155
|
+
/** PDF 元素显示指定文件中的一页,打印前会将该页渲染进模板 SVG。 */
|
|
156
|
+
export interface PdfDesignerElement extends BaseDesignerElement {
|
|
157
|
+
type: 'pdf';
|
|
158
|
+
/** 支持同源/CORS 地址、Blob URL 或 data URL。 */
|
|
86
159
|
content: string;
|
|
160
|
+
cropMode: PdfCropMode;
|
|
161
|
+
/** 等比例缩放、裁切宽度和裁切高度使用的百分比。 */
|
|
162
|
+
cropRatio: number;
|
|
87
163
|
}
|
|
88
164
|
/** 无填充边框元素,strokeWidthMm 表示实际打印线宽。 */
|
|
89
165
|
export interface RectangleDesignerElement extends BaseDesignerElement {
|
|
@@ -98,10 +174,120 @@ export interface LineDesignerElement extends BaseDesignerElement {
|
|
|
98
174
|
type: 'horizontalLine' | 'verticalLine';
|
|
99
175
|
strokeWidthMm: number;
|
|
100
176
|
}
|
|
177
|
+
export type TableColumnAlign = 'left' | 'center' | 'right';
|
|
178
|
+
export type TableMode = 'normal' | 'groupedDetail';
|
|
179
|
+
export type TableColumnType = 'text' | 'serialNumber' | 'image';
|
|
180
|
+
export type TableColumnWidthMode = 'auto' | 'fixed';
|
|
181
|
+
/** 表格单列配置;自适应列平分剩余宽度,固定列优先使用指定毫米宽度。 */
|
|
182
|
+
export interface TableColumn {
|
|
183
|
+
id: string;
|
|
184
|
+
type: TableColumnType;
|
|
185
|
+
/** 相邻列设置相同分组名称时,会合并成上层分组表头。 */
|
|
186
|
+
groupTitle: string;
|
|
187
|
+
title: string;
|
|
188
|
+
content: string;
|
|
189
|
+
widthMode: TableColumnWidthMode;
|
|
190
|
+
widthMm?: number;
|
|
191
|
+
minWidthMm: number;
|
|
192
|
+
/** 兼容旧版比例列宽,读入旧模板时会自动归一化成自适应列。 */
|
|
193
|
+
widthRatio?: number;
|
|
194
|
+
/** 表头文字的水平对齐方式,独立于内容单元格。 */
|
|
195
|
+
headerAlign: TableColumnAlign;
|
|
196
|
+
align: TableColumnAlign;
|
|
197
|
+
/** 打印控件后续可根据该字段从数组行数据中取值。 */
|
|
198
|
+
field?: string;
|
|
199
|
+
}
|
|
200
|
+
/** 分组明细表格的分组标题行单元格配置。 */
|
|
201
|
+
export interface TableGroupHeaderCell {
|
|
202
|
+
id: string;
|
|
203
|
+
content: string;
|
|
204
|
+
/** 打印控件后续可根据分组数据读取字段值。 */
|
|
205
|
+
field?: string;
|
|
206
|
+
widthMode: TableColumnWidthMode;
|
|
207
|
+
widthMm?: number;
|
|
208
|
+
minWidthMm: number;
|
|
209
|
+
/** 兼容旧版比例列宽,读入旧模板时会自动归一化成自适应列。 */
|
|
210
|
+
widthRatio?: number;
|
|
211
|
+
align: TableColumnAlign;
|
|
212
|
+
}
|
|
213
|
+
/** 右侧表格配置属性一次性提交的可编辑内容。 */
|
|
214
|
+
export interface TableConfigValue {
|
|
215
|
+
mode: TableMode;
|
|
216
|
+
/** 打印控件后续从业务数据中读取表格数组的字段路径。 */
|
|
217
|
+
field?: string;
|
|
218
|
+
/** 分组明细模式下读取分组数组的字段路径。 */
|
|
219
|
+
groupField?: string;
|
|
220
|
+
/** 分组明细模式下在每个分组内读取明细数组的字段路径。 */
|
|
221
|
+
detailField?: string;
|
|
222
|
+
showHeader: boolean;
|
|
223
|
+
showBorder: boolean;
|
|
224
|
+
repeatHeader: boolean;
|
|
225
|
+
headerBackground: string;
|
|
226
|
+
groupHeaderRowHeightMm: number;
|
|
227
|
+
headerRowHeightMm: number;
|
|
228
|
+
bodyRowHeightMm: number;
|
|
229
|
+
previewGroupCount: number;
|
|
230
|
+
previewRowCount: number;
|
|
231
|
+
groupHeaderCells: TableGroupHeaderCell[];
|
|
232
|
+
columns: TableColumn[];
|
|
233
|
+
}
|
|
234
|
+
/** 表格作为单个元素拖动和缩放,内部列配置由右侧属性面板维护。 */
|
|
235
|
+
export interface TableDesignerElement extends BaseDesignerElement {
|
|
236
|
+
type: 'table';
|
|
237
|
+
mode: TableMode;
|
|
238
|
+
/** 打印控件后续从业务数据中读取表格数组的字段路径。 */
|
|
239
|
+
field?: string;
|
|
240
|
+
/** 分组明细模式下读取分组数组的字段路径。 */
|
|
241
|
+
groupField?: string;
|
|
242
|
+
/** 分组明细模式下在每个分组内读取明细数组的字段路径。 */
|
|
243
|
+
detailField?: string;
|
|
244
|
+
columns: TableColumn[];
|
|
245
|
+
groupHeaderCells: TableGroupHeaderCell[];
|
|
246
|
+
showHeader: boolean;
|
|
247
|
+
showBorder: boolean;
|
|
248
|
+
repeatHeader: boolean;
|
|
249
|
+
headerBackground: string;
|
|
250
|
+
groupHeaderRowHeightMm: number;
|
|
251
|
+
headerRowHeightMm: number;
|
|
252
|
+
bodyRowHeightMm: number;
|
|
253
|
+
previewGroupCount: number;
|
|
254
|
+
previewRowCount: number;
|
|
255
|
+
strokeWidthMm: number;
|
|
256
|
+
fontSizePt: number;
|
|
257
|
+
fontWeight: 400 | 700;
|
|
258
|
+
}
|
|
259
|
+
/** 文字框在固定区域内放不下内容时采用的尺寸适配方式。 */
|
|
260
|
+
export type TextBoxFitMode = 'fixed' | 'shrinkFont';
|
|
261
|
+
/** 固定区域在最小字号下仍放不下内容时采用的溢出方式。 */
|
|
262
|
+
export type TextBoxOverflowMode = 'clip' | 'ellipsis';
|
|
263
|
+
/**
|
|
264
|
+
* 多行文字框使用固定毫米宽高进行排版。
|
|
265
|
+
* 与普通文字不同,拖动控制点只改变文本框,不会同步缩放字号。
|
|
266
|
+
*/
|
|
267
|
+
export interface TextBoxDesignerElement extends BaseDesignerElement {
|
|
268
|
+
type: 'textBox';
|
|
269
|
+
/** 存在 field 时,打印阶段从业务数据读取;普通固定文字框不设置该字段。 */
|
|
270
|
+
field?: string;
|
|
271
|
+
content: string;
|
|
272
|
+
fontSizePt: number;
|
|
273
|
+
fontWeight: 400 | 700;
|
|
274
|
+
/** 行高相对于字号毫米高度的倍数。 */
|
|
275
|
+
lineHeight: number;
|
|
276
|
+
fitMode: TextBoxFitMode;
|
|
277
|
+
overflowMode: TextBoxOverflowMode;
|
|
278
|
+
/** shrinkFont 模式允许缩小到的最小字号。 */
|
|
279
|
+
minFontSizePt: number;
|
|
280
|
+
}
|
|
101
281
|
/** 当前已经具备创建、属性编辑和 SVG 渲染能力的元素集合。 */
|
|
102
|
-
export type DesignerElement = TextDesignerElement | RectangleDesignerElement | LineDesignerElement | QrcodeDesignerElement | BarcodeDesignerElement | SerialNumberDesignerElement | PageNumberDesignerElement | TimeDesignerElement;
|
|
282
|
+
export type DesignerElement = TextDesignerElement | TextBoxDesignerElement | RectangleDesignerElement | LineDesignerElement | QrcodeDesignerElement | BarcodeDesignerElement | ImageDesignerElement | SerialNumberDesignerElement | PageNumberDesignerElement | TimeDesignerElement | TableDesignerElement | PdfDesignerElement;
|
|
283
|
+
/** 设计器运行期间保存的元素剪贴板快照。 */
|
|
284
|
+
export interface ElementClipboardItem {
|
|
285
|
+
id: string;
|
|
286
|
+
label: string;
|
|
287
|
+
element: DesignerElement;
|
|
288
|
+
}
|
|
103
289
|
/** 独立属性编辑器使用的统一值类型。 */
|
|
104
|
-
export type ElementPropertyValue = string | number | boolean;
|
|
290
|
+
export type ElementPropertyValue = string | number | boolean | TableConfigValue;
|
|
105
291
|
/** SVG 选区八个缩放控制点的稳定标识。 */
|
|
106
292
|
export type ResizeHandle = 'topLeft' | 'top' | 'topRight' | 'right' | 'bottomRight' | 'bottom' | 'bottomLeft' | 'left';
|
|
107
293
|
/**
|