@worm-vue3-print/core 1.2.1 → 1.3.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/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ import { T as TemplateData, C as CodeRenderer, P as PageLayout, I as MeasuredElement, J as TemplateElement, W as WatermarkOptions, K as PaperMm, L as ViewportPx, N as HeightSource, O as MarginsMm, Q as PdfTargetSpec, X as ScreenshotTargetSpec, R as RawMeasurement, a as CodeSpec, Y as CodeRenderOptions, D as DriverFactory, Z as ExecutorBundle, _ as TileLayout, $ as PrintJob, a0 as PreparedDocument, a1 as RenderPdfResult, M as MultiPageTemplateData, a2 as PrintFontDeclaration } from './driver-CsWkGK4a.js';
2
+ export { a3 as ContinuousPaperSize, a4 as EXECUTOR_TARGETS, a5 as ExecutorMethod, a6 as ExecutorTargetKind, a7 as FALLBACK_FONT_STACK, a8 as MAX_BATCH_COPIES, a9 as NormalizedPrintData, aa as PAPER_DIMENSIONS, ab as PageDriver, ac as PageSection, ad as PaperSize, ae as PrintDataInput, af as PrintFontFile, ag as RenderCell, ah as RenderRequest, ai as RenderRow, aj as SheetPaperSize, ak as TILE_DEFAULTS, G as TextFit, al as TilingError, am as TilingIssue, an as TilingIssueCode, ao as TilingOptions, ap as TilingResolveOptions, aq as TilingTemplateInput, ar as buildFontFaceCss, as as computeMaxColumns, at as computeTileLayout, au as escapeInlineStyleValue, av as getPaperDimensions, aw as isContinuousPaper, ax as isContinuousPaperSize, ay as normalizePrintData, az as normalizeTilingOptions, aA as resolveSheetMm, aB as roundMm, aC as tilePosition, aD as toFontFamilyStack, aE as validateTiling } from './driver-CsWkGK4a.js';
3
+ import { F as FitFontSize, P as PrintRuntime } from './ports-B63x7kCX.js';
4
+ export { C as CellFitRowKind, h as DEFAULT_READINESS_MS, D as DEFAULT_SHRINK_MIN_FONT_SIZE_PT, i as DEFAULT_TIMEOUT_MS, M as MIN_SHRINK_FONT_SIZE_PT, j as MeasureResult, k as PrintSession, S as SessionBudget, c as cellFitCapMm, a as cellFitKey, f as floorFontSize, p as parseCellFitKey, r as resolveCellTextFit, d as resolveElementTextFit, e as resolveShrinkMinFontSize, g as roundFontSize } from './ports-B63x7kCX.js';
5
+
1
6
  type TokenType = 'num' | 'str' | 'bool' | 'ident' | 'punc';
2
7
  interface Token {
3
8
  type: TokenType;
@@ -126,201 +131,42 @@ declare const systemVars: {
126
131
  printTime: () => number;
127
132
  };
128
133
 
129
- type PaperSize = 'A4' | 'A3' | 'A5' | 'Letter' | 'Legal' | 'CUSTOM';
130
- /** 纸张尺寸映射(mm) */
131
- declare const PAPER_DIMENSIONS: Record<PaperSize, {
132
- width: number;
133
- height: number;
134
- }>;
135
- interface TemplateData {
136
- paperSize: PaperSize;
137
- orientation: 'portrait' | 'landscape';
138
- /** 自定义纸张宽度(mm),仅 paperSize='CUSTOM' 时生效 */
139
- customWidth?: number;
140
- /** 自定义纸张高度(mm),仅 paperSize='CUSTOM' 时生效 */
141
- customHeight?: number;
142
- /** 页面(纸张)背景色;未设置时默认白色 */
143
- pageBackground?: string;
144
- margins: {
145
- top: number;
146
- right: number;
147
- bottom: number;
148
- left: number;
149
- };
150
- header: {
151
- height: number;
152
- elements: TemplateElement[];
153
- };
154
- footer: {
155
- height: number;
156
- elements: TemplateElement[];
157
- };
158
- firstPageOverlay: {
159
- height: number;
160
- elements: TemplateElement[];
161
- };
162
- elements: TemplateElement[];
163
- }
164
- /** 元素分页属性(非表格元素) */
165
- interface PaginationConfig {
166
- pageable: boolean;
167
- keepWithNext: boolean;
168
- }
169
- /** 表格分页配置 */
170
- interface TablePaginationConfig {
171
- enabled: boolean;
172
- }
173
134
  /**
174
- * 模板元素 — print-render 侧的简化视图。
175
- * 兼容前端 PrintElementData 的 options 嵌套结构,
176
- * 同时提供扁平访问器方便分页引擎使用。
177
- */
178
- interface TemplateElement {
179
- id: string;
180
- type: string;
181
- /** 元素选项(与前端 ElementOptions 对齐) */
182
- options: Record<string, any>;
183
- /** 元素类型元数据(与前端 PrintElementTypeMeta 对齐) */
184
- printElementType?: {
185
- type: string;
186
- title?: string;
187
- [key: string]: any;
188
- };
189
- /** 分页属性(非表格元素) */
190
- pagination?: PaginationConfig;
191
- /** 表格分页配置(表格元素) */
192
- tablePagination?: TablePaginationConfig;
193
- }
194
- type RenderRowType = 'header' | 'data' | 'summary' | 'subtotal' | 'static';
195
- interface RenderCellBorder {
196
- width: number;
197
- style: string;
198
- color: string;
199
- }
200
- interface RenderCellBorders {
201
- top?: RenderCellBorder;
202
- right?: RenderCellBorder;
203
- bottom?: RenderCellBorder;
204
- left?: RenderCellBorder;
205
- }
206
- /** 绑定后的单元格:content 已是最终文本(小计行 content 为占位值,真实值按每页数据渲染时求值) */
207
- interface RenderCell {
208
- content: string;
209
- /** 小计行专用:单元格原始 formatter 表达式,渲染阶段以当前页数据行上下文求值 */
210
- rawFormatter?: string;
211
- /** 内容类型:text(默认)/ barcode / qrcode / image,非 text 时 content 为码值或图片 URL */
212
- cellType?: string;
213
- /** 条形码码制(jsbarcode 格式名),仅 cellType='barcode' 时生效 */
214
- barcodeType?: string;
215
- /** 二维码纠错级别 L/M/Q/H,仅 cellType='qrcode' 时生效 */
216
- qrCodeLevel?: string;
217
- /** 条形码下方是否显示文本,仅 cellType='barcode' 时生效 */
218
- showBarcodeText?: boolean;
219
- /** 图片缩放模式,仅 cellType='image' 时生效 */
220
- fit?: string;
221
- /** 图片最大宽度(mm),仅 cellType='image' 时生效 */
222
- maxWidth?: number;
223
- /** 图片最大高度(mm),仅 cellType='image' 时生效 */
224
- maxHeight?: number;
225
- rowspan: number;
226
- colspan: number;
227
- merged: boolean;
228
- align?: string;
229
- valign?: string;
230
- fontSize?: number;
231
- fontWeight?: string;
232
- color?: string;
233
- backgroundColor?: string;
234
- borders?: RenderCellBorders;
235
- padding?: number;
236
- wordWrap?: boolean;
237
- }
238
- /** 绑定后的渲染行,存入 options._renderRows */
239
- interface RenderRow {
240
- type: RenderRowType;
241
- height: number;
242
- cells: RenderCell[];
243
- }
244
- interface CodeRenderOptions {
245
- /** 条形码码制(jsbarcode 格式名),仅 barcode 类型使用 */
246
- barcodeType?: string;
247
- /** 二维码纠错级别 L/M/Q/H,仅 qrcode 类型使用 */
248
- qrCodeLevel?: string;
249
- /** 条形码下方是否显示文本 */
250
- showText?: boolean;
251
- /** 条码模块宽度倍率 */
252
- barWidth?: number;
253
- /** 条码下方文本字号(pt) */
254
- fontSize?: number;
255
- }
256
- /**
257
- * 码值 → SVG 字符串渲染器。
258
- * 服务端由 print-render 用 bwip-js 实现;浏览器由 print-canvas 用 jsbarcode/qrcode 实现。
259
- * 码值非法时抛出异常,由调用方降级为文本占位。
135
+ * 将模板中元素的 formatter 表达式求值为实际值。
136
+ * 返回新的模板对象(深拷贝),不修改原始模板。
137
+ *
138
+ * @param baseUrl 相对路径**图片**基址(如 `/n/...`)
139
+ * @param fontBaseUrl 相对路径**字体**基址;缺省回落到 `baseUrl`(图片与字体同域时无需单独配置),
140
+ * 显式传空串表示不拼接——相对字体 URL 交由文档自身 origin 解析(浏览器端语义)。
141
+ * 字体与图片不在同一域(图片走业务 OSS、字体走前端站点/CDN)时必须显式指定。
260
142
  */
261
- interface CodeRenderer {
262
- render(value: string, cellType: 'barcode' | 'qrcode', opts?: CodeRenderOptions): string;
263
- }
264
- interface RenderRequest {
265
- templateJson: TemplateData;
266
- printData?: Record<string, any>;
267
- /** 服务端对外访问 base URL,用于把 /docfiles/... 等相对路径图片拼接为完整地址 */
268
- baseUrl?: string;
269
- }
270
- interface MeasuredElement {
271
- id: string;
272
- measuredHeight: number;
273
- /** 表格每行实际高度(mm),仅表格元素有值 */
274
- measuredRowHeights?: number[];
275
- /** 重复表头段实际高度(mm)= 前 _repeatHeaderCount 个渲染行高之和,仅表格元素有值 */
276
- repeatHeaderHeight?: number;
277
- }
278
- interface PageLayout {
143
+ declare function bindData(template: TemplateData, printData?: Record<string, any>, baseUrl?: string, fontBaseUrl?: string): TemplateData;
144
+ /** 系统变量上下文(表达式 ctx 与 HTML 占位符替换共用,保证取值一致) */
145
+ interface SystemVariableContext {
146
+ /** 打印日期 YYYY-MM-DD */
147
+ printDate: string;
148
+ /** 打印时间 HH:mm:ss */
149
+ printTime: string;
279
150
  pageIndex: number;
280
- sections: PageSection[];
281
- }
282
- interface PageSection {
283
- elementId: string;
284
- type: 'element' | 'table-slice' | 'flow-group';
285
- /** table-slice 专用:渲染行起始索引(含表头行) */
286
- startRow?: number;
287
- /** table-slice 专用:渲染行结束索引(不含) */
288
- endRow?: number;
289
- /** table-slice 专用:非首片时在切片前重复表头段 */
290
- repeatHeader?: boolean;
291
- /** table-slice 专用:本片末尾是否渲染小计行(当前页数据小计,每页重复) */
292
- subtotal?: boolean;
293
- /** table-slice 专用:本片末尾是否渲染整表汇总行(总计,仅最后一页) */
294
- summary?: boolean;
295
- /** 本节在本页内容区内的实际 top(mm)。发生换页后的内容为 0;缺省回退元素设计 top */
296
- renderTop?: number;
297
- /**
298
- * flow-group 专用:相对容器在本页的实际 top(mm),覆盖元素设计 top。
299
- * 同页时 = 表格设计 top(容器顶部对齐表格 slice 顶部);
300
- * 跟随区整体移页时 = 新页内容区顶部(0)。
301
- */
302
- groupTop?: number;
303
- /** flow-group 专用:跟随区成员元素 id(容器内按文档流渲染) */
304
- followElementIds?: string[];
151
+ totalPages: number;
305
152
  }
306
- /** 获取纸张物理尺寸(考虑方向) */
307
- declare function getPaperDimensions(template: TemplateData): {
308
- width: number;
309
- height: number;
310
- };
311
-
312
153
  /**
313
- * 将模板中元素的 formatter 表达式求值为实际值。
314
- * 返回新的模板对象(深拷贝),不修改原始模板。
154
+ * 生成系统变量取值;水印表达式求值与最终 HTML 占位符替换共用同一实现,
155
+ * 避免「设计器预览看到的打印时间」与「实际打印出来的」不一致。
315
156
  */
316
- declare function bindData(template: TemplateData, printData?: Record<string, any> | Record<string, any>[], baseUrl?: string): TemplateData;
317
- declare function injectSystemVariables(html: string): string;
157
+ declare function resolveSystemVariables(now?: Date, page?: {
158
+ pageIndex?: number;
159
+ totalPages?: number;
160
+ }): SystemVariableContext;
161
+ declare function injectSystemVariables(html: string, now?: Date): string;
318
162
 
319
163
  interface GenerateOptions {
320
164
  /** 第一遍测量模式:所有元素在一个连续区域,不分页 */
321
165
  isMeasurementPass?: boolean;
322
166
  /** 条码/二维码 SVG 渲染器;缺省或渲染抛错时降级为文本占位 */
323
167
  codeRenderer?: CodeRenderer;
168
+ /** 连续纸探针推导出的最终纸高(mm);仅最终生成时传入,使 @page/.print-page/footer 对齐 */
169
+ pageHeightMm?: number;
324
170
  }
325
171
  /**
326
172
  * 生成完整 HTML 字符串。
@@ -329,14 +175,36 @@ interface GenerateOptions {
329
175
  * - 第二遍:按分页结果生成多页 HTML,填充 {pageIndex}/{totalPages}
330
176
  */
331
177
  declare function generateHtml(template: TemplateData, pageLayouts: PageLayout[], printData?: Record<string, any>, options?: GenerateOptions): string;
178
+ /** renderFinalPages 的扩展选项(多页面模板:全局页码 + 页面作用域类) */
179
+ interface RenderFinalPagesOptions {
180
+ /** 全局页码偏移:模板在整份文档中的起始页号(0 基页号偏移);缺省 0(单模板) */
181
+ pageOffset?: number;
182
+ /** 整份文档总页数(多页面模板);缺省 = 本模板页数(单模板) */
183
+ totalPages?: number;
184
+ /** 追加到每个 .print-page 的类名(多页面模板 CSS 作用域,如 'mt-1');缺省空 */
185
+ pageClass?: string;
186
+ }
332
187
 
333
188
  /** mm 值转 CSS 字符串 */
334
189
  declare function mm(value: number): string;
190
+ /** 模板无关的基础 CSS(多页文档外壳用;不含 @page,@page 由首模板单独输出) */
191
+ declare function buildBasePageCss(): string;
192
+ /** @page 规则 CSS(纸张尺寸,含连续纸推导纸高)。@page 无法作用域化,多页文档由首个模板输出一份 */
193
+ declare function buildPageRuleCss(template: TemplateData, pageHeightMm?: number): string;
194
+ /**
195
+ * 模板相关几何 CSS,可按作用域前缀输出(多页时每页模板一份)。
196
+ * @param scope 页面作用域类选择器(如 '.mt-3');缺省输出原始选择器
197
+ * @param pageHeightMm 连续纸推导纸高(mm);普通纸不传
198
+ */
199
+ declare function buildPageGeometryCss(template: TemplateData, scope?: string, pageHeightMm?: number): string;
335
200
  /**
336
201
  * 生成完整的打印页面 CSS。
337
202
  * 包含纸张尺寸、边距、页眉页脚、内容区、首页叠加区域等样式。
203
+ * 出纸旋转角度非 0(固定纸)时,额外输出 .print-page-rotor / .print-page-rotor-${angle} 转子规则完成整页旋转。
204
+ * @param pageHeightMm 连续纸由浏览器探针推导出的最终纸高(mm);传入时替换模板纸张高度,
205
+ * 使 @page/.print-page/footer 全部对齐该高度。普通纸不传。
338
206
  */
339
- declare function buildPageCss(template: TemplateData): string;
207
+ declare function buildPageCss(template: TemplateData, pageHeightMm?: number): string;
340
208
  /**
341
209
  * 生成内联样式:元素绝对定位(mm 单位)。
342
210
  * 可选 z-index:与设计器「层级」一致,未设置(undefined)时不输出(层叠回退 DOM 顺序)。
@@ -374,6 +242,307 @@ declare function safeEval(expr: string, context: Record<string, any>): any;
374
242
  */
375
243
  declare function evaluateTemplate(text: string, ctx: Record<string, any>): string;
376
244
 
245
+ /** 连续纸推导高度下限:1 英寸(25.4mm),避免过矮被打印驱动拒绝 */
246
+ declare const MIN_CONTINUOUS_HEIGHT_MM = 25.4;
247
+ declare function composeContinuousHeight(template: TemplateData, contentBottomMm: number): number;
248
+
249
+ /** 96dpi 下 1mm 对应的 CSS px 数(瓦片尺寸仍以 px 配置,落纸时换算为 mm) */
250
+ declare const PX_PER_MM: number;
251
+ /** 1 CSS px 对应的 mm 数 */
252
+ declare const MM_PER_PX: number;
253
+ /** 水印默认值(与设计器 CanvasPaper 历史行为一致) */
254
+ declare const WATERMARK_DEFAULTS: {
255
+ readonly color: "#cccccc";
256
+ readonly opacity: 0.15;
257
+ readonly rotate: -30;
258
+ /** 瓦片默认尺寸(px):决定平铺疏密,默认 260×180 */
259
+ readonly tileWidth: 260;
260
+ readonly tileHeight: 180;
261
+ /** 瓦片下限(px),防止文字裁剪/异常平铺 */
262
+ readonly minTileWidth: 140;
263
+ readonly minTileHeight: 100;
264
+ /** 瓦片字号固定 16px:密度只改变平铺疏密,不改字体大小 */
265
+ readonly fontSize: 16;
266
+ };
267
+ /** 密度预设:调大瓦片 → 更疏;调小 → 更密 */
268
+ declare const WATERMARK_DENSITY_PRESETS: Record<string, {
269
+ width: number;
270
+ height: number;
271
+ label: string;
272
+ }>;
273
+ /** 水印是否可见(向后兼容:无 mode 时按 fixed,content 非空即显示) */
274
+ declare function isWatermarkVisible(wm?: WatermarkOptions | null): boolean;
275
+ /**
276
+ * 解析水印文本。
277
+ * - fixed:取 content;
278
+ * - binding:支持字段路径(order.no)、花括号表达式({order.no}、CONCAT/DATE(...)),
279
+ * 取不到值时依次回退 testData → [binding];
280
+ * - 表达式可直接使用系统变量({printDate} 打印日期、{printTime} 打印时间、
281
+ * {pageIndex} 当前页码、{totalPages} 总页数)——即表达式弹框「变量」里的选项;
282
+ * - timestamp 开启时追加时间(format 指定格式,缺省 YYYY-MM-DD HH:mm),
283
+ * 为存量模板保留,配置面板已不再提供该开关(改用 {printDate}/{printTime})。
284
+ */
285
+ declare function resolveWatermarkText(wm: WatermarkOptions | undefined, printData?: Record<string, any> | Record<string, any>[], systemVars?: Partial<SystemVariableContext>): string;
286
+ /** 时间格式化:token 支持 YYYY/MM/DD/HH/mm/ss,缺省 YYYY-MM-DD HH:mm */
287
+ declare function formatTimestamp(format?: string): string;
288
+ /** 纸张尺寸(mm) */
289
+ interface WatermarkPaper {
290
+ width: number;
291
+ height: number;
292
+ }
293
+ /** 单块瓦片在纸面坐标系中的位置与尺寸(mm,左上角原点) */
294
+ interface WatermarkTile {
295
+ leftMm: number;
296
+ topMm: number;
297
+ widthMm: number;
298
+ heightMm: number;
299
+ }
300
+ /** 水印解析结果:文本 + 视觉参数 + 完整瓦片网格(HTML 与设计器画布共用同一份几何) */
301
+ interface ResolvedWatermark {
302
+ text: string;
303
+ color: string;
304
+ rotate: number;
305
+ opacity: number;
306
+ /** 瓦片内字号(px,viewBox 用户单位;不随密度变化) */
307
+ fontSizePx: number;
308
+ /** 瓦片尺寸(px,viewBox 用户单位;密度配置的原值) */
309
+ tileWidthPx: number;
310
+ tileHeightPx: number;
311
+ tileWidthMm: number;
312
+ tileHeightMm: number;
313
+ columns: number;
314
+ rows: number;
315
+ tiles: WatermarkTile[];
316
+ }
317
+ /**
318
+ * 解析水印并生成瓦片网格。
319
+ * - 不可见(未配置/文本为空)返回 null;
320
+ * - 网格覆盖整张纸:列数 = ceil(纸宽/瓦片宽),行数 = ceil(纸高/瓦片高),
321
+ * 末列/末行超出部分由 .watermark-layer 的 overflow:hidden 裁掉(与背景平铺语义一致)。
322
+ *
323
+ * @param paperMm 最终纸张尺寸(mm);连续纸须传探针推导后的纸高,保证网格与 @page 同源。
324
+ */
325
+ declare function resolveWatermarkLayout(wm: WatermarkOptions | undefined, printData: Record<string, any> | Record<string, any>[] | undefined, paperMm: WatermarkPaper, systemVars?: Partial<SystemVariableContext>): ResolvedWatermark | null;
326
+ /**
327
+ * 生成单块瓦片的 `<svg>` 标记。
328
+ * viewBox 用瓦片 px 坐标(字号 16px 等视觉参数不变),width/height 用 mm 落纸,
329
+ * 因此瓦片在纸面上的物理尺寸恰好等于密度配置值。
330
+ */
331
+ declare function renderWatermarkTileSvg(layout: ResolvedWatermark, tile: WatermarkTile): string;
332
+ /**
333
+ * 生成单页水印层 HTML(放在 .print-page 内、所有内容之下的最底层)。
334
+ * 不可见/文本为空时返回空串。
335
+ */
336
+ declare function renderWatermarkLayerHtml(wm: WatermarkOptions | undefined, printData: Record<string, any> | Record<string, any>[] | undefined, paperMm: WatermarkPaper, systemVars?: Partial<SystemVariableContext>): string;
337
+
338
+ /** 1mm = 1000µm(协议与任务记录使用微米) */
339
+ declare const MICROMETERS_PER_MM = 1000;
340
+ /** 1in = 25.4mm = 25400µm(Electron printToPDF 的 pageSize 使用英寸) */
341
+ declare const MM_PER_INCH = 25.4;
342
+ declare const MICROMETERS_PER_INCH = 25400;
343
+ declare function pxToMm(px: number): number;
344
+ declare function mmToPx(mm: number): number;
345
+ declare function millimetersToMicrometers(mm: number): number;
346
+ declare function micrometersToMillimeters(um: number): number;
347
+ declare function millimetersToInches(mm: number): number;
348
+
349
+ /** core 统一失败分类;各端只做映射,不新增协议码 */
350
+ type PrintFailureCode = 'INVALID_PAPER' | 'MEASURE_FAILED' | 'RENDER_TIMEOUT' | 'PDF_FAILED' | 'SCREENSHOT_FAILED' | 'UNSUPPORTED_RUNTIME' | 'INTERNAL';
351
+ declare class PrintFailure extends Error {
352
+ readonly code: PrintFailureCode;
353
+ readonly cause?: unknown;
354
+ constructor(code: PrintFailureCode, message: string, cause?: unknown);
355
+ }
356
+ declare function toPrintFailure(err: unknown, fallbackCode: PrintFailureCode, context: string): PrintFailure;
357
+ declare function withTimeout<T>(task: Promise<T>, ms: number, code: PrintFailureCode, message: string): Promise<T>;
358
+
359
+ /** 宿主纸张覆盖(mm);字段为 0 或负数视为未提供 */
360
+ interface PaperOverride {
361
+ width?: number;
362
+ height?: number;
363
+ }
364
+ interface ResolvePaperInput {
365
+ /** core 计算出的纸尺寸:连续纸为探针推导高度,其余为模板纸张 */
366
+ paperMm: PaperMm;
367
+ continuous: boolean;
368
+ override?: PaperOverride;
369
+ }
370
+ /** 连续纸 HTML 纸高逃生门:显式 paperHeightMm 优先于协议覆盖高度 */
371
+ declare function escapeHeightMm(input: {
372
+ paperHeightMm?: number;
373
+ override?: PaperOverride;
374
+ }): number | undefined;
375
+ /**
376
+ * 应用宿主覆盖并给出纸高来源。
377
+ * 连续纸仅覆盖宽度时,高度仍取推导值且来源保持 derived(不可降级为 config)。
378
+ */
379
+ declare function resolvePaperMm(input: ResolvePaperInput): {
380
+ paperMm: PaperMm;
381
+ heightSource: HeightSource;
382
+ };
383
+ /** 测量容器尺寸(CSS px);三端必须使用同一结果 */
384
+ declare function paperViewportPx(paper: PaperMm): ViewportPx;
385
+
386
+ /** 边距恒为零:边距由 core 生成的 HTML padding 控制,避免两层边距叠加 */
387
+ declare function buildPdfTargetSpec(paperMm: PaperMm): PdfTargetSpec;
388
+ /** Electron.PrintToPDFOptions 的最小结构(pageSize/margins 单位均为英寸) */
389
+ interface ElectronPrintToPdfOptions {
390
+ margins: MarginsMm;
391
+ pageSize: {
392
+ width: number;
393
+ height: number;
394
+ };
395
+ printBackground: boolean;
396
+ scale: number;
397
+ preferCSSPageSize: boolean;
398
+ }
399
+ declare function toElectronPrintToPdfOptions(spec: PdfTargetSpec): ElectronPrintToPdfOptions;
400
+ /** Playwright page.pdf 的最小结构(宽高与边距使用 mm 字符串) */
401
+ interface PlaywrightPdfOptions {
402
+ width: string;
403
+ height: string;
404
+ margin: {
405
+ top: string;
406
+ right: string;
407
+ bottom: string;
408
+ left: string;
409
+ };
410
+ printBackground: boolean;
411
+ preferCSSPageSize: boolean;
412
+ }
413
+ declare function toPlaywrightPdfOptions(spec: PdfTargetSpec): PlaywrightPdfOptions;
414
+ /** Playwright page.screenshot 的最小结构 */
415
+ declare function buildScreenshotTargetSpec(): ScreenshotTargetSpec;
416
+
417
+ /**
418
+ * 原始测量 → 分页输入。三端共用:px→mm、表格行高、重复表头段高度。
419
+ * repeatHeaderHeight = 前 `options._repeatHeaderCount` 个渲染行高之和。
420
+ */
421
+ declare function normalizeMeasurements(raw: RawMeasurement[], template: TemplateData): Map<string, MeasuredElement>;
422
+
423
+ /**
424
+ * 把自动缩小结果写回模板(原地修改)。
425
+ * 元素级 key 命中元素 options._fitFontSize;单元格 key 命中渲染行单元格 fittedFontSize。
426
+ * 未命中的 key 静默跳过:元素可能属于未参与测量的区域,不影响其余结果。
427
+ */
428
+ declare function applyTextFitSizes(template: TemplateData, fits: FitFontSize[] | undefined): void;
429
+
430
+ /** 码值 + 码制 + 影响产物几何的选项 → 稳定键(顺序固定,跨进程可比对) */
431
+ declare function codeSpecKey(value: string, cellType: 'barcode' | 'qrcode', opts?: CodeRenderOptions): string;
432
+ /** 映射渲染器:未命中抛错,由 html-generator 的既有降级逻辑输出文本占位 */
433
+ declare function createMapCodeRenderer(map: Map<string, string>): CodeRenderer;
434
+ interface CollectingCodeRenderer {
435
+ /** 传入 generateHtml 的渲染器:命中基映射则返回,否则记录规格并抛错 */
436
+ renderer: CodeRenderer;
437
+ /** 取走本趟收集到的规格并清空 */
438
+ takeSpecs(): CodeSpec[];
439
+ }
440
+ declare function createCollectingCodeRenderer(base?: Map<string, string>): CollectingCodeRenderer;
441
+ /** 合并多趟码值映射;后者覆盖同键,入参不被修改 */
442
+ declare function mergeCodeMaps(...maps: Array<Map<string, string>>): Map<string, string>;
443
+
444
+ /**
445
+ * 共享 DOM 宿主 runtime:把「载入 → 注入 → 等就绪 → 执行 → 释放」的时序、
446
+ * 超时预算与错误分类集中实现一次。三端只提供 driver。
447
+ */
448
+ declare function createDomHostRuntime(factory: DriverFactory, bundle?: ExecutorBundle): PrintRuntime;
449
+
450
+ interface BatchCopyInput {
451
+ /** 该份数据绑定后的模板 */
452
+ bound: TemplateData;
453
+ pageLayouts: PageLayout[];
454
+ /** 该份原始数据(水印层使用) */
455
+ data: Record<string, any>;
456
+ codeRenderer?: CodeRenderer;
457
+ /** 连续纸探针推导出的纸高(mm);固定纸为 undefined */
458
+ derivedHeightMm?: number;
459
+ paperMm: PaperMm;
460
+ /** 纸高来源(透传,合并器不使用) */
461
+ heightSource: HeightSource;
462
+ }
463
+ /**
464
+ * 将多份单份产物合并为一个 HTML 文档;份间强制分页。
465
+ * 同模板各份纸张宽度/边距一致,固定纸共用单一 @page;连续纸走命名页。
466
+ */
467
+ declare function composeBatchHtml(copies: BatchCopyInput[]): {
468
+ html: string;
469
+ pageCount: number;
470
+ copyPaperMm: PaperMm[];
471
+ };
472
+
473
+ interface TileInput {
474
+ /** 该份数据绑定后的模板 */
475
+ bound: TemplateData;
476
+ /** 该份的分页结果;拼版要求恰好 1 页(由管线在调用前校验) */
477
+ pageLayouts: PageLayout[];
478
+ /** 该份原始数据(水印层使用) */
479
+ data: Record<string, any>;
480
+ codeRenderer?: CodeRenderer;
481
+ }
482
+ /**
483
+ * 把各份标签页按行优先铺进目标纸。
484
+ * 每张固定容纳 layout.perSheet 格;放不满的最后一张留白(空位不输出任何内容)。
485
+ */
486
+ declare function composeTiledHtml(input: {
487
+ copies: TileInput[];
488
+ layout: TileLayout;
489
+ }): {
490
+ html: string;
491
+ sheetCount: number;
492
+ perSheet: number;
493
+ };
494
+
495
+ /** 阶段 1–6:绑定 → 码值收集/渲染 → 测量 → 分页 → 连续纸 → 最终 HTML */
496
+ declare function prepareDocument(job: PrintJob, runtime: PrintRuntime): Promise<PreparedDocument>;
497
+ /** 阶段 1–7:prepared + HTML→PDF,且与准备阶段共用同一个 driver 会话 */
498
+ declare function renderPdf(job: PrintJob, runtime: PrintRuntime): Promise<RenderPdfResult>;
499
+ /** 截图:不分页,用测量模式 HTML 单页完整渲染;数组数据仅渲染首条。不参与拼版(仍是标签纸单页快照) */
500
+ declare function renderScreenshot(job: PrintJob, runtime: PrintRuntime): Promise<Uint8Array>;
501
+
502
+ /**
503
+ * 归一化模板为页面模板数组:
504
+ * - 单模板(TemplateData)→ `[t]`,路径不变;
505
+ * - 多页面模板({ pages })→ 展开 pages,执行多模板校验;
506
+ * - `pages` 恰好 1 页时按单模板语义返回(保持一致性)。
507
+ *
508
+ * 校验在 pipeline 入口统一抛出,render 服务与设计器预览共用。
509
+ */
510
+ declare function normalizeTemplate(templateJson: TemplateData | MultiPageTemplateData): TemplateData[];
511
+ /** 是否多页面模板 wrapper(含 pages 数组);与 normalizeTemplate 的判据一致 */
512
+ declare function isMultiPageTemplate(templateJson: TemplateData | MultiPageTemplateData): templateJson is MultiPageTemplateData;
513
+ /**
514
+ * 合并各页模板的字体声明:按 font-family 名去重,保留首个。
515
+ * 三端据此生成同一份 @font-face,不依赖各端系统字体。
516
+ */
517
+ declare function mergeFontDeclarations(pages: TemplateData[]): PrintFontDeclaration[];
518
+ /** 多页面模板单份产物(对应一份业务数据) */
519
+ interface MultiPageCopyInput {
520
+ /** 该份数据绑定后的页面模板(顺序与模板一致;formatter 已求值) */
521
+ boundPages: TemplateData[];
522
+ /** 各页面模板的分页结果(顺序与模板一致) */
523
+ layoutsPerPage: PageLayout[][];
524
+ /** 该份原始数据(水印层使用) */
525
+ data: Record<string, any>;
526
+ /** 各页面模板的码值渲染器(顺序与模板一致);缺省降级文本占位 */
527
+ codeRenderers?: Array<CodeRenderer | undefined>;
528
+ }
529
+ interface MultiPageDocument {
530
+ html: string;
531
+ pageCount: number;
532
+ /** 展平的全局页码 PageLayout(调试用;pageIndex 份内全局连续) */
533
+ pageLayouts: PageLayout[];
534
+ }
535
+ /**
536
+ * 组合多页面模板整份文档(单份或多份批量)。
537
+ *
538
+ * 语义:
539
+ * - 每份数据 = 一份完整多页文档(封面+内容+条款),页码份内全局连续;
540
+ * - 每个页面模板产出整页 .print-page 序列,模板间即整页边界(下一模板必然新开一页);
541
+ * - 各页模板的字体声明合并、几何 CSS 按 .mt-N 作用域化;
542
+ * - CSS 按模板集合计算一次(各份模板结构相同),份间仅拼接片段。
543
+ */
544
+ declare function composeMultiPageDocument(copies: MultiPageCopyInput[]): MultiPageDocument;
545
+
377
546
  declare class TemplateEngine {
378
547
  private functions;
379
548
  constructor(options?: EngineOptions);
@@ -382,4 +551,4 @@ declare class TemplateEngine {
382
551
  render(template: string, context: Record<string, any>): string;
383
552
  }
384
553
 
385
- export { type ASTNode, type CodeRenderOptions, type CodeRenderer, type EngineOptions, type ExprFunction, type GenerateOptions, type MeasuredElement, PAPER_DIMENSIONS, type PageLayout, type PageSection, type PaperSize, type TemplateData as PrintTemplateData, type TemplateElement as PrintTemplateElement, type RenderCell, type RenderRequest, type RenderRow, type TemplateAST, TemplateEngine, avg, bindData, buildPageCss, compileTemplate, count, elementPositionStyle, evaluate, evaluateTemplate, formatDate, formatMoney, generateHtml, getByPath, getPaperDimensions, ifFn, injectSystemVariables, max, min, mm, paginate, parse, parseTemplate, renderTemplate, safeEval, setPageIndex, setTotalPages, sum, systemVars, tableDesignBottom, toUpperCaseAmount, tokenize };
554
+ export { type ASTNode, type BatchCopyInput, CodeRenderOptions, CodeRenderer, CodeSpec, type CollectingCodeRenderer, DriverFactory, type ElectronPrintToPdfOptions, type EngineOptions, ExecutorBundle, type ExprFunction, FitFontSize, type GenerateOptions, HeightSource, MICROMETERS_PER_INCH, MICROMETERS_PER_MM, MIN_CONTINUOUS_HEIGHT_MM, MM_PER_INCH, MM_PER_PX, MarginsMm, MeasuredElement, type MultiPageCopyInput, type MultiPageDocument, MultiPageTemplateData, PX_PER_MM, PageLayout, PaperMm, type PaperOverride, PdfTargetSpec, type PlaywrightPdfOptions, PreparedDocument, PrintFailure, type PrintFailureCode, PrintFontDeclaration, PrintJob, PrintRuntime, TemplateData as PrintTemplateData, TemplateElement as PrintTemplateElement, RawMeasurement, type RenderFinalPagesOptions, RenderPdfResult, type ResolvePaperInput, type ResolvedWatermark, ScreenshotTargetSpec, type SystemVariableContext, type TemplateAST, TemplateEngine, type TileInput, TileLayout, ViewportPx, WATERMARK_DEFAULTS, WATERMARK_DENSITY_PRESETS, WatermarkOptions, type WatermarkPaper, type WatermarkTile, applyTextFitSizes, avg, bindData, buildBasePageCss, buildPageCss, buildPageGeometryCss, buildPageRuleCss, buildPdfTargetSpec, buildScreenshotTargetSpec, codeSpecKey, compileTemplate, composeBatchHtml, composeContinuousHeight, composeMultiPageDocument, composeTiledHtml, count, createCollectingCodeRenderer, createDomHostRuntime, createMapCodeRenderer, elementPositionStyle, escapeHeightMm, evaluate, evaluateTemplate, formatDate, formatMoney, formatTimestamp, generateHtml, getByPath, ifFn, injectSystemVariables, isMultiPageTemplate, isWatermarkVisible, max, mergeCodeMaps, mergeFontDeclarations, micrometersToMillimeters, millimetersToInches, millimetersToMicrometers, min, mm, mmToPx, normalizeMeasurements, normalizeTemplate, paginate, paperViewportPx, parse, parseTemplate, prepareDocument, pxToMm, renderPdf, renderScreenshot, renderTemplate, renderWatermarkLayerHtml, renderWatermarkTileSvg, resolvePaperMm, resolveSystemVariables, resolveWatermarkLayout, resolveWatermarkText, safeEval, setPageIndex, setTotalPages, sum, systemVars, tableDesignBottom, toElectronPrintToPdfOptions, toPlaywrightPdfOptions, toPrintFailure, toUpperCaseAmount, tokenize, withTimeout };