@printstack/print-studio 0.1.1 → 0.1.3
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 +129 -162
- package/assets/{render.worker-Ch4qWx3S.js → render.worker-Dl59Xk1a.js} +9 -9
- package/{cloneDeep-PCw2ErRl.js → cloneDeep-waBDTGc3.js} +9 -4
- package/components/button-group/ButtonGroup.d.ts +1 -1
- package/components/print-s-logo/print-s-logo.vue.d.ts +1 -1
- package/components/s-form/types.d.ts +1 -1
- package/core/coordinate-space.d.ts +16 -0
- package/core/document-model.d.ts +1 -1
- package/core/element-registry.d.ts +3 -8
- package/core/index.d.ts +1 -0
- package/core/page-extensions.d.ts +1 -1
- package/core/types.d.ts +8 -0
- package/core.js +10 -10
- package/designer/commands/menu-adapter.d.ts +3 -3
- package/designer/commands/menu-types.d.ts +8 -1
- package/designer/commands/types.d.ts +2 -0
- package/designer/components/fields/use-table-draft.d.ts +0 -4
- package/designer/components/panels/layer-row-types.d.ts +37 -0
- package/designer/components/panels/layer-row.vue.d.ts +17 -0
- package/designer/components/stage/marquee-overlay.vue.d.ts +8 -0
- package/designer/components/stage/node-style.d.ts +3 -0
- package/designer/components/stage/selection-member.vue.d.ts +14 -0
- package/designer/composables/use-theme.d.ts +3 -0
- package/designer/facade/editing.d.ts +2 -2
- package/designer/facade/entities.d.ts +1160 -26
- package/designer/facade/use-print-studio.d.ts +1 -1
- package/designer/frame/view.d.ts +2 -0
- package/designer/interactions/marquee.d.ts +1 -1
- package/designer/interactions/move.d.ts +3 -1
- package/designer/mount-print-designer.d.ts +1 -1
- package/designer/plugins/plugin-manager.d.ts +3 -3
- package/designer/plugins/types.d.ts +1 -1
- package/designer/stores/document-store.d.ts +72 -0
- package/designer/stores/editor-store.d.ts +772 -16
- package/designer/stores/page-store.d.ts +25 -1
- package/designer/stores/selection-store.d.ts +1 -1
- package/designer/stores/template-store.d.ts +52 -4
- package/designer/stores/types.d.ts +1 -0
- package/designer/stores/ui-store.d.ts +232 -3
- package/designer/stores/view-store.d.ts +10 -1
- package/designer.d.ts +1 -1
- package/designer.js +3 -3
- package/elements/index.d.ts +2 -4
- package/elements/table/table-style.d.ts +3 -10
- package/{registries-dZq8MewR.js → elements-YX-XUHtf.js} +2510 -3069
- package/host-oKlYakgn.js +123 -0
- package/index.d.ts +3 -1
- package/index.js +9 -8
- package/locales/runtime.d.ts +7 -2
- package/locales/translations/zh-CN/designer.json.d.ts +9 -4
- package/{mount-print-designer-BLgVZOnm.js → mount-print-designer-CAqO0T0k.js} +4 -4
- package/{mount-print-preview-D7M-1AqH.js → mount-print-preview-DgDHL3E8.js} +4 -3
- package/package.json +19 -2
- package/parser/index.d.ts +1 -1
- package/parser/registry.d.ts +8 -0
- package/parser/render-runtime.d.ts +1 -1
- package/{presets-D3WhkbZK.js → presets-DmCp_Doe.js} +2 -2
- package/printer.d.ts +17 -0
- package/printer.js +3 -0
- package/registries-CyjYSHA7.js +1841 -0
- package/runtime/print-renderer.d.ts +3 -2
- package/runtime/registries.d.ts +1 -0
- package/runtime.js +32 -28
- package/{saas-B1H161e1.js → saas-D-q51uTz.js} +1 -1
- package/saas.js +1 -1
- package/{studio-BFQYHZsg.js → studio-DHusmJyL.js} +1264 -1187
- package/studio-types.d.ts +1 -1
- package/studio.d.ts +1 -1
- package/style.css +1 -1
- package/vue.d.ts +1 -1
- package/vue.js +3672 -3579
- package/document-model-GhFP9OGp.js +0 -1302
- package/host-CuGR8rD6.js +0 -123
package/README.md
CHANGED
|
@@ -1,243 +1,210 @@
|
|
|
1
|
-
|
|
1
|
+
### **Print Studio** —— Web 打印,从此简单。
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
轻量级 Web 打印解决方案:可视化设计模板、绑定业务数据,即可预览、打印并导出 HTML / PDF。支持独立使用或嵌入业务系统,无需额外部署服务端。适用于在 ERP、CMS、OA 等第三方业务系统中嵌入打印能力。
|
|
4
6
|
|
|
5
7
|
- **可视化设计器**:多页管理、页面模板与文本、表格、条码、二维码、图片等常用打印元素;界面运行于库自管的隔离 iframe,宿主零样式接入。
|
|
6
8
|
- **数据绑定**:字符串属性 `{{ 路径 | 格式化器 }}` 注入业务数据,表格跨页续排、循环区块展开明细。
|
|
7
9
|
- **输出**:浏览器预览与打印、独立 HTML、PDF Blob。全部在浏览器内完成,无服务端依赖,打印数据由调用方传入。
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
> **完整文档(API 参考、教程、示例、演练场)请访问 [https://print-studio-docs.github.io](https://print-studio-docs.github.io)**。
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
12
16
|
|
|
13
17
|
```bash
|
|
14
18
|
npm install @printstack/print-studio
|
|
19
|
+
```
|
|
15
20
|
|
|
16
|
-
|
|
21
|
+
```bash
|
|
17
22
|
pnpm add @printstack/print-studio
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
```bash
|
|
18
26
|
yarn add @printstack/print-studio
|
|
19
27
|
```
|
|
20
28
|
|
|
21
|
-
###
|
|
29
|
+
### 环境要求与兼容范围
|
|
22
30
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
| `@printstack/print-studio/runtime` | `createPrintRenderer()` 纯输出运行时 |
|
|
29
|
-
| `@printstack/print-studio/core` | 文档模型与工具(`deserializeDocument()` 等) |
|
|
31
|
+
- **浏览器**:Chrome / Edge / Firefox / Safari 现代版本;系统打印行为由浏览器决定,建议按目标浏览器实际验收。
|
|
32
|
+
- **模块格式**:纯 ESM 包,不提供 CommonJS 接入。Vue、Pinia 等运行时依赖随包自动安装,非 Vue 项目无需编写 Vue 组件;样式已随隔离 iframe 内联加载,无需手动导入。
|
|
33
|
+
- **Node.js / SSR**:模板渲染依赖浏览器 DOM / Canvas,不在服务端直接运行;服务端输出需以无头浏览器等宿主承载。
|
|
34
|
+
- **PDF / 图片 / 字体**:浏览器资源加载与跨域策略参与输出结果,需用实际资源验证。
|
|
35
|
+
- **移动端**:可打开文档;设计器需要足够的容器宽高。
|
|
30
36
|
|
|
31
|
-
##
|
|
37
|
+
## 选择接入方式
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
按业务场景二选一,两种方式可同时使用:
|
|
34
40
|
|
|
35
|
-
|
|
41
|
+
| 接入方式 | 适用场景 | 需要的能力 |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| **嵌入设计器** | 让用户在系统内可视化设计、维护模板 | `PrintDesigner` 组件(Vue)或 `studio.mount()`(任意技术栈) |
|
|
44
|
+
| **仅输出,不嵌设计器** | 只在业务页面用已有模板渲染数据、预览打印 | 仅 `createPrintStudio()`,不调用 `mount()`;或更轻量的 `createPrintRenderer()` |
|
|
36
45
|
|
|
37
|
-
|
|
38
|
-
|
|
46
|
+
不嵌入设计器时,设计器视图与相关插件代码不会加载(视图运行时按需加载)。
|
|
47
|
+
|
|
48
|
+
### 方式一:嵌入设计器(Vue 应用)
|
|
49
|
+
|
|
50
|
+
```vue
|
|
51
|
+
<script setup lang="ts">
|
|
52
|
+
import { PrintDesigner, usePrintStudio } from '@printstack/print-studio/vue'
|
|
39
53
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
async onSave(document) {
|
|
44
|
-
// 收到文档对象(非 JSON 字符串);等待持久化完成后再 resolve,失败抛错
|
|
54
|
+
const studio = usePrintStudio({
|
|
55
|
+
storage: false, // 关闭自动草稿,见下文「配置偏好与草稿」
|
|
56
|
+
onSave: async (document) => {
|
|
45
57
|
await fetch('/api/templates', {
|
|
46
58
|
method: 'POST',
|
|
47
59
|
body: JSON.stringify(document),
|
|
48
60
|
})
|
|
49
61
|
},
|
|
50
62
|
})
|
|
51
|
-
|
|
52
|
-
// 2. 挂载设计器界面;resolve 即界面就绪
|
|
53
|
-
await studio.mount({ el: '#designer' })
|
|
54
|
-
|
|
55
|
-
// 3. 编辑模板:代码与设计器界面操作同一份文档
|
|
56
|
-
const page = studio.page.active
|
|
57
|
-
const cell = page.elements.add({
|
|
58
|
-
type: 'text',
|
|
59
|
-
x: 20,
|
|
60
|
-
y: 30,
|
|
61
|
-
width: 100,
|
|
62
|
-
height: 12,
|
|
63
|
-
})
|
|
64
|
-
page.elements.updateProps(cell, { text: '订单号:{{ order.number }}' })
|
|
65
|
-
|
|
66
|
-
// 4. 页面退出时释放工作区
|
|
67
|
-
// studio.unmount() // 仅卸载界面,文档保留,可再次 mount
|
|
68
|
-
// studio.dispose() // 彻底释放
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
要点:
|
|
72
|
-
|
|
73
|
-
- `el` 接受元素或 CSS 选择器,**容器需要有明确高度**,设计器界面填满其容器。
|
|
74
|
-
- 界面配置(`ui` / `settings` / `plugins` / `zIndex`)与回调(`onDirtyChange` / `onError`)作为 `mount()` 选项传入,工作区创建选项仍在 `createPrintStudio()` 中配置。
|
|
75
|
-
- 不传 `initialDocument` 时默认打开内置欢迎模板,可直接试用;业务模板通过 `initialDocument` 或 `studio.document.loadJson(json)` 加载。
|
|
76
|
-
- 一个工作区同时只挂载一个设计器;`mount()` 失败或就绪前卸载会 reject,调用方应捕获并 `dispose()` 工作区。
|
|
77
|
-
|
|
78
|
-
Vue 项目也可以使用组件方式。`usePrintStudio()` 在 setup 中创建同一工作区,页面卸载时自动清理:
|
|
79
|
-
|
|
80
|
-
```vue
|
|
81
|
-
<script setup lang="ts">
|
|
82
|
-
import { PrintDesigner, usePrintStudio } from '@printstack/print-studio/vue'
|
|
83
|
-
|
|
84
|
-
const studio = usePrintStudio({ storage: false })
|
|
85
63
|
</script>
|
|
86
64
|
|
|
87
65
|
<template>
|
|
88
|
-
|
|
66
|
+
<!-- 容器需要有明确高度 -->
|
|
67
|
+
<div style="height: 80vh">
|
|
89
68
|
<PrintDesigner :studio="studio" />
|
|
90
69
|
</div>
|
|
91
70
|
</template>
|
|
92
71
|
```
|
|
93
72
|
|
|
94
|
-
|
|
73
|
+
要点:
|
|
95
74
|
|
|
96
|
-
`
|
|
75
|
+
- `usePrintStudio()` 在 setup 作用域中创建实例,页面卸载时自动 `dispose()`;组件与界面操作同一份文档。
|
|
76
|
+
- 通过 `studio.mount()` 也可把设计器挂载到任意容器(支持元素或 CSS 选择器),一个工作区同时只挂载一个设计器,可用 `unmount()` 移除后重新挂载。非 Vue 技术栈用这种方式。
|
|
77
|
+
|
|
78
|
+
### 方式二:不嵌设计器,只做输出
|
|
97
79
|
|
|
98
80
|
```ts
|
|
99
|
-
|
|
81
|
+
import { createPrintStudio } from '@printstack/print-studio'
|
|
100
82
|
|
|
101
|
-
|
|
102
|
-
await studio.preview(input)
|
|
83
|
+
const studio = createPrintStudio()
|
|
103
84
|
|
|
104
|
-
//
|
|
105
|
-
|
|
106
|
-
handle.close()
|
|
85
|
+
// 加载系统已有模板数据(不挂载设计器)
|
|
86
|
+
studio.document.loadJson(templateJson)
|
|
107
87
|
|
|
108
|
-
//
|
|
109
|
-
await studio.
|
|
110
|
-
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
// 独立挂载完整打印预览,无需挂载设计器;支持 container,缺省挂到 body
|
|
114
|
-
const designerPreview = await studio.preview(input, { mode: 'designer' })
|
|
115
|
-
// 关闭时释放预览界面与渲染会话;也可在指定 container 中展示
|
|
116
|
-
designerPreview.close()
|
|
88
|
+
// 业务数据渲染 + 输出
|
|
89
|
+
await studio.print({ orderNo: 'A001' })
|
|
90
|
+
const { blob } = await studio.toPDF({ orderNo: 'A001' })
|
|
117
91
|
```
|
|
118
92
|
|
|
119
|
-
|
|
93
|
+
不需要界面时直接用 `createPrintStudio()`,即可完成加载模板、注入数据、预览、打印、导出。不需要任何编辑 UI 时,可用更轻量的纯输出运行时 `createPrintRenderer()`,详见 [createPrintRenderer() 参考](https://print-studio-docs.github.io/reference/renderer)。
|
|
120
94
|
|
|
121
|
-
|
|
95
|
+
## 模板保存到自己的系统
|
|
122
96
|
|
|
123
|
-
`
|
|
97
|
+
模板在设计器中就是一份 JSON 文档(`PrintDocument`),接入点是 `onSave` 回调:
|
|
124
98
|
|
|
125
99
|
```ts
|
|
126
|
-
const
|
|
100
|
+
const studio = usePrintStudio({
|
|
101
|
+
onSave: async (document) => {
|
|
102
|
+
// document 为完整模板 JSON,存到你的数据库 / 接口
|
|
103
|
+
await saveToMySystem(templateId, JSON.stringify(document))
|
|
104
|
+
},
|
|
105
|
+
})
|
|
127
106
|
```
|
|
128
107
|
|
|
129
|
-
|
|
108
|
+
- 触发途径:界面「保存」按钮、文件菜单的保存命令,或代码调用 `studio.document.save()`。`save()` 返回只表示回调执行完成。
|
|
109
|
+
- 若未提供 `onSave`,界面保存能力不可用(`studio.document.dirty` 仍正常)。
|
|
110
|
+
- 程序化获取当前文档:`studio.document.data`;导出 JSON 字符串:`studio.export.json()`。
|
|
111
|
+
- 文档有未保存修改时 `studio.document.dirty` 为 `true`,可用于自己的保存提示;挂载方式可另传 `onDirtyChange` 监听脏状态。
|
|
130
112
|
|
|
131
|
-
|
|
132
|
-
|
|
113
|
+
## 加载系统已有模板
|
|
114
|
+
|
|
115
|
+
两种途径:
|
|
116
|
+
|
|
117
|
+
**代码加载**(嵌入与非嵌入方式都适用):
|
|
133
118
|
|
|
134
119
|
```ts
|
|
135
|
-
|
|
136
|
-
|
|
120
|
+
// 字符串 JSON
|
|
121
|
+
studio.document.loadJson(json)
|
|
122
|
+
// 对象
|
|
123
|
+
studio.document.load(document)
|
|
137
124
|
```
|
|
138
125
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
`studio.toHTML(input)` 生成独立 HTML 字符串,`studio.toPDF(input)` 生成 PDF Blob,交给宿主下载或上传:
|
|
126
|
+
创建实例时直接带入初始模板:
|
|
142
127
|
|
|
143
128
|
```ts
|
|
144
|
-
|
|
145
|
-
const { html } = await studio.toHTML(input)
|
|
146
|
-
|
|
147
|
-
// PDF:返回 { blob, warnings };以下载为例
|
|
148
|
-
const { blob } = await studio.toPDF(input)
|
|
149
|
-
const url = URL.createObjectURL(blob)
|
|
150
|
-
const link = document.createElement('a')
|
|
151
|
-
link.href = url
|
|
152
|
-
link.download = 'order.pdf'
|
|
153
|
-
link.click()
|
|
154
|
-
URL.revokeObjectURL(url)
|
|
129
|
+
const studio = usePrintStudio({ initialDocument: myTemplate })
|
|
155
130
|
```
|
|
156
131
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
以 ERP 订单打印为例。典型接入方式:模板在设计器中定稿后以 JSON 保存到业务系统;业务页面调用打印服务,加载模板、注入订单数据,提供预览与打印:
|
|
132
|
+
**接入模板库**(让用户在设计器「文件 > 模板库」中浏览、选用、上传、维护系统模板):
|
|
160
133
|
|
|
161
134
|
```ts
|
|
162
|
-
|
|
163
|
-
import {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
await getStudio().preview({ order })
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/** 点击「打印」:浏览器打印对话框中确认 */
|
|
190
|
-
export async function printOrder(order: Order): Promise<void> {
|
|
191
|
-
await loadOrderTemplate()
|
|
192
|
-
await getStudio().print({ order })
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/** 点击「导出 PDF」:拿到 Blob 后下载或上传 */
|
|
196
|
-
export async function exportOrderPdf(order: Order): Promise<Blob> {
|
|
197
|
-
await loadOrderTemplate()
|
|
198
|
-
const { blob } = await getStudio().toPDF({ order })
|
|
199
|
-
return blob
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/** 应用退出时释放 */
|
|
203
|
-
export function destroyPrintService(): void {
|
|
204
|
-
studio?.dispose()
|
|
205
|
-
studio = undefined
|
|
206
|
-
}
|
|
135
|
+
import { definePlugin } from '@printstack/print-studio'
|
|
136
|
+
import { createRemoteTemplateProvider } from '@printstack/print-studio/designer'
|
|
137
|
+
|
|
138
|
+
const myTemplateLibrary = definePlugin({
|
|
139
|
+
manifest: {
|
|
140
|
+
apiVersion: '1.0',
|
|
141
|
+
id: 'my-company:templates',
|
|
142
|
+
version: '1.0.0',
|
|
143
|
+
permissions: ['templates'],
|
|
144
|
+
},
|
|
145
|
+
setup(ctx) {
|
|
146
|
+
return ctx.templateLibrary.register(
|
|
147
|
+
createRemoteTemplateProvider({
|
|
148
|
+
id: 'my-company:remote',
|
|
149
|
+
manifestUrl: '/api/templates/manifest',
|
|
150
|
+
title: () => '系统模板',
|
|
151
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
152
|
+
}),
|
|
153
|
+
)
|
|
154
|
+
},
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
const studio = usePrintStudio()
|
|
158
|
+
studio.use(myTemplateLibrary)
|
|
207
159
|
```
|
|
208
160
|
|
|
209
|
-
|
|
161
|
+
- Provider 支持 `create` / `update` / `remove` 时,用户可在模板库中把当前文档存入你的系统、更新或删除已有模板。
|
|
162
|
+
- 不需要模板库时也可用 `studio.template.import()` 程序化导入模板对象。
|
|
163
|
+
|
|
164
|
+
## 配置偏好与草稿
|
|
165
|
+
|
|
166
|
+
两类自动持久化默认都写入 `localStorage`,均有开关和自定义存储接口:
|
|
167
|
+
|
|
168
|
+
| 配置项 | 默认行为 | 关闭 | 自定义存储 |
|
|
169
|
+
| --- | --- | --- | --- |
|
|
170
|
+
| **草稿(未保存的模板数据)** | 修改自动写入 `localStorage`(键 `print-studio:document`),下次打开自动恢复 | `storage: false` | `storage: { get(): string \| null, set(json) }`,实现 `DocumentStorage` 接口 |
|
|
171
|
+
| **偏好设置(主题等界面偏好)** | 变更时写入 `localStorage` | `persistPreferences: false` | `preferenceStorage: { get(key), set(key, value) }`,实现 `PreferenceStorage` 接口 |
|
|
172
|
+
|
|
173
|
+
典型配置:宿主系统统一管理模板,关闭本地草稿,只信任 `onSave`:
|
|
210
174
|
|
|
211
175
|
```ts
|
|
212
|
-
|
|
176
|
+
usePrintStudio({ storage: false, onSave })
|
|
213
177
|
```
|
|
214
178
|
|
|
215
|
-
|
|
179
|
+
需要把草稿/偏好存到服务端或 IndexedDB 时,实现对应接口传入即可。
|
|
216
180
|
|
|
217
|
-
|
|
218
|
-
import { createPrintRenderer } from '@printstack/print-studio/runtime'
|
|
219
|
-
import { deserializeDocument } from '@printstack/print-studio/core'
|
|
181
|
+
## 在业务场景中预览与打印
|
|
220
182
|
|
|
221
|
-
|
|
183
|
+
拿到模板和业务数据后,输出入口都接受 `input`(数据源值,键需与模板中的数据绑定一致):
|
|
222
184
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
)
|
|
185
|
+
```ts
|
|
186
|
+
// 预览:打开成品视图,返回句柄,用完 dispose()
|
|
187
|
+
const handle = await studio.preview({ orderNo: 'A001' })
|
|
188
|
+
handle.dispose()
|
|
227
189
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
await renderer.print(template, input)
|
|
190
|
+
// 打印:提交浏览器打印任务;resolve 表示任务已提交,不代表用户确认或设备出纸
|
|
191
|
+
await studio.print({ orderNo: 'A001' })
|
|
231
192
|
|
|
232
|
-
|
|
193
|
+
// 导出
|
|
194
|
+
const { blob } = await studio.toPDF({ orderNo: 'A001' })
|
|
195
|
+
const { html } = await studio.toHTML({ orderNo: 'A001' })
|
|
233
196
|
```
|
|
234
197
|
|
|
198
|
+
批量打印、PDF 批量导出等进阶输出见教程 [批量打印与批量导出](https://print-studio-docs.github.io/tutorial/batch)。
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
235
202
|
## 更多功能与完整文档
|
|
236
203
|
|
|
237
204
|
> 更多高级功能、详细配置说明及完整 API 文档,请访问 [Print Studio 官方文档](https://print-studio-docs.github.io)。
|
|
238
205
|
|
|
239
|
-
- [快速开始](https://print-studio-docs.github.io/guide/getting-started):从创建项目到预览、打印的完整流程
|
|
240
206
|
- [循序渐进教程](https://print-studio-docs.github.io/tutorial/):模板设计、页面尺寸、元素绘制、数据绑定、保存加载、批量打印
|
|
207
|
+
- [API 参考](https://print-studio-docs.github.io/reference/studio):`createPrintStudio()` 与工作区 API
|
|
241
208
|
- [数据绑定参考](https://print-studio-docs.github.io/reference/data-binding):数据源声明、表达式与格式化器
|
|
242
209
|
- [预览 / 打印 / 导出 API](https://print-studio-docs.github.io/reference/output):输出选项、取消与超时、批量输出
|
|
243
210
|
- [Vue 集成](https://print-studio-docs.github.io/reference/vue-designer):组件 props、事件与上下文
|