@jcyao/print-sdk 1.0.0 → 1.0.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/printEngine/constants.ts","../src/printEngine/htmlTemplate.ts","../src/pipes/executors/DatePipe.ts","../src/pipes/executors/CurrencyPipe.ts","../src/pipes/executors/MoneyPipe.ts","../src/pipes/executors/index.ts","../src/pipes/registry.ts","../src/printEngine/utils/styleBuilder.ts","../src/printEngine/renderers/TextRenderer.ts","../src/printEngine/renderers/TableRenderer.ts","../src/printEngine/renderers/ImageRenderer.ts","../src/printEngine/renderers/RectRenderer.ts","../src/printEngine/renderers/LineRenderer.ts","../src/printEngine/renderers/QRCodeRenderer.ts","../src/printEngine/renderers/BarcodeRenderer.ts","../src/printEngine.ts","../src/PrintSDK.ts"],"sourcesContent":["/**\n * 打印引擎常量配置\n */\n\n/**\n * 单位换算系数\n */\nexport const MM_TO_PX = 3.78; // 96 DPI 下 1mm = 3.78px\n\n/**\n * 组件默认尺寸(单位:mm)\n */\nexport const COMPONENT_DEFAULT_SIZE = {\n /** 文本组件默认宽度 */\n TEXT_WIDTH: 100,\n /** 文本组件默认高度 */\n TEXT_HEIGHT: 8,\n\n /** 图片组件默认宽度 */\n IMAGE_WIDTH: 50,\n /** 图片组件默认高度 */\n IMAGE_HEIGHT: 50,\n\n /** 矩形组件默认宽度 */\n RECT_WIDTH: 50,\n /** 矩形组件默认高度 */\n RECT_HEIGHT: 30,\n\n /** 线条组件默认长度(水平/垂直) */\n LINE_LENGTH: 100,\n /** 线条组件默认宽度(线条粗细) */\n LINE_WIDTH: 1,\n\n /** 二维码默认尺寸(正方形) */\n QRCODE_SIZE: 30,\n\n /** 条形码默认宽度 */\n BARCODE_WIDTH: 60,\n /** 条形码默认高度 */\n BARCODE_HEIGHT: 20,\n\n /** 表格组件默认宽度 */\n TABLE_WIDTH: 100,\n /** 表格组件默认高度(估算) */\n TABLE_HEIGHT: 60,\n} as const;\n\n/**\n * 表格默认尺寸配置\n */\nexport const TABLE_DEFAULT = {\n /** 表头行高度(mm) */\n HEADER_HEIGHT: 10,\n /** 数据行最小高度(mm) */\n MIN_ROW_HEIGHT: 8,\n /** 行高计算系数(考虑文本换行) */\n ROW_HEIGHT_FACTOR: 1.3,\n} as const;\n\n/**\n * 样式默认值\n */\nexport const STYLE_DEFAULT = {\n /** 默认字体大小(px) */\n FONT_SIZE: 14,\n /** 默认文本颜色 */\n TEXT_COLOR: '#000',\n /** 默认字体粗细 */\n FONT_WEIGHT: 'normal',\n /** 默认文本对齐 */\n TEXT_ALIGN: 'left',\n /** 默认行高 */\n LINE_HEIGHT: '1.5',\n /** 默认边框 */\n BORDER: '1px solid #000',\n /** 默认背景色 */\n BACKGROUND: 'transparent',\n} as const;\n\n/**\n * 表格样式默认值\n */\nexport const TABLE_STYLE_DEFAULT = {\n /** 表格默认字体大小(px) */\n FONT_SIZE: 12,\n /** 表格边框颜色 */\n BORDER_COLOR: '#d9d9d9',\n /** 表头背景色 */\n HEADER_BACKGROUND: '#fafafa',\n /** 单元格内边距 */\n CELL_PADDING: '4px 8px',\n} as const;\n\n/**\n * 条形码渲染配置\n */\nexport const BARCODE_CONFIG = {\n /** 默认条形码格式 */\n DEFAULT_FORMAT: 'CODE128',\n /** 条形码高度占容器高度的比例 */\n HEIGHT_RATIO: 0.8,\n /** 默认条形码内容 */\n DEFAULT_CONTENT: '1234567890',\n} as const;\n\n/**\n * 二维码渲染配置\n */\nexport const QRCODE_CONFIG = {\n /** 默认二维码内容 */\n DEFAULT_CONTENT: 'https://example.com',\n} as const;\n","/**\n * 打印HTML模板生成器\n * 统一管理所有打印相关的HTML和样式,避免重复代码\n */\n\nimport type { PageConfig } from '../types';\n\n/**\n * 打印样式配置\n */\ninterface PrintStyleConfig {\n pageWidthMm: number;\n pageHeightMm: number;\n marginTop?: number;\n marginRight?: number;\n marginBottom?: number;\n marginLeft?: number;\n isContinuous?: boolean;\n minHeightMm?: number;\n}\n\n/**\n * 生成组件基础样式\n * 这些样式对所有打印场景都适用\n */\nfunction generateComponentStyles(): string {\n return `\n /* 文本组件样式 */\n .text-component {\n position: absolute;\n white-space: pre-wrap;\n word-wrap: break-word;\n overflow: visible;\n }\n\n /* 表格组件样式 */\n .table-component {\n position: absolute;\n }\n .table-component table {\n width: 100%;\n border-collapse: collapse;\n }\n\n /* 图片组件样式 */\n .image-component {\n position: absolute;\n }\n .image-component img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n /* 矩形组件样式 */\n .rect-component {\n position: absolute;\n }\n\n /* 线条组件样式 */\n .line-component {\n position: absolute;\n }\n\n /* 二维码组件样式 */\n .qrcode-component {\n position: absolute;\n }\n\n /* 条形码组件样式 */\n .barcode-component {\n position: absolute;\n }\n `;\n}\n\n/**\n * 生成打印页面样式(预览模式)\n * 用于 printEngine 的 generatePrintHTML\n */\nexport function generatePrintPageStyles(config: PrintStyleConfig): string {\n const {\n pageWidthMm,\n pageHeightMm,\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n isContinuous = false,\n minHeightMm,\n } = config;\n\n if (isContinuous) {\n // 连续纸样式\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, sans-serif;\n background: white;\n }\n\n .print-page {\n position: relative;\n width: ${pageWidthMm}mm;\n min-height: auto;\n padding: ${marginTop}mm ${marginRight}mm ${marginBottom}mm ${marginLeft}mm;\n margin: 0 auto;\n box-sizing: border-box;\n background: white;\n }\n\n ${generateComponentStyles()}\n `;\n }\n\n // 标准分页样式(带预览间隔和阴影)\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, sans-serif;\n background: #f0f0f0;\n padding: 20px;\n }\n\n @media print {\n body {\n background: white;\n padding: 0;\n }\n\n @page {\n size: ${pageWidthMm}mm ${pageHeightMm}mm;\n margin: 0; /* 打印时不使用 @page margin,而是使用 .print-page 的 padding */\n }\n\n .print-page {\n page-break-after: always;\n margin-bottom: 0 !important;\n box-shadow: none; /* 移除阴影 */\n }\n\n .print-page:last-child {\n page-break-after: auto;\n }\n }\n\n .print-page {\n position: relative;\n width: ${pageWidthMm}mm;\n height: ${pageHeightMm}mm;\n margin: 0 auto 20px; /* 页面间隔 20px */\n box-sizing: border-box;\n background: white;\n padding: ${marginTop}mm ${marginRight}mm ${marginBottom}mm ${marginLeft}mm;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1); /* 阴影效果 */\n }\n\n ${generateComponentStyles()}\n `;\n}\n\n/**\n * 生成批量打印样式(直接打印模式)\n * 用于 PrintSDK 的 printMultiple\n */\nexport function generateBatchPrintStyles(config: PrintStyleConfig): string {\n const {\n pageWidthMm,\n pageHeightMm,\n isContinuous = false,\n minHeightMm = 100,\n } = config;\n\n return `\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { margin: 0; padding: 0; background: #f5f5f5; }\n \n @page {\n size: ${pageWidthMm}mm ${pageHeightMm}mm;\n margin: 0;\n }\n \n @media print {\n body { margin: 0; padding: 0; background: white; }\n .print-page { margin: 0; page-break-after: always; box-shadow: none !important; }\n .print-page:last-child { page-break-after: auto; }\n }\n \n @media screen {\n body { padding: 20px 0; }\n .print-page {\n margin: 0 auto 20px auto;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n }\n \n .print-page {\n width: ${pageWidthMm}mm;\n height: ${isContinuous ? 'auto' : pageHeightMm + 'mm'};\n min-height: ${isContinuous ? minHeightMm + 'mm' : 'auto'};\n background: white;\n position: relative;\n box-sizing: border-box;\n }\n\n ${generateComponentStyles()}\n `;\n}\n\n/**\n * 生成完整的打印HTML文档\n */\nexport function generatePrintHTML(options: {\n title: string;\n styles: string;\n bodyContent: string;\n}): string {\n const { title, styles, bodyContent } = options;\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>${title}</title>\n <style>\n ${styles}\n </style>\n </head>\n <body>\n ${bodyContent}\n </body>\n </html>\n `;\n}\n\n/**\n * 从 PageConfig 提取页面尺寸信息\n */\nexport function getPageSizeFromConfig(page: PageConfig): {\n widthMm: number;\n heightMm: number;\n} {\n let pageWidthMm: number;\n let pageHeightMm: number;\n\n if (page.size === 'CUSTOM') {\n pageWidthMm = page.widthMm || 210;\n pageHeightMm = page.heightMm || 297;\n } else if (page.size === 'CONTINUOUS') {\n pageWidthMm = page.widthMm || 80;\n pageHeightMm = Infinity;\n } else {\n pageWidthMm = page.size === 'A4' ? 210 : 148;\n pageHeightMm = page.size === 'A4' ? 297 : 210;\n }\n\n if (page.orientation === 'landscape' && page.size !== 'CONTINUOUS') {\n [pageWidthMm, pageHeightMm] = [pageHeightMm, pageWidthMm];\n }\n\n return { widthMm: pageWidthMm, heightMm: pageHeightMm };\n}\n","/**\n * 日期格式化管道\n */\n\nimport type { PipeExecutor } from '../types';\n\nexport const DatePipe: PipeExecutor = {\n type: 'date',\n label: '日期格式化',\n\n execute(value: any, options?: Record<string, any>): any {\n if (!value) return '';\n\n const format = options?.format || 'YYYY-MM-DD';\n const date = new Date(value);\n\n if (isNaN(date.getTime())) return String(value);\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n },\n};\n","/**\n * 货币格式化管道\n */\n\nimport type { PipeExecutor } from '../types';\n\nexport const CurrencyPipe: PipeExecutor = {\n type: 'currency',\n label: '货币格式化',\n\n execute(value: any, options?: Record<string, any>): any {\n const symbol = options?.symbol || '¥';\n const precision = options?.precision ?? 2;\n return `${symbol}${Number(value || 0).toFixed(precision)}`;\n },\n};\n","/**\n * 金额转换管道\n * 支持分转元、元转分、千分位分隔等常见金额处理\n */\n\nimport Decimal from 'decimal.js';\nimport type { PipeExecutor } from '../types';\n\nexport const MoneyPipe: PipeExecutor = {\n type: 'money',\n label: '金额转换',\n\n execute(value: any, options?: Record<string, any>): any {\n if (value === null || value === undefined || value === '') return '';\n\n try {\n const num = new Decimal(value);\n\n // 转换模式:'fenToYuan' | 'yuanToFen' | 'none'\n const mode = options?.mode || 'fenToYuan'; // 默认分转元\n const precision = options?.precision ?? 2; // 默认保留2位小数\n const symbol = options?.symbol || ''; // 货币符号,默认无\n const separator = options?.separator === true; // 是否千分位分隔,默认 false\n\n let result: Decimal;\n\n // 执行转换\n switch (mode) {\n case 'fenToYuan':\n // 分转元:除以 100\n result = num.dividedBy(100);\n break;\n case 'yuanToFen':\n // 元转分:乘以 100\n result = num.times(100);\n break;\n case 'none':\n default:\n // 不转换,仅格式化\n result = num;\n break;\n }\n\n // 格式化精度\n let formatted = result.toFixed(precision);\n\n // 千分位分隔\n if (separator) {\n const parts = formatted.split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n formatted = parts.join('.');\n }\n\n // 添加货币符号\n return symbol ? `${symbol}${formatted}` : formatted;\n } catch (error) {\n console.error('MoneyPipe execution error:', error);\n return String(value);\n }\n },\n};\n","/**\n * 管道执行器集合\n * 导出所有内置管道执行器\n */\n\nexport { DatePipe } from './DatePipe';\nexport { CurrencyPipe } from './CurrencyPipe';\nexport { MoneyPipe } from './MoneyPipe';\n\n/**\n * 简单管道执行器(无需配置选项)\n */\nimport type { PipeExecutor } from '../types';\n\nexport const UppercasePipe: PipeExecutor = {\n type: 'uppercase',\n label: '转大写',\n execute: (value: any) => String(value).toUpperCase(),\n};\n\nexport const LowercasePipe: PipeExecutor = {\n type: 'lowercase',\n label: '转小写',\n execute: (value: any) => String(value).toLowerCase(),\n};\n\nexport const SlicePipe: PipeExecutor = {\n type: 'slice',\n label: '截取字符串',\n execute: (value: any, options?: Record<string, any>) => {\n const start = options?.start || 0;\n const end = options?.end;\n return String(value).slice(start, end);\n },\n};\n\nexport const DefaultPipe: PipeExecutor = {\n type: 'default',\n label: '默认值',\n execute: (value: any, options?: Record<string, any>) => {\n return value || options?.defaultValue || '';\n },\n};\n","/**\n * 管道注册器\n * 负责管理管道执行器\n */\n\nimport type { PipeExecutor } from './types';\nimport * as Executors from './executors';\n\n/**\n * 管道执行器注册表\n */\nconst executorRegistry = new Map<string, PipeExecutor>();\n\n/**\n * 注册管道执行器\n */\nexport function registerExecutor(executor: PipeExecutor): void {\n executorRegistry.set(executor.type, executor);\n}\n\n/**\n * 获取管道执行器\n */\nexport function getExecutor(type: string): PipeExecutor | undefined {\n return executorRegistry.get(type);\n}\n\n/**\n * 获取所有已注册的管道(用于下拉选择)\n */\nexport function getAllPipes(): Array<{ value: string; label: string }> {\n const pipes: Array<{ value: string; label: string }> = [];\n executorRegistry.forEach((executor) => {\n pipes.push({\n value: executor.type,\n label: executor.label,\n });\n });\n return pipes;\n}\n\n/**\n * 执行管道转换\n */\nexport function executePipe(type: string, value: any, options?: Record<string, any>): any {\n const executor = getExecutor(type);\n if (!executor) {\n console.warn(`Pipe executor not found: ${type}`);\n return value;\n }\n return executor.execute(value, options);\n}\n\n// ========== 初始化:注册所有内置管道 ==========\n\n// 注册执行器\nregisterExecutor(Executors.DatePipe);\nregisterExecutor(Executors.CurrencyPipe);\nregisterExecutor(Executors.MoneyPipe);\nregisterExecutor(Executors.UppercasePipe);\nregisterExecutor(Executors.LowercasePipe);\nregisterExecutor(Executors.SlicePipe);\nregisterExecutor(Executors.DefaultPipe);\n","/**\n * 样式构建工具函数\n */\n\nimport type { StyleObject } from '../types';\n\n/**\n * 将样式对象转换为 CSS 字符串\n * @example\n * buildStyleString({ fontSize: '14px', color: '#000' })\n * // => \"font-size: 14px; color: #000\"\n */\nexport function buildStyleString(styles: StyleObject): string {\n return Object.entries(styles)\n .map(([key, val]) => {\n // 将驼峰命名转为短横线命名\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${val}`;\n })\n .join('; ');\n}\n\n/**\n * 构建绝对定位样式\n * @param xMm X坐标(mm)\n * @param yMm Y坐标(mm)\n * @param widthMm 宽度(mm)\n * @param heightMm 高度(mm)\n * @param mmToPx mm转px系数(默认3.78)\n */\nexport function buildPositionStyle(\n xMm: number,\n yMm: number,\n widthMm?: number,\n heightMm?: number,\n mmToPx = 3.78\n): StyleObject {\n const styles: StyleObject = {\n position: 'absolute',\n left: `${xMm * mmToPx}px`,\n top: `${yMm * mmToPx}px`,\n };\n\n if (widthMm !== undefined) {\n styles.width = `${widthMm * mmToPx}px`;\n }\n\n if (heightMm !== undefined) {\n styles.minHeight = `${heightMm * mmToPx}px`;\n }\n\n return styles;\n}\n","/**\n * 文本组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class TextRenderer implements ComponentRenderer {\n readonly type = 'text';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props, binding } = component;\n const value = context.resolveBinding(binding);\n\n // 支持 label 前缀\n const label = props?.label || '';\n const displayValue = value || props?.text || '';\n const fullText = label ? `${label}${displayValue}` : displayValue;\n\n // 基础定位样式\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm,\n layout.heightMm,\n context.mmToPx\n );\n\n // 文本样式\n const textAlign = style?.textAlign || STYLE_DEFAULT.TEXT_ALIGN;\n // 将 textAlign 转换为 justifyContent(因为使用了 flex 布局)\n const justifyContent = textAlign === 'center' ? 'center' : textAlign === 'right' ? 'flex-end' : 'flex-start';\n\n const textStyles: StyleObject = {\n ...positionStyles,\n fontSize: `${style?.fontSize || STYLE_DEFAULT.FONT_SIZE}px`,\n color: style?.color || STYLE_DEFAULT.TEXT_COLOR,\n fontWeight: style?.fontWeight || STYLE_DEFAULT.FONT_WEIGHT,\n display: 'flex',\n alignItems: 'center',\n justifyContent,\n overflow: 'visible',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n lineHeight: STYLE_DEFAULT.LINE_HEIGHT,\n };\n\n const styleStr = buildStyleString(textStyles);\n\n return `<div style=\"${styleStr}\">${fullText}</div>`;\n }\n\n calculateHeight(component: ComponentNode): number {\n // 文本组件高度:使用布局高度或默认值\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.TEXT_HEIGHT;\n }\n}\n","/**\n * 表格组件渲染器\n */\n\nimport Decimal from 'decimal.js';\nimport type { ComponentNode, TableColumn, TableProps } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, TABLE_STYLE_DEFAULT, STYLE_DEFAULT } from '../constants';\n\nexport class TableRenderer implements ComponentRenderer {\n readonly type = 'table';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, binding, props } = component;\n\n // 获取表格数据(优先使用 _pageData,用于跨页拆分)\n let tableData: any[] = [];\n if (props?._pageData) {\n // 使用分页数据(由 calculatePages 传入)\n tableData = props._pageData;\n } else if (binding?.path) {\n // 使用完整数据\n const rawData = context.getValueByPath(binding.path, binding.fallback);\n tableData = Array.isArray(rawData) ? rawData : [];\n }\n\n // 表头配置,过滤隐藏列\n const allColumns = props?.columns || [];\n const visibleColumns = allColumns.filter((col: any) => !col.hidden);\n const showHeader = props?.showHeader !== false;\n const bordered = props?.bordered !== false;\n\n // 计算表格宽度\n let tableWidthMm: number;\n const xMm = layout.xMm || 0;\n\n if (layout.widthMm) {\n // 优先使用用户设置的宽度\n tableWidthMm = layout.widthMm;\n\n // 检查是否会溢出(xMm + widthMm 不能超过可用宽度)\n if (context.pageInfo) {\n const availableWidth = context.pageInfo.widthMm - context.pageInfo.marginMm.left - context.pageInfo.marginMm.right;\n const totalOccupied = xMm + tableWidthMm;\n\n if (totalOccupied > availableWidth) {\n console.warn(\n `表格宽度溢出:xMm(${xMm.toFixed(2)}) + widthMm(${tableWidthMm.toFixed(2)}) = ${totalOccupied.toFixed(2)}mm,` +\n `超出可用宽度 ${availableWidth.toFixed(2)}mm,已自动调整宽度`\n );\n // 自动调整宽度避免溢出\n tableWidthMm = availableWidth - xMm;\n }\n }\n } else if (context.pageInfo) {\n // 未设置宽度:自动占满可用宽度(减去 xMm 偏移)\n const availableWidth = context.pageInfo.widthMm - context.pageInfo.marginMm.left - context.pageInfo.marginMm.right;\n tableWidthMm = availableWidth - xMm;\n } else {\n // 备用:使用默认值\n tableWidthMm = COMPONENT_DEFAULT_SIZE.TABLE_WIDTH;\n }\n\n // 最小宽度保护\n if (tableWidthMm < 10) {\n console.warn(`表格宽度过小 (${tableWidthMm.toFixed(2)}mm),强制设置为最小宽度 10mm`);\n tableWidthMm = 10;\n }\n console.log(tableWidthMm, \"tableWidthMm\");\n // 表格定位样式(使用 xMm 偏移)\n const positionStyles = buildPositionStyle(\n xMm, // 使用提取的 xMm\n layout.yMm || 0,\n tableWidthMm,\n undefined,\n context.mmToPx\n );\n\n const tableStyles: StyleObject = {\n ...positionStyles,\n borderCollapse: 'collapse',\n fontSize: `${style?.fontSize || TABLE_STYLE_DEFAULT.FONT_SIZE}px`,\n };\n\n const tableStyleStr = buildStyleString(tableStyles);\n\n // 单元格样式\n const cellBorder = bordered ? `border: 1px solid ${TABLE_STYLE_DEFAULT.BORDER_COLOR};` : '';\n const cellPadding = `padding: ${TABLE_STYLE_DEFAULT.CELL_PADDING};`;\n const cellTextStyle = `white-space: normal; word-break: break-word; line-height: ${STYLE_DEFAULT.LINE_HEIGHT}; vertical-align: top;`;\n const textAlign = style?.textAlign || 'left'; // 对齐方式\n\n // ✅ 计算表头和数据行的高度(mm 转 px)\n const headerHeightPx = TABLE_DEFAULT.HEADER_HEIGHT * context.mmToPx; // 10mm * 3.78 = 37.8px\n const rowHeightPx = TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR * context.mmToPx; // 10.4mm * 3.78 = 39.3px\n\n // 渲染表头\n let headerHtml = '';\n if (showHeader && visibleColumns.length > 0) {\n const headerCells = visibleColumns\n .map((col: any) => {\n const title = col.title || col.dataIndex;\n return `<th style=\"${cellBorder} ${cellPadding} ${cellTextStyle} background: ${TABLE_STYLE_DEFAULT.HEADER_BACKGROUND}; font-weight: 600; text-align: ${textAlign}; height: ${headerHeightPx}px; box-sizing: border-box;\">${title}</th>`;\n })\n .join('');\n headerHtml = `<thead class=\"table-header-repeat\"><tr style=\"height: ${headerHeightPx}px;\">${headerCells}</tr></thead>`;\n }\n\n // 渲染表体\n let bodyHtml = '';\n if (tableData.length > 0 && visibleColumns.length > 0) {\n const rows = tableData\n .map((row: any) => {\n const cells = visibleColumns\n .map((col: any) => {\n const value = row[col.dataIndex] || '';\n return `<td style=\"${cellBorder} ${cellPadding} ${cellTextStyle} text-align: ${textAlign}; height: ${rowHeightPx}px; box-sizing: border-box;\">${value}</td>`;\n })\n .join('');\n return `<tr style=\"height: ${rowHeightPx}px;\">${cells}</tr>`;\n })\n .join('');\n bodyHtml = `<tbody>${rows}</tbody>`;\n } else {\n const colspan = visibleColumns.length || 1;\n bodyHtml = `<tbody><tr style=\"height: ${rowHeightPx}px;\"><td colspan=\"${colspan}\" style=\"${cellBorder} ${cellPadding} text-align: center; color: #999; height: ${rowHeightPx}px; box-sizing: border-box;\">暂无数据</td></tr></tbody>`;\n }\n\n // 渲染合计行(新增)\n const showSummary = props?.showSummary === true;\n const summaryMode = props?.summaryMode || 'total'; // 默认仅最后一页合计\n const isLastPage = props?._isLastPage === true;\n\n // 根据模式决定是否显示合计行\n const shouldShowSummary = showSummary && tableData.length > 0 && (\n summaryMode === 'page' || // 每页都显示\n (summaryMode === 'total' && isLastPage) // 仅最后一页显示\n );\n\n // 选择计算数据源:total 模式使用全量数据,page 模式使用当前页数据\n const summaryData = summaryMode === 'total' && props?._totalData\n ? props._totalData\n : tableData;\n\n const summaryHtml = shouldShowSummary\n ? this.renderSummary(summaryData, visibleColumns, props as TableProps, cellBorder, cellPadding, cellTextStyle, rowHeightPx, textAlign)\n : '';\n\n return `<table class=\"print-table\" style=\"${tableStyleStr}\">${headerHtml}${bodyHtml}${summaryHtml}</table>`;\n }\n\n /**\n * 渲染合计行\n */\n private renderSummary(\n data: any[],\n columns: TableColumn[],\n props: TableProps,\n cellBorder: string,\n cellPadding: string,\n cellTextStyle: string,\n rowHeightPx: number,\n defaultTextAlign: string\n ): string {\n if (!columns.length) return '';\n\n const summaryLabel = props.summaryLabel || '合计';\n const summaryStyle = props.summaryStyle || {};\n const bgColor = summaryStyle.backgroundColor || '#f5f5f5';\n const fontWeight = summaryStyle.fontWeight || 'bold';\n const fontSize = summaryStyle.fontSize;\n\n const cells = columns.map((col, index) => {\n let content = '';\n\n if (index === 0) {\n // 首列显示合计标签\n content = summaryLabel;\n } else if (col.summary) {\n // 有合计配置的列,计算合计值\n content = this.calculateSummary(data, col);\n }\n\n const cellStyle = `\n ${cellBorder}\n ${cellPadding}\n ${cellTextStyle}\n text-align: ${col.align || defaultTextAlign};\n height: ${rowHeightPx}px;\n box-sizing: border-box;\n background: ${bgColor};\n font-weight: ${fontWeight};\n ${fontSize ? `font-size: ${fontSize}px;` : ''}\n `.trim().replace(/\\s+/g, ' ');\n\n return `<td style=\"${cellStyle}\">${content}</td>`;\n }).join('');\n\n return `<tfoot><tr style=\"height: ${rowHeightPx}px;\">${cells}</tr></tfoot>`;\n }\n\n /**\n * 计算单列合计值(使用 Decimal.js 解决精度问题)\n */\n private calculateSummary(data: any[], column: TableColumn): string {\n if (!data.length) return '-';\n\n const { summary } = column;\n if (!summary) return '';\n\n const values = data\n .map(row => {\n const val = row[column.dataIndex];\n // 尝试转换为数字,失败则返回 null\n const num = Number(val);\n return isNaN(num) ? null : num;\n })\n .filter(val => val !== null) as number[];\n\n if (!values.length) return '-';\n\n let result: Decimal;\n try {\n switch (summary.type) {\n case 'sum':\n result = values.reduce((sum, val) => sum.plus(val), new Decimal(0));\n break;\n case 'avg':\n const sum = values.reduce((s, val) => s.plus(val), new Decimal(0));\n result = sum.dividedBy(values.length);\n break;\n case 'max':\n result = Decimal.max(...values.map(v => new Decimal(v)));\n break;\n case 'min':\n result = Decimal.min(...values.map(v => new Decimal(v)));\n break;\n case 'count':\n result = new Decimal(values.length);\n break;\n default:\n return '-';\n }\n } catch (error) {\n console.error('Summary calculation error:', error);\n return '-';\n }\n\n // 格式化\n const precision = summary.precision ?? 2;\n const formatted = result.toFixed(precision);\n const prefix = summary.prefix || '';\n const suffix = summary.suffix || '';\n\n return `${prefix}${formatted}${suffix}`;\n }\n\n calculateHeight(component: ComponentNode, context: RenderContext): number {\n // 表格高度:根据数据行数估算\n if (component.binding?.path) {\n const data = context.getValueByPath(component.binding.path);\n if (Array.isArray(data) && data.length > 0) {\n const headerHeight = component.props?.showHeader !== false ? TABLE_DEFAULT.HEADER_HEIGHT : 0;\n const rowHeight = TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR;\n const summaryHeight = component.props?.showSummary === true ? rowHeight : 0; // 新增:合计行高度\n\n return headerHeight + data.length * rowHeight + summaryHeight;\n }\n }\n\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.TABLE_HEIGHT;\n }\n}\n","/**\n * 图片组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE } from '../constants';\n\nexport class ImageRenderer implements ComponentRenderer {\n readonly type = 'image';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props, binding } = component;\n const value = context.resolveBinding(binding);\n\n // 图片源:优先级 binding > props.src\n const imageSrc = value || props?.src || '';\n\n // 容器定位样式\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.IMAGE_WIDTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.IMAGE_HEIGHT,\n context.mmToPx\n );\n\n const containerStyles: StyleObject = {\n ...positionStyles,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const containerStyleStr = buildStyleString(containerStyles);\n\n // 图片样式\n const imageStyle = `\n max-width: 100%;\n max-height: 100%;\n object-fit: ${style?.objectFit || 'contain'};\n `;\n\n if (imageSrc) {\n return `<div style=\"${containerStyleStr}\"><img src=\"${imageSrc}\" style=\"${imageStyle}\" alt=\"\" /></div>`;\n } else {\n // 无图片时显示占位符\n return `<div style=\"${containerStyleStr}\"><div style=\"color: #999; font-size: 12px;\">暂无图片</div></div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.IMAGE_HEIGHT;\n }\n}\n","/**\n * 矩形组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class RectRenderer implements ComponentRenderer {\n readonly type = 'rect';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style } = component;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.RECT_WIDTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.RECT_HEIGHT,\n context.mmToPx\n );\n\n const rectStyles: StyleObject = {\n ...positionStyles,\n border: style?.border || STYLE_DEFAULT.BORDER,\n background: style?.background || STYLE_DEFAULT.BACKGROUND,\n };\n\n const styleStr = buildStyleString(rectStyles);\n\n return `<div style=\"${styleStr}\"></div>`;\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.RECT_HEIGHT;\n }\n}\n","/**\n * 线条组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class LineRenderer implements ComponentRenderer {\n readonly type = 'line';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props } = component;\n const direction = props?.direction || 'horizontal';\n const borderWidth = style?.borderTopWidth || COMPONENT_DEFAULT_SIZE.LINE_WIDTH;\n const borderColor = style?.borderTopColor || STYLE_DEFAULT.TEXT_COLOR;\n const borderStyle = style?.borderTopStyle || 'solid';\n\n // 外层容器:占据实际布局空间,使用 flex 居中\n const containerStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH,\n context.mmToPx\n );\n\n const containerStyleWithFlex: StyleObject = {\n ...containerStyles,\n display: 'flex',\n alignItems: 'center', // 垂直居中\n justifyContent: 'center', // 水平居中\n };\n\n // 内层线条:统一使用 border 实现\n const lineStyles: StyleObject = direction === 'horizontal' ? {\n width: '100%',\n height: '0px',\n borderTop: `${borderWidth}px ${borderStyle} ${borderColor}`,\n } : {\n width: '0px',\n height: '100%',\n borderLeft: `${borderWidth}px ${borderStyle} ${borderColor}`,\n };\n\n const containerStyleStr = buildStyleString(containerStyleWithFlex);\n const lineStyleStr = buildStyleString(lineStyles);\n\n return `<div style=\"${containerStyleStr}\"><div style=\"${lineStyleStr}\"></div></div>`;\n }\n\n calculateHeight(component: ComponentNode, context: RenderContext): number {\n // 线条组件现在使用双层结构(外层容器 + 内层线条)\n // 应该返回外层容器的高度,即 layout.heightMm\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH;\n }\n}\n","/**\n * 二维码组件渲染器\n * 在浏览器环境同步生成base64图片,直接嵌入img标签\n */\n\nimport QRCode from 'qrcode';\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, QRCODE_CONFIG } from '../constants';\n\nexport class QRCodeRenderer implements ComponentRenderer {\n readonly type = 'qrcode';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, props, binding } = component;\n const value = context.resolveBinding(binding);\n const content = value || props?.content || QRCODE_CONFIG.DEFAULT_CONTENT;\n const sizeMm = layout.widthMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE;\n const sizePx = sizeMm * context.mmToPx;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n sizeMm,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE,\n context.mmToPx\n );\n\n const styleStr = buildStyleString(positionStyles);\n\n try {\n // 创建临时canvas(不插入DOM)\n const canvas = document.createElement('canvas');\n canvas.width = sizePx;\n canvas.height = sizePx;\n\n // 同步生成二维码到canvas\n QRCode.toCanvas(canvas, content, {\n width: sizePx,\n margin: 0,\n errorCorrectionLevel: 'M'\n }, (error) => {\n if (error) console.error('QRCode generation error:', error);\n });\n\n // 立即转换为base64(同步操作)\n const dataUrl = canvas.toDataURL('image/png');\n\n // 返回img标签\n return `<img src=\"${dataUrl}\" alt=\"QR Code\" style=\"${styleStr} display: block;\" />`;\n } catch (error) {\n console.error('QRCode generation error:', error);\n // 生成失败时返回占位图\n return `<div style=\"${styleStr} border: 1px dashed #ccc; display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px;\">QR Error</div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE;\n }\n}\n","/**\n * 条形码组件渲染器\n * 在浏览器环境同步生成base64图片,直接嵌入img标签\n */\n\nimport JsBarcode from 'jsbarcode';\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, BARCODE_CONFIG } from '../constants';\n\nexport class BarcodeRenderer implements ComponentRenderer {\n readonly type = 'barcode';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, props, binding } = component;\n const value = context.resolveBinding(binding);\n const content = value || props?.content || BARCODE_CONFIG.DEFAULT_CONTENT;\n const format = props?.format || BARCODE_CONFIG.DEFAULT_FORMAT;\n const widthMm = layout.widthMm || COMPONENT_DEFAULT_SIZE.BARCODE_WIDTH;\n const heightMm = layout.heightMm || COMPONENT_DEFAULT_SIZE.BARCODE_HEIGHT;\n const heightPx = heightMm * context.mmToPx;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n widthMm,\n heightMm,\n context.mmToPx\n );\n\n const styleStr = buildStyleString(positionStyles);\n\n try {\n // 创建临时canvas(不插入DOM)\n const canvas = document.createElement('canvas');\n\n // 使用JsBarcode生成条形码(同步)\n JsBarcode(canvas, content, {\n format: format,\n width: 2,\n height: heightPx * BARCODE_CONFIG.HEIGHT_RATIO,\n displayValue: false,\n margin: 0,\n });\n\n // 立即转换为base64(同步操作)\n const dataUrl = canvas.toDataURL('image/png');\n\n // 返回img标签\n return `<img src=\"${dataUrl}\" alt=\"Barcode\" style=\"${styleStr} display: block;\" />`;\n } catch (error) {\n console.error('Barcode generation error:', error);\n // 生成失败时返回占位图\n return `<div style=\"${styleStr} border: 1px dashed #ccc; display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px;\">Barcode Error</div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.BARCODE_HEIGHT;\n }\n}\n","/**\n * 打印引擎核心类(插件化重构版)\n * 负责:插件管理、数据绑定、Pipe 转换、虚拟分页计算\n */\n\nimport type { PrintTemplate, ComponentNode, DataBinding, PipeConfig } from './types';\nimport type { ComponentRenderer, RenderContext } from './printEngine/types';\nimport { MM_TO_PX, TABLE_DEFAULT } from './printEngine/constants';\nimport {\n generatePrintPageStyles,\n generatePrintHTML,\n getPageSizeFromConfig,\n} from './printEngine/htmlTemplate';\nimport { executePipe } from './pipes/registry';\n\n// 导入所有渲染器插件\nimport {\n TextRenderer,\n TableRenderer,\n ImageRenderer,\n RectRenderer,\n LineRenderer,\n QRCodeRenderer,\n BarcodeRenderer,\n} from './printEngine/renderers';\n\n// 导出类型和常量\nexport type { ComponentRenderer, RenderContext } from './printEngine/types';\nexport { MM_TO_PX, COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, STYLE_DEFAULT, TABLE_STYLE_DEFAULT, BARCODE_CONFIG, QRCODE_CONFIG } from './printEngine/constants';\n\nexport class PrintEngine {\n private template: PrintTemplate;\n private data: any;\n private renderers: Map<string, ComponentRenderer>;\n private readonly mmToPx = MM_TO_PX; // 使用常量:96 DPI 下 1mm = 3.78px\n\n constructor(template: PrintTemplate, data: any) {\n this.template = template;\n this.data = data;\n this.renderers = new Map();\n\n // 注册默认渲染器\n this.registerDefaultRenderers();\n }\n\n /**\n * 注册默认渲染器\n */\n private registerDefaultRenderers() {\n this.registerRenderer(new TextRenderer());\n this.registerRenderer(new TableRenderer());\n this.registerRenderer(new ImageRenderer());\n this.registerRenderer(new RectRenderer());\n this.registerRenderer(new LineRenderer());\n this.registerRenderer(new QRCodeRenderer());\n this.registerRenderer(new BarcodeRenderer());\n }\n\n /**\n * 注册渲染器插件\n * @param renderer 组件渲染器\n */\n public registerRenderer(renderer: ComponentRenderer): void {\n this.renderers.set(renderer.type, renderer);\n }\n\n /**\n * 注销渲染器插件\n * @param type 组件类型\n */\n public unregisterRenderer(type: string): void {\n this.renderers.delete(type);\n }\n\n /**\n * 根据数据路径获取值\n * 支持嵌套路径,如:order.receiver.name\n * 智能匹配:如果路径以 root. 开头但数据中没有 root 层,自动去掉 root. 前缀\n */\n private getValueByPath(path: string, fallback?: string): any {\n if (!path) return fallback || '';\n\n const keys = path.split('.');\n let value = this.data;\n\n // 智能匹配:如果第一层是 'root' 但数据中没有 root 属性,跳过 root\n let startIndex = 0;\n if (keys[0] === 'root' && keys.length > 1) {\n // 检查数据是否有 root 属性\n if (this.data && typeof this.data === 'object' && !('root' in this.data)) {\n // 数据中没有 root 层,跳过 root 前缀\n startIndex = 1;\n }\n }\n\n for (let i = startIndex; i < keys.length; i++) {\n const key = keys[i];\n if (value === null || value === undefined) {\n return fallback || '';\n }\n value = value[key];\n }\n\n return value !== undefined ? value : (fallback || '');\n }\n\n /**\n * 应用管道转换\n */\n private applyPipes(value: any, pipes?: PipeConfig[]): any {\n if (!pipes || pipes.length === 0) return value;\n\n let result = value;\n for (const pipe of pipes) {\n result = this.executePipe(result, pipe);\n }\n return result;\n }\n\n /**\n * 执行单个管道转换\n */\n private executePipe(value: any, pipe: PipeConfig): any {\n // 使用插件化的管道执行器\n return executePipe(pipe.type, value, pipe.options);\n }\n\n /**\n * 简单的日期格式化\n */\n private formatDate(value: any, format: string): string {\n if (!value) return '';\n\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n }\n\n /**\n * 解析数据绑定,返回最终渲染的值\n */\n private resolveBinding(binding?: DataBinding): string {\n if (!binding || !binding.path) {\n return '';\n }\n\n const rawValue = this.getValueByPath(binding.path, binding.fallback);\n const finalValue = this.applyPipes(rawValue, binding.pipes);\n\n return String(finalValue);\n }\n\n /**\n * 创建渲染上下文\n */\n private createRenderContext(): RenderContext {\n const { page } = this.template;\n const { widthMm, heightMm } = this.getPageSize();\n\n return {\n data: this.data,\n resolveBinding: this.resolveBinding.bind(this),\n applyPipes: this.applyPipes.bind(this),\n getValueByPath: this.getValueByPath.bind(this),\n formatDate: this.formatDate.bind(this),\n mmToPx: this.mmToPx,\n pageInfo: {\n widthMm,\n heightMm,\n marginMm: {\n top: page.marginMm?.top || 0,\n right: page.marginMm?.right || 0,\n bottom: page.marginMm?.bottom || 0,\n left: page.marginMm?.left || 0,\n },\n },\n };\n }\n\n /**\n * 渲染单个组件(通过插件)\n */\n renderComponent(component: ComponentNode): string {\n const renderer = this.renderers.get(component.type);\n\n if (!renderer) {\n console.warn(`No renderer found for component type: ${component.type}`);\n return '';\n }\n\n const context = this.createRenderContext();\n return renderer.render(component, context);\n }\n\n /**\n * 获取页面尺寸(mm)\n */\n private getPageSize(): { widthMm: number; heightMm: number } {\n const { page } = this.template;\n let pageWidthMm: number;\n let pageHeightMm: number;\n\n if (page.size === 'CUSTOM') {\n pageWidthMm = page.widthMm || 210;\n pageHeightMm = page.heightMm || 297;\n } else if (page.size === 'CONTINUOUS') {\n // 连续纸:宽度固定,高度不限\n pageWidthMm = page.widthMm || 80;\n pageHeightMm = Infinity;\n } else {\n pageWidthMm = page.size === 'A4' ? 210 : 148;\n pageHeightMm = page.size === 'A4' ? 297 : 210;\n }\n\n if (page.orientation === 'landscape' && page.size !== 'CONTINUOUS') {\n [pageWidthMm, pageHeightMm] = [pageHeightMm, pageWidthMm];\n }\n\n return { widthMm: pageWidthMm, heightMm: pageHeightMm };\n }\n\n /**\n * 判断是否需要换页\n * @param currentHeight 当前页面累计高度\n * @param componentHeight 组件高度\n * @param gap 组件间距\n * @param availableHeight 可用高度\n * @param isFirstComponent 是否为页面第一个组件\n */\n private shouldBreakPage(\n currentHeight: number,\n componentHeight: number,\n gap: number,\n availableHeight: number,\n isFirstComponent: boolean\n ): boolean {\n const needHeight = isFirstComponent ? componentHeight : gap + componentHeight;\n return currentHeight + needHeight > availableHeight;\n }\n\n /**\n * 计算表头高度(mm)\n */\n private calculateTableHeaderHeight(comp: ComponentNode): number {\n // 使用 TABLE_DEFAULT.HEADER_HEIGHT 作为表头高度\n return TABLE_DEFAULT.HEADER_HEIGHT;\n }\n\n /**\n * 计算表格行高度(mm)\n */\n private calculateTableRowHeight(comp: ComponentNode): number {\n // 使用 MIN_ROW_HEIGHT * ROW_HEIGHT_FACTOR 作为行高\n return TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR;\n }\n\n /**\n * 渲染单个页面(直接渲染,不做智能布局)\n */\n private renderSinglePage(components: ComponentNode[]): string {\n const componentsHTML = components.map((comp) => {\n return this.renderComponent(comp);\n }).join('');\n\n return componentsHTML;\n }\n\n /**\n * 虚拟分页:基于相对间距的流式布局\n * 核心逻辑:\n * 1. 计算每个组件与上一个组件的间距 (gap)\n * 2. 按顺序累加高度,遇到表格就拆分\n * 3. 换页时从 marginTop 开始,忽略原 gap\n */\n private calculatePages(components: ComponentNode[]): ComponentNode[][] {\n const { page } = this.template;\n const { heightMm } = this.getPageSize();\n\n // 连续纸模式不分页\n if (page.size === 'CONTINUOUS' || heightMm === Infinity) {\n return [components];\n }\n\n // 可用高度 = 页面高度 - 上下边距\n const marginTop = page.marginMm?.top || 0;\n const marginBottom = page.marginMm?.bottom || 0;\n const availableHeightMm = heightMm - marginTop - marginBottom;\n\n // 1. 按 yMm 排序(从上到下)\n const sortedComponents = [...components].sort((a, b) =>\n (a.layout.yMm || 0) - (b.layout.yMm || 0)\n );\n\n // 2. 计算相对间距\n interface ComponentWithGap {\n comp: ComponentNode;\n gap: number; // 与上一个组件底部的间距 (mm)\n }\n\n const componentsWithGaps: ComponentWithGap[] = sortedComponents.map((comp, index) => {\n if (index === 0) {\n // 第一个组件:间距 = 距离页面顶部的距离\n return { comp, gap: (comp.layout.yMm || 0) };\n }\n\n const prevComp = sortedComponents[index - 1];\n const prevBottom = (prevComp.layout.yMm || 0) + (prevComp.layout.heightMm || 0);\n const gap = (comp.layout.yMm || 0) - prevBottom;\n\n return { comp, gap };\n });\n\n // 3. 遍历组件,累加高度\n\n const context = this.createRenderContext();\n const pages: ComponentNode[][] = [];\n let currentPage: ComponentNode[] = [];\n let currentPageHeight = marginTop; // 当前页的累计高度\n let isFirstComponentInPage = true; // 标记当前页是否是第一个组件\n\n for (let i = 0; i < componentsWithGaps.length; i++) {\n const { comp, gap } = componentsWithGaps[i];\n const compHeightMm = comp.layout.heightMm || 50;\n\n // 边界检查:组件高度接近页面高度时输出警告\n if (compHeightMm > availableHeightMm * 0.8) {\n console.warn(\n `组件 ${comp.id} (${comp.type}) 高度 ${compHeightMm.toFixed(2)}mm 接近页面可用高度 ${availableHeightMm.toFixed(2)}mm,可能影响分页效果`\n );\n }\n\n // 4.1 如果是表格,进行跨页拆分\n if (comp.type === 'table' && comp.binding?.path) {\n const tableData = context.getValueByPath(comp.binding.path);\n if (Array.isArray(tableData) && tableData.length > 0) {\n const result = this.splitTableWithGap(\n comp,\n tableData,\n gap,\n isFirstComponentInPage,\n availableHeightMm,\n currentPageHeight,\n pages,\n currentPage\n );\n currentPage = result.currentPage;\n currentPageHeight = result.currentPageHeight;\n isFirstComponentInPage = false; // 表格后不再是第一个\n } else {\n // 空表格:按普通组件处理\n if (this.shouldBreakPage(currentPageHeight, compHeightMm, gap, availableHeightMm, isFirstComponentInPage) && currentPage.length > 0) {\n // 换页\n pages.push(currentPage);\n currentPage = [];\n currentPageHeight = marginTop;\n isFirstComponentInPage = true;\n }\n\n // 创建组件副本,避免修改原数据\n const compCopy = {\n ...comp,\n layout: { ...comp.layout }\n };\n\n if (isFirstComponentInPage) {\n // 新页面第一个组件:忽略 gap\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n } else {\n // 同一页:应用 gap\n currentPageHeight += gap;\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n }\n\n currentPage.push(compCopy);\n isFirstComponentInPage = false;\n }\n }\n // 4.2 普通组件:按相对间距累加高度\n else {\n // 使用辅助方法判断是否需要换页\n if (this.shouldBreakPage(currentPageHeight, compHeightMm, gap, availableHeightMm, isFirstComponentInPage) && currentPage.length > 0) {\n // 换页\n pages.push(currentPage);\n currentPage = [];\n currentPageHeight = marginTop;\n isFirstComponentInPage = true;\n }\n\n // 创建组件副本,避免修改原数据\n const compCopy = {\n ...comp,\n layout: { ...comp.layout }\n };\n\n if (isFirstComponentInPage) {\n // 新页面第一个组件:忽略 gap\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n } else {\n // 同一页:应用 gap\n currentPageHeight += gap;\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n }\n\n currentPage.push(compCopy);\n isFirstComponentInPage = false;\n }\n }\n\n // 5. 添加最后一页\n if (currentPage.length > 0) {\n pages.push(currentPage);\n }\n\n // 6. 返回分页结果\n return pages.length > 0 ? pages : [components];\n }\n\n /**\n * 表格跨页拆分(基于相对间距)\n * 支持 repeatHeader 配置、精确行高计算、空表格检查\n */\n private splitTableWithGap(\n tableComponent: ComponentNode,\n tableData: any[],\n gap: number,\n isFirstComponentInPage: boolean,\n availableHeightMm: number,\n currentPageHeight: number,\n pages: ComponentNode[][],\n currentPage: ComponentNode[]\n ): { currentPage: ComponentNode[]; currentPageHeight: number } {\n // 读取配置:是否重复表头(默认 true)\n const repeatHeader = tableComponent.props?.pagination?.repeatHeader !== false;\n\n // 使用精确计算的高度\n const headerHeight = this.calculateTableHeaderHeight(tableComponent);\n const rowHeight = this.calculateTableRowHeight(tableComponent);\n const marginTop = this.template.page.marginMm?.top || 0;\n\n // 空表格检查\n if (tableData.length === 0) {\n console.info('表格无数据,跳过渲染');\n return { currentPage, currentPageHeight };\n }\n\n let remainingData = [...tableData];\n let workingPage = [...currentPage];\n let workingPageHeight = currentPageHeight;\n let isFirstFragment = true;\n\n // 循环处理:直到所有数据都分配完\n while (remainingData.length > 0) {\n // 计算当前页剩余高度\n let remainingHeight = availableHeightMm - workingPageHeight;\n\n // 第一个片段需要考虑 gap\n if (isFirstFragment && !isFirstComponentInPage) {\n remainingHeight -= gap;\n }\n\n // 计算能放多少行\n // 如果 repeatHeader = false 且是第一个片段,则表头已经在第一页了,后续页不需要表头\n const needHeader = isFirstFragment || repeatHeader;\n const availableForRows = remainingHeight - (needHeader ? headerHeight : 0);\n const rowsCanFit = Math.floor(availableForRows / rowHeight);\n\n // 确保至少有 1 行数据(避免只有表头的空页面)\n if (rowsCanFit <= 0) {\n // 当前页放不下,换页\n if (workingPage.length > 0) {\n pages.push(workingPage);\n workingPage = [];\n }\n workingPageHeight = marginTop;\n isFirstFragment = false;\n continue;\n }\n\n // 取出当前页能放的数据\n const dataForThisPage = remainingData.slice(0, rowsCanFit);\n remainingData = remainingData.slice(rowsCanFit);\n\n // 判断是否为最后一页(用于合计行)\n const isLastPage = remainingData.length === 0;\n\n // 创建当前页的表格片段\n const tableFragmentYMm = isFirstFragment\n ? (isFirstComponentInPage ? workingPageHeight : workingPageHeight + gap)\n : marginTop;\n\n const tableFragment: ComponentNode = {\n ...tableComponent,\n layout: {\n ...tableComponent.layout,\n yMm: tableFragmentYMm\n },\n props: {\n ...tableComponent.props,\n _pageData: dataForThisPage,\n _showHeader: needHeader, // 控制是否显示表头\n _isLastPage: isLastPage, // 标记是否为最后一页(用于合计行)\n _totalData: tableData // 传递全量数据(用于 total 模式合计)\n }\n };\n\n workingPage.push(tableFragment);\n\n // 计算合计行高度(如果启用合计功能)\n const showSummary = tableComponent.props?.showSummary === true;\n const summaryMode = tableComponent.props?.summaryMode || 'total';\n const shouldShowSummaryOnThisPage = showSummary && (\n summaryMode === 'page' || // 每页都显示合计\n (summaryMode === 'total' && isLastPage) // 仅最后一页显示合计\n );\n const summaryHeight = shouldShowSummaryOnThisPage ? rowHeight : 0; // 合计行高度等于一行高度\n\n // 更新当前页高度(包含合计行)\n const tableFragmentHeight = (needHeader ? headerHeight : 0) + dataForThisPage.length * rowHeight + summaryHeight;\n if (isFirstFragment && !isFirstComponentInPage) {\n workingPageHeight += gap + tableFragmentHeight;\n } else {\n workingPageHeight += tableFragmentHeight;\n }\n\n // 如果还有剩余数据,换页\n if (remainingData.length > 0) {\n pages.push(workingPage);\n workingPage = [];\n workingPageHeight = marginTop;\n isFirstFragment = false;\n }\n }\n\n return {\n currentPage: workingPage,\n currentPageHeight: workingPageHeight\n };\n }\n\n /**\n * 生成打印 HTML\n */\n generatePrintHTML(): string {\n const { page, components } = this.template;\n const { widthMm, heightMm } = this.getPageSize();\n\n // 页边距\n const marginTop = page.marginMm?.top || 0;\n const marginRight = page.marginMm?.right || 0;\n const marginBottom = page.marginMm?.bottom || 0;\n const marginLeft = page.marginMm?.left || 0;\n\n // 连续纸模式:不分页,单页渲染\n if (page.size === 'CONTINUOUS') {\n const pageContent = this.renderSinglePage(components);\n const styles = generatePrintPageStyles({\n pageWidthMm: widthMm,\n pageHeightMm: heightMm,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n isContinuous: true,\n minHeightMm: page.minHeightMm,\n });\n\n return generatePrintHTML({\n title: '打印预览',\n styles,\n bodyContent: `<div class=\"print-page\">${pageContent}</div>`,\n });\n }\n\n // 标准页面模式:虚拟分页,生成多个独立的页面\n const pages = this.calculatePages(components);\n\n // 渲染每个页面\n const pagesHTML = pages.map((pageComponents, index) => {\n const pageContent = this.renderSinglePage(pageComponents);\n return `<div class=\"print-page\" data-page=\"${index + 1}\">${pageContent}</div>`;\n }).join('');\n\n const styles = generatePrintPageStyles({\n pageWidthMm: widthMm,\n pageHeightMm: heightMm,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n isContinuous: false,\n });\n\n return generatePrintHTML({\n title: '打印预览',\n styles,\n bodyContent: pagesHTML,\n });\n }\n}\n\n/**\n * 工厂函数:创建打印引擎实例\n */\nexport function createPrintEngine(template: PrintTemplate, data: any) {\n const engine = new PrintEngine(template, data);\n\n return {\n /**\n * 生成完整打印 HTML\n */\n generatePrintHTML() {\n return engine.generatePrintHTML();\n },\n\n /**\n * 注册自定义渲染器\n */\n registerRenderer(renderer: ComponentRenderer) {\n engine.registerRenderer(renderer);\n },\n\n /**\n * 注销渲染器\n */\n unregisterRenderer(type: string) {\n engine.unregisterRenderer(type);\n },\n };\n}\n","/**\n * 打印 SDK 核心类\n * 提供完整的打印功能封装\n * 解耦设计:直接接收模板数据,不依赖模板服务\n */\n\nimport { createPrintEngine } from './printEngine';\nimport type { PrintTemplate } from './types';\nimport {\n generateBatchPrintStyles,\n generatePrintHTML,\n getPageSizeFromConfig,\n} from './printEngine/htmlTemplate';\n\n/**\n * 打印选项\n */\nexport interface PrintOptions {\n template: PrintTemplate; // 直接传入模板数据\n data: any; // 打印数据\n preview?: boolean; // 是否预览(默认 false)\n}\n\n/**\n * 批量打印选项(同模板多数据)\n */\nexport interface BatchPrintOptions {\n preview?: boolean; // 是否预览(默认 false)\n onProgress?: (progress: BatchPrintProgress) => void; // 进度回调\n}\n\n/**\n * 批量打印进度\n */\nexport interface BatchPrintProgress {\n total: number; // 总任务数\n completed: number; // 已完成数\n failed: number; // 失败数\n currentIndex: number; // 当前处理的索引(-1 表示未开始/已结束)\n}\n\nexport class PrintSDK {\n // 无需配置和缓存,完全解耦\n\n /**\n * 打印\n * @param options 打印选项\n * @param options.template 模板数据\n * @param options.data 数据对象\n * @param options.preview 是否预览(默认 false)\n */\n async print(options: PrintOptions): Promise<void> {\n const { template, data, preview = false } = options;\n const engine = createPrintEngine(template, data);\n\n if (preview) {\n // 预览模式:打开新窗口显示\n const printWindow = window.open('', '_blank');\n if (!printWindow) {\n throw new Error('Failed to open print window. Please check browser settings.');\n }\n\n const html = engine.generatePrintHTML();\n printWindow.document.write(html);\n printWindow.document.close();\n\n printWindow.print();\n } else {\n // 直接打印模式:在隐藏 iframe 中打印\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n document.body.appendChild(iframe);\n\n const html = engine.generatePrintHTML();\n const iframeDoc = iframe.contentWindow?.document;\n if (!iframeDoc) {\n throw new Error('Failed to access iframe document');\n }\n\n iframeDoc.write(html);\n iframeDoc.close();\n\n // 二维码和条形码已同步生成为base64图片,无需等待,直接打印\n iframe.contentWindow?.print();\n // 打印完成后移除 iframe\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 1000);\n }\n }\n\n /**\n * 快捷打印(不预览)\n * @param template 模板数据\n * @param data 数据对象\n */\n async printDirect(template: PrintTemplate, data: any): Promise<void> {\n return this.print({ template, data, preview: false });\n }\n\n /**\n * 预览后打印\n * @param template 模板数据\n * @param data 数据对象\n */\n async printWithPreview(template: PrintTemplate, data: any): Promise<void> {\n return this.print({ template, data, preview: true });\n }\n\n /**\n * 仅生成 HTML(不打印)\n * @param template 模板数据\n * @param data 数据对象\n * @returns HTML 字符串\n */\n async generateHTML(template: PrintTemplate, data: any): Promise<string> {\n const engine = createPrintEngine(template, data);\n return engine.generatePrintHTML();\n }\n\n /**\n * 批量打印(同模板多数据)\n * 生成包含所有数据的完整打印文档,只需要用户确认一次打印\n * @param template 模板数据\n * @param dataList 数据列表\n * @param options 批量打印选项\n */\n async printMultiple(\n template: PrintTemplate,\n dataList: any[],\n options: BatchPrintOptions = {}\n ): Promise<void> {\n const {\n preview = false,\n onProgress,\n } = options;\n\n const { page } = template;\n\n const progress: BatchPrintProgress = {\n total: dataList.length,\n completed: 0,\n failed: 0,\n currentIndex: -1,\n };\n\n // 报告初始进度\n onProgress?.(progress);\n\n // 生成所有页面的HTML片段\n const allPagesHTML: string[] = [];\n\n for (let i = 0; i < dataList.length; i++) {\n const data = dataList[i];\n progress.currentIndex = i;\n onProgress?.(progress);\n\n try {\n const engine = createPrintEngine(template, data);\n const html = engine.generatePrintHTML();\n\n // 提取 <body> 标签中的内容(即所有 .print-page)\n const bodyMatch = html.match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n if (bodyMatch && bodyMatch[1]) {\n allPagesHTML.push(bodyMatch[1].trim());\n }\n\n progress.completed++;\n onProgress?.(progress);\n } catch (error) {\n progress.failed++;\n progress.completed++;\n onProgress?.(progress);\n console.error(`处理数据 ${i} 失败:`, error);\n }\n }\n\n progress.currentIndex = -1;\n onProgress?.(progress);\n\n // 获取页面尺寸信息\n const { widthMm: pageWidthMm, heightMm: pageHeightMm } = getPageSizeFromConfig(page);\n\n // 生成批量打印样式\n const styles = generateBatchPrintStyles({\n pageWidthMm,\n pageHeightMm,\n isContinuous: page.size === 'CONTINUOUS',\n minHeightMm: page.minHeightMm,\n });\n\n // 组装完整的打印HTML\n const fullHTML = generatePrintHTML({\n title: '批量打印',\n styles,\n bodyContent: allPagesHTML.join('\\n'),\n });\n\n // 执行打印(只需要确认一次)\n if (preview) {\n // 预览模式:打开新窗口\n const printWindow = window.open('', '_blank');\n if (!printWindow) {\n throw new Error('Failed to open print window');\n }\n printWindow.document.write(fullHTML);\n printWindow.document.close();\n\n // 二维码和条形码已同步生成为base64图片,无需等待,直接打印\n printWindow.print();\n } else {\n // 直接打印模式:使用 iframe\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n document.body.appendChild(iframe);\n\n const iframeDoc = iframe.contentWindow?.document;\n if (!iframeDoc) {\n throw new Error('Failed to access iframe document');\n }\n\n iframeDoc.write(fullHTML);\n iframeDoc.close();\n\n // 二维码和条形码已同步生成为base64图片,无需等待,直接打印\n iframe.contentWindow?.print();\n // 打印完成后移除 iframe\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 1000);\n }\n }\n}\n\n/**\n * 创建 SDK 实例(无需配置)\n * @returns PrintSDK 实例\n */\nexport function createPrintSDK(): PrintSDK {\n return new PrintSDK();\n}\n"],"names":["Executors.DatePipe","Executors.CurrencyPipe","Executors.MoneyPipe","Executors.UppercasePipe","Executors.LowercasePipe","Executors.SlicePipe","Executors.DefaultPipe"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/printEngine/constants.ts","../src/printEngine/htmlTemplate.ts","../src/pipes/executors/DatePipe.ts","../src/pipes/executors/CurrencyPipe.ts","../src/pipes/executors/MoneyPipe.ts","../src/pipes/executors/index.ts","../src/pipes/registry.ts","../src/printEngine/utils/styleBuilder.ts","../src/printEngine/renderers/TextRenderer.ts","../src/printEngine/renderers/TableRenderer.ts","../src/printEngine/renderers/ImageRenderer.ts","../src/printEngine/renderers/RectRenderer.ts","../src/printEngine/renderers/LineRenderer.ts","../src/printEngine/renderers/QRCodeRenderer.ts","../src/printEngine/renderers/BarcodeRenderer.ts","../src/printEngine.ts","../src/utils/resourceLoader.ts","../src/PrintSDK.ts"],"sourcesContent":["/**\n * 打印引擎常量配置\n */\n\n/**\n * 单位换算系数\n */\nexport const MM_TO_PX = 3.78; // 96 DPI 下 1mm = 3.78px\n\n/**\n * 组件默认尺寸(单位:mm)\n */\nexport const COMPONENT_DEFAULT_SIZE = {\n /** 文本组件默认宽度 */\n TEXT_WIDTH: 100,\n /** 文本组件默认高度 */\n TEXT_HEIGHT: 8,\n\n /** 图片组件默认宽度 */\n IMAGE_WIDTH: 50,\n /** 图片组件默认高度 */\n IMAGE_HEIGHT: 50,\n\n /** 矩形组件默认宽度 */\n RECT_WIDTH: 50,\n /** 矩形组件默认高度 */\n RECT_HEIGHT: 30,\n\n /** 线条组件默认长度(水平/垂直) */\n LINE_LENGTH: 100,\n /** 线条组件默认宽度(线条粗细) */\n LINE_WIDTH: 1,\n\n /** 二维码默认尺寸(正方形) */\n QRCODE_SIZE: 30,\n\n /** 条形码默认宽度 */\n BARCODE_WIDTH: 60,\n /** 条形码默认高度 */\n BARCODE_HEIGHT: 20,\n\n /** 表格组件默认宽度 */\n TABLE_WIDTH: 100,\n /** 表格组件默认高度(估算) */\n TABLE_HEIGHT: 60,\n} as const;\n\n/**\n * 表格默认尺寸配置\n */\nexport const TABLE_DEFAULT = {\n /** 表头行高度(mm) */\n HEADER_HEIGHT: 10,\n /** 数据行最小高度(mm) */\n MIN_ROW_HEIGHT: 8,\n /** 行高计算系数(考虑文本换行) */\n ROW_HEIGHT_FACTOR: 1.3,\n} as const;\n\n/**\n * 样式默认值\n */\nexport const STYLE_DEFAULT = {\n /** 默认字体大小(px) */\n FONT_SIZE: 14,\n /** 默认文本颜色 */\n TEXT_COLOR: '#000',\n /** 默认字体粗细 */\n FONT_WEIGHT: 'normal',\n /** 默认文本对齐 */\n TEXT_ALIGN: 'left',\n /** 默认行高 */\n LINE_HEIGHT: '1.5',\n /** 默认边框 */\n BORDER: '1px solid #000',\n /** 默认背景色 */\n BACKGROUND: 'transparent',\n} as const;\n\n/**\n * 表格样式默认值\n */\nexport const TABLE_STYLE_DEFAULT = {\n /** 表格默认字体大小(px) */\n FONT_SIZE: 12,\n /** 表格边框颜色 */\n BORDER_COLOR: '#d9d9d9',\n /** 表头背景色 */\n HEADER_BACKGROUND: '#fafafa',\n /** 单元格内边距 */\n CELL_PADDING: '4px 8px',\n} as const;\n\n/**\n * 条形码渲染配置\n */\nexport const BARCODE_CONFIG = {\n /** 默认条形码格式 */\n DEFAULT_FORMAT: 'CODE128',\n /** 条形码高度占容器高度的比例 */\n HEIGHT_RATIO: 0.8,\n /** 默认条形码内容 */\n DEFAULT_CONTENT: '1234567890',\n} as const;\n\n/**\n * 二维码渲染配置\n */\nexport const QRCODE_CONFIG = {\n /** 默认二维码内容 */\n DEFAULT_CONTENT: 'https://example.com',\n} as const;\n","/**\n * 打印HTML模板生成器\n * 统一管理所有打印相关的HTML和样式,避免重复代码\n */\n\nimport type { PageConfig } from '../types';\n\n/**\n * 打印样式配置\n */\ninterface PrintStyleConfig {\n pageWidthMm: number;\n pageHeightMm: number;\n marginTop?: number;\n marginRight?: number;\n marginBottom?: number;\n marginLeft?: number;\n isContinuous?: boolean;\n minHeightMm?: number;\n}\n\n/**\n * 生成组件基础样式\n * 这些样式对所有打印场景都适用\n */\nfunction generateComponentStyles(): string {\n return `\n /* 文本组件样式 */\n .text-component {\n position: absolute;\n white-space: pre-wrap;\n word-wrap: break-word;\n overflow: visible;\n }\n\n /* 表格组件样式 */\n .table-component {\n position: absolute;\n }\n .table-component table {\n width: 100%;\n border-collapse: collapse;\n }\n\n /* 图片组件样式 */\n .image-component {\n position: absolute;\n }\n .image-component img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n\n /* 矩形组件样式 */\n .rect-component {\n position: absolute;\n }\n\n /* 线条组件样式 */\n .line-component {\n position: absolute;\n }\n\n /* 二维码组件样式 */\n .qrcode-component {\n position: absolute;\n }\n\n /* 条形码组件样式 */\n .barcode-component {\n position: absolute;\n }\n `;\n}\n\n/**\n * 生成打印页面样式(预览模式)\n * 用于 printEngine 的 generatePrintHTML\n */\nexport function generatePrintPageStyles(config: PrintStyleConfig): string {\n const {\n pageWidthMm,\n pageHeightMm,\n marginTop = 0,\n marginRight = 0,\n marginBottom = 0,\n marginLeft = 0,\n isContinuous = false,\n minHeightMm,\n } = config;\n\n if (isContinuous) {\n // 连续纸样式\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, sans-serif;\n background: white;\n }\n\n .print-page {\n position: relative;\n width: ${pageWidthMm}mm;\n min-height: auto;\n padding: ${marginTop}mm ${marginRight}mm ${marginBottom}mm ${marginLeft}mm;\n margin: 0 auto;\n box-sizing: border-box;\n background: white;\n }\n\n ${generateComponentStyles()}\n `;\n }\n\n // 标准分页样式(带预览间隔和阴影)\n return `\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: Arial, sans-serif;\n background: #f0f0f0;\n padding: 20px;\n }\n\n @media print {\n body {\n background: white;\n padding: 0;\n }\n\n @page {\n size: ${pageWidthMm}mm ${pageHeightMm}mm;\n margin: 0; /* 打印时不使用 @page margin,而是使用 .print-page 的 padding */\n }\n\n .print-page {\n page-break-after: always;\n margin-bottom: 0 !important;\n box-shadow: none; /* 移除阴影 */\n }\n\n .print-page:last-child {\n page-break-after: auto;\n }\n }\n\n .print-page {\n position: relative;\n width: ${pageWidthMm}mm;\n height: ${pageHeightMm}mm;\n margin: 0 auto 20px; /* 页面间隔 20px */\n box-sizing: border-box;\n background: white;\n padding: ${marginTop}mm ${marginRight}mm ${marginBottom}mm ${marginLeft}mm;\n box-shadow: 0 2px 8px rgba(0,0,0,0.1); /* 阴影效果 */\n }\n\n ${generateComponentStyles()}\n `;\n}\n\n/**\n * 生成批量打印样式(直接打印模式)\n * 用于 PrintSDK 的 printMultiple\n */\nexport function generateBatchPrintStyles(config: PrintStyleConfig): string {\n const {\n pageWidthMm,\n pageHeightMm,\n isContinuous = false,\n minHeightMm = 100,\n } = config;\n\n return `\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { margin: 0; padding: 0; background: #f5f5f5; }\n \n @page {\n size: ${pageWidthMm}mm ${pageHeightMm}mm;\n margin: 0;\n }\n \n @media print {\n body { margin: 0; padding: 0; background: white; }\n .print-page { margin: 0; page-break-after: always; box-shadow: none !important; }\n .print-page:last-child { page-break-after: auto; }\n }\n \n @media screen {\n body { padding: 20px 0; }\n .print-page {\n margin: 0 auto 20px auto;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n }\n \n .print-page {\n width: ${pageWidthMm}mm;\n height: ${isContinuous ? 'auto' : pageHeightMm + 'mm'};\n min-height: ${isContinuous ? minHeightMm + 'mm' : 'auto'};\n background: white;\n position: relative;\n box-sizing: border-box;\n }\n\n ${generateComponentStyles()}\n `;\n}\n\n/**\n * 生成完整的打印HTML文档\n */\nexport function generatePrintHTML(options: {\n title: string;\n styles: string;\n bodyContent: string;\n}): string {\n const { title, styles, bodyContent } = options;\n\n return `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\">\n <title>${title}</title>\n <style>\n ${styles}\n </style>\n </head>\n <body>\n ${bodyContent}\n </body>\n </html>\n `;\n}\n\n/**\n * 从 PageConfig 提取页面尺寸信息\n */\nexport function getPageSizeFromConfig(page: PageConfig): {\n widthMm: number;\n heightMm: number;\n} {\n let pageWidthMm: number;\n let pageHeightMm: number;\n\n if (page.size === 'CUSTOM') {\n pageWidthMm = page.widthMm || 210;\n pageHeightMm = page.heightMm || 297;\n } else if (page.size === 'CONTINUOUS') {\n pageWidthMm = page.widthMm || 80;\n pageHeightMm = Infinity;\n } else {\n pageWidthMm = page.size === 'A4' ? 210 : 148;\n pageHeightMm = page.size === 'A4' ? 297 : 210;\n }\n\n if (page.orientation === 'landscape' && page.size !== 'CONTINUOUS') {\n [pageWidthMm, pageHeightMm] = [pageHeightMm, pageWidthMm];\n }\n\n return { widthMm: pageWidthMm, heightMm: pageHeightMm };\n}\n","/**\n * 日期格式化管道\n */\n\nimport type { PipeExecutor } from '../types';\n\nexport const DatePipe: PipeExecutor = {\n type: 'date',\n label: '日期格式化',\n\n execute(value: any, options?: Record<string, any>): any {\n if (!value) return '';\n\n const format = options?.format || 'YYYY-MM-DD';\n const date = new Date(value);\n\n if (isNaN(date.getTime())) return String(value);\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n },\n};\n","/**\n * 货币格式化管道\n */\n\nimport type { PipeExecutor } from '../types';\n\nexport const CurrencyPipe: PipeExecutor = {\n type: 'currency',\n label: '货币格式化',\n\n execute(value: any, options?: Record<string, any>): any {\n const symbol = options?.symbol || '¥';\n const precision = options?.precision ?? 2;\n return `${symbol}${Number(value || 0).toFixed(precision)}`;\n },\n};\n","/**\n * 金额转换管道\n * 支持分转元、元转分、千分位分隔等常见金额处理\n */\n\nimport Decimal from 'decimal.js';\nimport type { PipeExecutor } from '../types';\n\nexport const MoneyPipe: PipeExecutor = {\n type: 'money',\n label: '金额转换',\n\n execute(value: any, options?: Record<string, any>): any {\n if (value === null || value === undefined || value === '') return '';\n\n try {\n const num = new Decimal(value);\n\n // 转换模式:'fenToYuan' | 'yuanToFen' | 'none'\n const mode = options?.mode || 'fenToYuan'; // 默认分转元\n const precision = options?.precision ?? 2; // 默认保留2位小数\n const symbol = options?.symbol || ''; // 货币符号,默认无\n const separator = options?.separator === true; // 是否千分位分隔,默认 false\n\n let result: Decimal;\n\n // 执行转换\n switch (mode) {\n case 'fenToYuan':\n // 分转元:除以 100\n result = num.dividedBy(100);\n break;\n case 'yuanToFen':\n // 元转分:乘以 100\n result = num.times(100);\n break;\n case 'none':\n default:\n // 不转换,仅格式化\n result = num;\n break;\n }\n\n // 格式化精度\n let formatted = result.toFixed(precision);\n\n // 千分位分隔\n if (separator) {\n const parts = formatted.split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n formatted = parts.join('.');\n }\n\n // 添加货币符号\n return symbol ? `${symbol}${formatted}` : formatted;\n } catch (error) {\n console.error('MoneyPipe execution error:', error);\n return String(value);\n }\n },\n};\n","/**\n * 管道执行器集合\n * 导出所有内置管道执行器\n */\n\nexport { DatePipe } from './DatePipe';\nexport { CurrencyPipe } from './CurrencyPipe';\nexport { MoneyPipe } from './MoneyPipe';\n\n/**\n * 简单管道执行器(无需配置选项)\n */\nimport type { PipeExecutor } from '../types';\n\nexport const UppercasePipe: PipeExecutor = {\n type: 'uppercase',\n label: '转大写',\n execute: (value: any) => String(value).toUpperCase(),\n};\n\nexport const LowercasePipe: PipeExecutor = {\n type: 'lowercase',\n label: '转小写',\n execute: (value: any) => String(value).toLowerCase(),\n};\n\nexport const SlicePipe: PipeExecutor = {\n type: 'slice',\n label: '截取字符串',\n execute: (value: any, options?: Record<string, any>) => {\n const start = options?.start || 0;\n const end = options?.end;\n return String(value).slice(start, end);\n },\n};\n\nexport const DefaultPipe: PipeExecutor = {\n type: 'default',\n label: '默认值',\n execute: (value: any, options?: Record<string, any>) => {\n return value || options?.defaultValue || '';\n },\n};\n","/**\n * 管道注册器\n * 负责管理管道执行器\n */\n\nimport type { PipeExecutor } from './types';\nimport * as Executors from './executors';\n\n/**\n * 管道执行器注册表\n */\nconst executorRegistry = new Map<string, PipeExecutor>();\n\n/**\n * 注册管道执行器\n */\nexport function registerExecutor(executor: PipeExecutor): void {\n executorRegistry.set(executor.type, executor);\n}\n\n/**\n * 获取管道执行器\n */\nexport function getExecutor(type: string): PipeExecutor | undefined {\n return executorRegistry.get(type);\n}\n\n/**\n * 获取所有已注册的管道(用于下拉选择)\n */\nexport function getAllPipes(): Array<{ value: string; label: string }> {\n const pipes: Array<{ value: string; label: string }> = [];\n executorRegistry.forEach((executor) => {\n pipes.push({\n value: executor.type,\n label: executor.label,\n });\n });\n return pipes;\n}\n\n/**\n * 执行管道转换\n */\nexport function executePipe(type: string, value: any, options?: Record<string, any>): any {\n const executor = getExecutor(type);\n if (!executor) {\n console.warn(`Pipe executor not found: ${type}`);\n return value;\n }\n return executor.execute(value, options);\n}\n\n// ========== 初始化:注册所有内置管道 ==========\n\n// 注册执行器\nregisterExecutor(Executors.DatePipe);\nregisterExecutor(Executors.CurrencyPipe);\nregisterExecutor(Executors.MoneyPipe);\nregisterExecutor(Executors.UppercasePipe);\nregisterExecutor(Executors.LowercasePipe);\nregisterExecutor(Executors.SlicePipe);\nregisterExecutor(Executors.DefaultPipe);\n","/**\n * 样式构建工具函数\n */\n\nimport type { StyleObject } from '../types';\n\n/**\n * 将样式对象转换为 CSS 字符串\n * @example\n * buildStyleString({ fontSize: '14px', color: '#000' })\n * // => \"font-size: 14px; color: #000\"\n */\nexport function buildStyleString(styles: StyleObject): string {\n return Object.entries(styles)\n .map(([key, val]) => {\n // 将驼峰命名转为短横线命名\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${val}`;\n })\n .join('; ');\n}\n\n/**\n * 构建绝对定位样式\n * @param xMm X坐标(mm)\n * @param yMm Y坐标(mm)\n * @param widthMm 宽度(mm)\n * @param heightMm 高度(mm)\n * @param mmToPx mm转px系数(默认3.78)\n */\nexport function buildPositionStyle(\n xMm: number,\n yMm: number,\n widthMm?: number,\n heightMm?: number,\n mmToPx = 3.78\n): StyleObject {\n const styles: StyleObject = {\n position: 'absolute',\n left: `${xMm * mmToPx}px`,\n top: `${yMm * mmToPx}px`,\n };\n\n if (widthMm !== undefined) {\n styles.width = `${widthMm * mmToPx}px`;\n }\n\n if (heightMm !== undefined) {\n styles.height = `${heightMm * mmToPx}px`;\n }\n\n return styles;\n}\n","/**\n * 文本组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class TextRenderer implements ComponentRenderer {\n readonly type = 'text';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props, binding } = component;\n const value = context.resolveBinding(binding);\n\n // 支持 label 前缀\n const label = props?.label || '';\n const displayValue = value || props?.text || '';\n const fullText = label ? `${label}${displayValue}` : displayValue;\n\n // 基础定位样式\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm,\n layout.heightMm,\n context.mmToPx\n );\n\n // 文本样式\n const textAlign = style?.textAlign || STYLE_DEFAULT.TEXT_ALIGN;\n // 将 textAlign 转换为 justifyContent(因为使用了 flex 布局)\n const justifyContent = textAlign === 'center' ? 'center' : textAlign === 'right' ? 'flex-end' : 'flex-start';\n\n const textStyles: StyleObject = {\n ...positionStyles,\n fontSize: `${style?.fontSize || STYLE_DEFAULT.FONT_SIZE}px`,\n color: style?.color || STYLE_DEFAULT.TEXT_COLOR,\n fontWeight: style?.fontWeight || STYLE_DEFAULT.FONT_WEIGHT,\n display: 'flex',\n alignItems: 'center',\n justifyContent,\n overflow: 'visible',\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n lineHeight: STYLE_DEFAULT.LINE_HEIGHT,\n };\n\n const styleStr = buildStyleString(textStyles);\n\n return `<div style=\"${styleStr}\">${fullText}</div>`;\n }\n\n calculateHeight(component: ComponentNode): number {\n // 文本组件高度:使用布局高度或默认值\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.TEXT_HEIGHT;\n }\n}\n","/**\n * 表格组件渲染器\n */\n\nimport Decimal from 'decimal.js';\nimport type { ComponentNode, TableColumn, TableProps } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, TABLE_STYLE_DEFAULT, STYLE_DEFAULT } from '../constants';\n\nexport class TableRenderer implements ComponentRenderer {\n readonly type = 'table';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, binding, props } = component;\n\n // 获取表格数据(优先使用 _pageData,用于跨页拆分)\n let tableData: any[] = [];\n if (props?._pageData) {\n // 使用分页数据(由 calculatePages 传入)\n tableData = props._pageData;\n } else if (binding?.path) {\n // 使用完整数据\n const rawData = context.getValueByPath(binding.path, binding.fallback);\n tableData = Array.isArray(rawData) ? rawData : [];\n }\n\n // 表头配置,过滤隐藏列\n const allColumns = props?.columns || [];\n const visibleColumns = allColumns.filter((col: any) => !col.hidden);\n const showHeader = props?.showHeader !== false;\n const bordered = props?.bordered !== false;\n\n // 计算表格宽度\n let tableWidthMm: number;\n const xMm = layout.xMm || 0;\n\n if (layout.widthMm) {\n // 优先使用用户设置的宽度\n tableWidthMm = layout.widthMm;\n\n // 检查是否会溢出(xMm + widthMm 不能超过可用宽度)\n if (context.pageInfo) {\n const availableWidth = context.pageInfo.widthMm - context.pageInfo.marginMm.left - context.pageInfo.marginMm.right;\n const totalOccupied = xMm + tableWidthMm;\n\n if (totalOccupied > availableWidth) {\n console.warn(\n `表格宽度溢出:xMm(${xMm.toFixed(2)}) + widthMm(${tableWidthMm.toFixed(2)}) = ${totalOccupied.toFixed(2)}mm,` +\n `超出可用宽度 ${availableWidth.toFixed(2)}mm,已自动调整宽度`\n );\n // 自动调整宽度避免溢出\n tableWidthMm = availableWidth - xMm;\n }\n }\n } else if (context.pageInfo) {\n // 未设置宽度:自动占满可用宽度(减去 xMm 偏移)\n const availableWidth = context.pageInfo.widthMm - context.pageInfo.marginMm.left - context.pageInfo.marginMm.right;\n tableWidthMm = availableWidth - xMm;\n } else {\n // 备用:使用默认值\n tableWidthMm = COMPONENT_DEFAULT_SIZE.TABLE_WIDTH;\n }\n\n // 最小宽度保护\n if (tableWidthMm < 10) {\n console.warn(`表格宽度过小 (${tableWidthMm.toFixed(2)}mm),强制设置为最小宽度 10mm`);\n tableWidthMm = 10;\n }\n console.log(tableWidthMm, \"tableWidthMm\");\n // 表格定位样式(使用 xMm 偏移)\n const positionStyles = buildPositionStyle(\n xMm, // 使用提取的 xMm\n layout.yMm || 0,\n tableWidthMm,\n undefined,\n context.mmToPx\n );\n\n const tableStyles: StyleObject = {\n ...positionStyles,\n borderCollapse: 'collapse',\n fontSize: `${style?.fontSize || TABLE_STYLE_DEFAULT.FONT_SIZE}px`,\n };\n\n const tableStyleStr = buildStyleString(tableStyles);\n\n // 单元格样式\n const cellBorder = bordered ? `border: 1px solid ${TABLE_STYLE_DEFAULT.BORDER_COLOR};` : '';\n const cellPadding = `padding: ${TABLE_STYLE_DEFAULT.CELL_PADDING};`;\n const cellTextStyle = `white-space: normal; word-break: break-word; line-height: ${STYLE_DEFAULT.LINE_HEIGHT}; vertical-align: top;`;\n const textAlign = style?.textAlign || 'left'; // 对齐方式\n\n // ✅ 计算表头和数据行的高度(mm 转 px)\n const headerHeightPx = TABLE_DEFAULT.HEADER_HEIGHT * context.mmToPx; // 10mm * 3.78 = 37.8px\n const rowHeightPx = TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR * context.mmToPx; // 10.4mm * 3.78 = 39.3px\n\n // 渲染表头\n let headerHtml = '';\n if (showHeader && visibleColumns.length > 0) {\n const headerCells = visibleColumns\n .map((col: any) => {\n const title = col.title || col.dataIndex;\n return `<th style=\"${cellBorder} ${cellPadding} ${cellTextStyle} background: ${TABLE_STYLE_DEFAULT.HEADER_BACKGROUND}; font-weight: 600; text-align: ${textAlign}; height: ${headerHeightPx}px; box-sizing: border-box;\">${title}</th>`;\n })\n .join('');\n headerHtml = `<thead class=\"table-header-repeat\"><tr style=\"height: ${headerHeightPx}px;\">${headerCells}</tr></thead>`;\n }\n\n // 渲染表体\n let bodyHtml = '';\n if (tableData.length > 0 && visibleColumns.length > 0) {\n const rows = tableData\n .map((row: any) => {\n const cells = visibleColumns\n .map((col: any) => {\n const value = row[col.dataIndex] || '';\n return `<td style=\"${cellBorder} ${cellPadding} ${cellTextStyle} text-align: ${textAlign}; height: ${rowHeightPx}px; box-sizing: border-box;\">${value}</td>`;\n })\n .join('');\n return `<tr style=\"height: ${rowHeightPx}px;\">${cells}</tr>`;\n })\n .join('');\n bodyHtml = `<tbody>${rows}</tbody>`;\n } else {\n const colspan = visibleColumns.length || 1;\n bodyHtml = `<tbody><tr style=\"height: ${rowHeightPx}px;\"><td colspan=\"${colspan}\" style=\"${cellBorder} ${cellPadding} text-align: center; color: #999; height: ${rowHeightPx}px; box-sizing: border-box;\">暂无数据</td></tr></tbody>`;\n }\n\n // 渲染合计行(新增)\n const showSummary = props?.showSummary === true;\n const summaryMode = props?.summaryMode || 'total'; // 默认仅最后一页合计\n const isLastPage = props?._isLastPage === true;\n\n // 根据模式决定是否显示合计行\n const shouldShowSummary = showSummary && tableData.length > 0 && (\n summaryMode === 'page' || // 每页都显示\n (summaryMode === 'total' && isLastPage) // 仅最后一页显示\n );\n\n // 选择计算数据源:total 模式使用全量数据,page 模式使用当前页数据\n const summaryData = summaryMode === 'total' && props?._totalData\n ? props._totalData\n : tableData;\n\n const summaryHtml = shouldShowSummary\n ? this.renderSummary(summaryData, visibleColumns, props as TableProps, cellBorder, cellPadding, cellTextStyle, rowHeightPx, textAlign)\n : '';\n\n return `<table class=\"print-table\" style=\"${tableStyleStr}\">${headerHtml}${bodyHtml}${summaryHtml}</table>`;\n }\n\n /**\n * 渲染合计行\n */\n private renderSummary(\n data: any[],\n columns: TableColumn[],\n props: TableProps,\n cellBorder: string,\n cellPadding: string,\n cellTextStyle: string,\n rowHeightPx: number,\n defaultTextAlign: string\n ): string {\n if (!columns.length) return '';\n\n const summaryLabel = props.summaryLabel || '合计';\n const summaryStyle = props.summaryStyle || {};\n const bgColor = summaryStyle.backgroundColor || '#f5f5f5';\n const fontWeight = summaryStyle.fontWeight || 'bold';\n const fontSize = summaryStyle.fontSize;\n\n const cells = columns.map((col, index) => {\n let content = '';\n\n if (index === 0) {\n // 首列显示合计标签\n content = summaryLabel;\n } else if (col.summary) {\n // 有合计配置的列,计算合计值\n content = this.calculateSummary(data, col);\n }\n\n const cellStyle = `\n ${cellBorder}\n ${cellPadding}\n ${cellTextStyle}\n text-align: ${col.align || defaultTextAlign};\n height: ${rowHeightPx}px;\n box-sizing: border-box;\n background: ${bgColor};\n font-weight: ${fontWeight};\n ${fontSize ? `font-size: ${fontSize}px;` : ''}\n `.trim().replace(/\\s+/g, ' ');\n\n return `<td style=\"${cellStyle}\">${content}</td>`;\n }).join('');\n\n return `<tfoot><tr style=\"height: ${rowHeightPx}px;\">${cells}</tr></tfoot>`;\n }\n\n /**\n * 计算单列合计值(使用 Decimal.js 解决精度问题)\n */\n private calculateSummary(data: any[], column: TableColumn): string {\n if (!data.length) return '-';\n\n const { summary } = column;\n if (!summary) return '';\n\n const values = data\n .map(row => {\n const val = row[column.dataIndex];\n // 尝试转换为数字,失败则返回 null\n const num = Number(val);\n return isNaN(num) ? null : num;\n })\n .filter(val => val !== null) as number[];\n\n if (!values.length) return '-';\n\n let result: Decimal;\n try {\n switch (summary.type) {\n case 'sum':\n result = values.reduce((sum, val) => sum.plus(val), new Decimal(0));\n break;\n case 'avg':\n const sum = values.reduce((s, val) => s.plus(val), new Decimal(0));\n result = sum.dividedBy(values.length);\n break;\n case 'max':\n result = Decimal.max(...values.map(v => new Decimal(v)));\n break;\n case 'min':\n result = Decimal.min(...values.map(v => new Decimal(v)));\n break;\n case 'count':\n result = new Decimal(values.length);\n break;\n default:\n return '-';\n }\n } catch (error) {\n console.error('Summary calculation error:', error);\n return '-';\n }\n\n // 格式化\n const precision = summary.precision ?? 2;\n const formatted = result.toFixed(precision);\n const prefix = summary.prefix || '';\n const suffix = summary.suffix || '';\n\n return `${prefix}${formatted}${suffix}`;\n }\n\n calculateHeight(component: ComponentNode, context: RenderContext): number {\n // 表格高度:根据数据行数估算\n if (component.binding?.path) {\n const data = context.getValueByPath(component.binding.path);\n if (Array.isArray(data) && data.length > 0) {\n const headerHeight = component.props?.showHeader !== false ? TABLE_DEFAULT.HEADER_HEIGHT : 0;\n const rowHeight = TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR;\n const summaryHeight = component.props?.showSummary === true ? rowHeight : 0; // 新增:合计行高度\n\n return headerHeight + data.length * rowHeight + summaryHeight;\n }\n }\n\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.TABLE_HEIGHT;\n }\n}\n","/**\n * 图片组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE } from '../constants';\n\nexport class ImageRenderer implements ComponentRenderer {\n readonly type = 'image';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props, binding } = component;\n const value = context.resolveBinding(binding);\n\n // 图片源:优先级 binding > props.src\n const imageSrc = value || props?.src || '';\n\n // 容器定位样式\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.IMAGE_WIDTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.IMAGE_HEIGHT,\n context.mmToPx\n );\n\n const containerStyles: StyleObject = {\n ...positionStyles,\n overflow: 'hidden',\n };\n\n const containerStyleStr = buildStyleString(containerStyles);\n\n // 图片样式:严格按模板尺寸渲染,避免自适应导致排版错乱\n const imageStyle = `\n width: 100%;\n height: 100%;\n object-fit: ${style?.objectFit || 'fill'};\n `;\n\n if (imageSrc) {\n return `<div style=\"${containerStyleStr}\"><img src=\"${imageSrc}\" style=\"${imageStyle}\" alt=\"\" /></div>`;\n } else {\n // 无图片时显示占位符\n return `<div style=\"${containerStyleStr}\"><div style=\"color: #999; font-size: 12px;\">暂无图片</div></div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.IMAGE_HEIGHT;\n }\n}\n","/**\n * 矩形组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class RectRenderer implements ComponentRenderer {\n readonly type = 'rect';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style } = component;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.RECT_WIDTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.RECT_HEIGHT,\n context.mmToPx\n );\n\n const rectStyles: StyleObject = {\n ...positionStyles,\n border: style?.border || STYLE_DEFAULT.BORDER,\n background: style?.background || STYLE_DEFAULT.BACKGROUND,\n };\n\n const styleStr = buildStyleString(rectStyles);\n\n return `<div style=\"${styleStr}\"></div>`;\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.RECT_HEIGHT;\n }\n}\n","/**\n * 线条组件渲染器\n */\n\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext, StyleObject } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, STYLE_DEFAULT } from '../constants';\n\nexport class LineRenderer implements ComponentRenderer {\n readonly type = 'line';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, style, props } = component;\n const direction = props?.direction || 'horizontal';\n const borderWidth = style?.borderTopWidth || COMPONENT_DEFAULT_SIZE.LINE_WIDTH;\n const borderColor = style?.borderTopColor || STYLE_DEFAULT.TEXT_COLOR;\n const borderStyle = style?.borderTopStyle || 'solid';\n\n // 外层容器:占据实际布局空间,使用 flex 居中\n const containerStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n layout.widthMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH,\n context.mmToPx\n );\n\n const containerStyleWithFlex: StyleObject = {\n ...containerStyles,\n display: 'flex',\n alignItems: 'center', // 垂直居中\n justifyContent: 'center', // 水平居中\n };\n\n // 内层线条:统一使用 border 实现\n const lineStyles: StyleObject = direction === 'horizontal' ? {\n width: '100%',\n height: '0px',\n borderTop: `${borderWidth}px ${borderStyle} ${borderColor}`,\n } : {\n width: '0px',\n height: '100%',\n borderLeft: `${borderWidth}px ${borderStyle} ${borderColor}`,\n };\n\n const containerStyleStr = buildStyleString(containerStyleWithFlex);\n const lineStyleStr = buildStyleString(lineStyles);\n\n return `<div style=\"${containerStyleStr}\"><div style=\"${lineStyleStr}\"></div></div>`;\n }\n\n calculateHeight(component: ComponentNode, context: RenderContext): number {\n // 线条组件现在使用双层结构(外层容器 + 内层线条)\n // 应该返回外层容器的高度,即 layout.heightMm\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.LINE_LENGTH;\n }\n}\n","/**\n * 二维码组件渲染器\n * 在浏览器环境同步生成base64图片,直接嵌入img标签\n */\n\nimport QRCode from 'qrcode';\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, QRCODE_CONFIG } from '../constants';\n\nexport class QRCodeRenderer implements ComponentRenderer {\n readonly type = 'qrcode';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, props, binding } = component;\n const value = context.resolveBinding(binding);\n const content = value || props?.content || QRCODE_CONFIG.DEFAULT_CONTENT;\n const sizeMm = layout.widthMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE;\n const sizePx = sizeMm * context.mmToPx;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n sizeMm,\n layout.heightMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE,\n context.mmToPx\n );\n\n const styleStr = buildStyleString(positionStyles);\n\n try {\n // 创建临时canvas(不插入DOM)\n const canvas = document.createElement('canvas');\n canvas.width = sizePx;\n canvas.height = sizePx;\n\n // 同步生成二维码到canvas\n QRCode.toCanvas(canvas, content, {\n width: sizePx,\n margin: 0,\n errorCorrectionLevel: 'M'\n }, (error) => {\n if (error) console.error('QRCode generation error:', error);\n });\n\n // 立即转换为base64(同步操作)\n const dataUrl = canvas.toDataURL('image/png');\n\n // 返回img标签\n return `<img src=\"${dataUrl}\" alt=\"QR Code\" style=\"${styleStr} display: block;\" />`;\n } catch (error) {\n console.error('QRCode generation error:', error);\n // 生成失败时返回占位图\n return `<div style=\"${styleStr} border: 1px dashed #ccc; display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px;\">QR Error</div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.QRCODE_SIZE;\n }\n}\n","/**\n * 条形码组件渲染器\n * 在浏览器环境同步生成base64图片,直接嵌入img标签\n */\n\nimport JsBarcode from 'jsbarcode';\nimport type { ComponentNode } from '../../types';\nimport type { ComponentRenderer, RenderContext } from '../types';\nimport { buildStyleString, buildPositionStyle } from '../utils/styleBuilder';\nimport { COMPONENT_DEFAULT_SIZE, BARCODE_CONFIG } from '../constants';\n\nexport class BarcodeRenderer implements ComponentRenderer {\n readonly type = 'barcode';\n\n render(component: ComponentNode, context: RenderContext): string {\n const { layout, props, binding } = component;\n const value = context.resolveBinding(binding);\n const content = value || props?.content || BARCODE_CONFIG.DEFAULT_CONTENT;\n const format = props?.format || BARCODE_CONFIG.DEFAULT_FORMAT;\n const widthMm = layout.widthMm || COMPONENT_DEFAULT_SIZE.BARCODE_WIDTH;\n const heightMm = layout.heightMm || COMPONENT_DEFAULT_SIZE.BARCODE_HEIGHT;\n const heightPx = heightMm * context.mmToPx;\n\n const positionStyles = buildPositionStyle(\n layout.xMm || 0,\n layout.yMm || 0,\n widthMm,\n heightMm,\n context.mmToPx\n );\n\n const styleStr = buildStyleString(positionStyles);\n\n try {\n // 创建临时canvas(不插入DOM)\n const canvas = document.createElement('canvas');\n\n // 使用JsBarcode生成条形码(同步)\n JsBarcode(canvas, content, {\n format: format,\n width: 2,\n height: heightPx * BARCODE_CONFIG.HEIGHT_RATIO,\n displayValue: false,\n margin: 0,\n });\n\n // 立即转换为base64(同步操作)\n const dataUrl = canvas.toDataURL('image/png');\n\n // 返回img标签\n return `<img src=\"${dataUrl}\" alt=\"Barcode\" style=\"${styleStr} display: block;\" />`;\n } catch (error) {\n console.error('Barcode generation error:', error);\n // 生成失败时返回占位图\n return `<div style=\"${styleStr} border: 1px dashed #ccc; display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px;\">Barcode Error</div>`;\n }\n }\n\n calculateHeight(component: ComponentNode): number {\n return component.layout.heightMm || COMPONENT_DEFAULT_SIZE.BARCODE_HEIGHT;\n }\n}\n","/**\n * 打印引擎核心类(插件化重构版)\n * 负责:插件管理、数据绑定、Pipe 转换、虚拟分页计算\n */\n\nimport type { PrintTemplate, ComponentNode, DataBinding, PipeConfig } from './types';\nimport type { ComponentRenderer, RenderContext } from './printEngine/types';\nimport { MM_TO_PX, TABLE_DEFAULT } from './printEngine/constants';\nimport {\n generatePrintPageStyles,\n generatePrintHTML,\n getPageSizeFromConfig,\n} from './printEngine/htmlTemplate';\nimport { executePipe } from './pipes/registry';\n\n// 导入所有渲染器插件\nimport {\n TextRenderer,\n TableRenderer,\n ImageRenderer,\n RectRenderer,\n LineRenderer,\n QRCodeRenderer,\n BarcodeRenderer,\n} from './printEngine/renderers';\n\n// 导出类型和常量\nexport type { ComponentRenderer, RenderContext } from './printEngine/types';\nexport { MM_TO_PX, COMPONENT_DEFAULT_SIZE, TABLE_DEFAULT, STYLE_DEFAULT, TABLE_STYLE_DEFAULT, BARCODE_CONFIG, QRCODE_CONFIG } from './printEngine/constants';\n\nexport class PrintEngine {\n private template: PrintTemplate;\n private data: any;\n private renderers: Map<string, ComponentRenderer>;\n private readonly mmToPx = MM_TO_PX; // 使用常量:96 DPI 下 1mm = 3.78px\n\n constructor(template: PrintTemplate, data: any) {\n this.template = template;\n this.data = data;\n this.renderers = new Map();\n\n // 注册默认渲染器\n this.registerDefaultRenderers();\n }\n\n /**\n * 注册默认渲染器\n */\n private registerDefaultRenderers() {\n this.registerRenderer(new TextRenderer());\n this.registerRenderer(new TableRenderer());\n this.registerRenderer(new ImageRenderer());\n this.registerRenderer(new RectRenderer());\n this.registerRenderer(new LineRenderer());\n this.registerRenderer(new QRCodeRenderer());\n this.registerRenderer(new BarcodeRenderer());\n }\n\n /**\n * 注册渲染器插件\n * @param renderer 组件渲染器\n */\n public registerRenderer(renderer: ComponentRenderer): void {\n this.renderers.set(renderer.type, renderer);\n }\n\n /**\n * 注销渲染器插件\n * @param type 组件类型\n */\n public unregisterRenderer(type: string): void {\n this.renderers.delete(type);\n }\n\n /**\n * 根据数据路径获取值\n * 支持嵌套路径,如:order.receiver.name\n * 智能匹配:如果路径以 root. 开头但数据中没有 root 层,自动去掉 root. 前缀\n */\n private getValueByPath(path: string, fallback?: string): any {\n if (!path) return fallback || '';\n\n const keys = path.split('.');\n let value = this.data;\n\n // 智能匹配:如果第一层是 'root' 但数据中没有 root 属性,跳过 root\n let startIndex = 0;\n if (keys[0] === 'root' && keys.length > 1) {\n // 检查数据是否有 root 属性\n if (this.data && typeof this.data === 'object' && !('root' in this.data)) {\n // 数据中没有 root 层,跳过 root 前缀\n startIndex = 1;\n }\n }\n\n for (let i = startIndex; i < keys.length; i++) {\n const key = keys[i];\n if (value === null || value === undefined) {\n return fallback || '';\n }\n value = value[key];\n }\n\n return value !== undefined ? value : (fallback || '');\n }\n\n /**\n * 应用管道转换\n */\n private applyPipes(value: any, pipes?: PipeConfig[]): any {\n if (!pipes || pipes.length === 0) return value;\n\n let result = value;\n for (const pipe of pipes) {\n result = this.executePipe(result, pipe);\n }\n return result;\n }\n\n /**\n * 执行单个管道转换\n */\n private executePipe(value: any, pipe: PipeConfig): any {\n // 使用插件化的管道执行器\n return executePipe(pipe.type, value, pipe.options);\n }\n\n /**\n * 简单的日期格式化\n */\n private formatDate(value: any, format: string): string {\n if (!value) return '';\n\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n const seconds = String(date.getSeconds()).padStart(2, '0');\n\n return format\n .replace('YYYY', String(year))\n .replace('MM', month)\n .replace('DD', day)\n .replace('HH', hours)\n .replace('mm', minutes)\n .replace('ss', seconds);\n }\n\n /**\n * 解析数据绑定,返回最终渲染的值\n */\n private resolveBinding(binding?: DataBinding): string {\n if (!binding || !binding.path) {\n return '';\n }\n\n const rawValue = this.getValueByPath(binding.path, binding.fallback);\n const finalValue = this.applyPipes(rawValue, binding.pipes);\n\n return String(finalValue);\n }\n\n /**\n * 创建渲染上下文\n */\n private createRenderContext(): RenderContext {\n const { page } = this.template;\n const { widthMm, heightMm } = this.getPageSize();\n\n return {\n data: this.data,\n resolveBinding: this.resolveBinding.bind(this),\n applyPipes: this.applyPipes.bind(this),\n getValueByPath: this.getValueByPath.bind(this),\n formatDate: this.formatDate.bind(this),\n mmToPx: this.mmToPx,\n pageInfo: {\n widthMm,\n heightMm,\n marginMm: {\n top: page.marginMm?.top || 0,\n right: page.marginMm?.right || 0,\n bottom: page.marginMm?.bottom || 0,\n left: page.marginMm?.left || 0,\n },\n },\n };\n }\n\n /**\n * 渲染单个组件(通过插件)\n */\n renderComponent(component: ComponentNode): string {\n const renderer = this.renderers.get(component.type);\n\n if (!renderer) {\n console.warn(`No renderer found for component type: ${component.type}`);\n return '';\n }\n\n const context = this.createRenderContext();\n return renderer.render(component, context);\n }\n\n /**\n * 获取页面尺寸(mm)\n */\n private getPageSize(): { widthMm: number; heightMm: number } {\n const { page } = this.template;\n let pageWidthMm: number;\n let pageHeightMm: number;\n\n if (page.size === 'CUSTOM') {\n pageWidthMm = page.widthMm || 210;\n pageHeightMm = page.heightMm || 297;\n } else if (page.size === 'CONTINUOUS') {\n // 连续纸:宽度固定,高度不限\n pageWidthMm = page.widthMm || 80;\n pageHeightMm = Infinity;\n } else {\n pageWidthMm = page.size === 'A4' ? 210 : 148;\n pageHeightMm = page.size === 'A4' ? 297 : 210;\n }\n\n if (page.orientation === 'landscape' && page.size !== 'CONTINUOUS') {\n [pageWidthMm, pageHeightMm] = [pageHeightMm, pageWidthMm];\n }\n\n return { widthMm: pageWidthMm, heightMm: pageHeightMm };\n }\n\n /**\n * 判断是否需要换页\n * @param currentHeight 当前页面累计高度\n * @param componentHeight 组件高度\n * @param gap 组件间距\n * @param availableHeight 可用高度\n * @param isFirstComponent 是否为页面第一个组件\n */\n private shouldBreakPage(\n currentHeight: number,\n componentHeight: number,\n gap: number,\n availableHeight: number,\n isFirstComponent: boolean\n ): boolean {\n const needHeight = isFirstComponent ? componentHeight : gap + componentHeight;\n return currentHeight + needHeight > availableHeight;\n }\n\n /**\n * 计算表头高度(mm)\n */\n private calculateTableHeaderHeight(comp: ComponentNode): number {\n // 使用 TABLE_DEFAULT.HEADER_HEIGHT 作为表头高度\n return TABLE_DEFAULT.HEADER_HEIGHT;\n }\n\n /**\n * 计算表格行高度(mm)\n */\n private calculateTableRowHeight(comp: ComponentNode): number {\n // 使用 MIN_ROW_HEIGHT * ROW_HEIGHT_FACTOR 作为行高\n return TABLE_DEFAULT.MIN_ROW_HEIGHT * TABLE_DEFAULT.ROW_HEIGHT_FACTOR;\n }\n\n /**\n * 渲染页码(根据页面配置)\n */\n private renderPageNumber(pageNumber?: number, totalPages?: number): string {\n const { page } = this.template;\n const pageNumberConfig = page.pageNumber;\n\n // 如果未启用页码或缺少页码信息,返回空\n if (!pageNumberConfig?.enabled || pageNumber === undefined || totalPages === undefined) {\n return '';\n }\n\n console.log(`[PrintEngine] 渲染页码: pageNumber=${pageNumber}, totalPages=${totalPages}`, pageNumberConfig);\n\n // 格式化页码文本\n const format = pageNumberConfig.format || 'slash';\n const prefix = pageNumberConfig.prefix || '';\n const suffix = pageNumberConfig.suffix || '';\n const separator = pageNumberConfig.separator || '/';\n\n let pageText = '';\n if (format === 'simple') {\n pageText = `${pageNumber}`;\n } else if (format === 'text') {\n pageText = `第${pageNumber}页 共${totalPages}页`;\n } else {\n pageText = `${pageNumber}${separator}${totalPages}`;\n }\n pageText = `${prefix}${pageText}${suffix}`;\n\n // 计算位置\n const { widthMm, heightMm } = this.getPageSize();\n const { position, offsetX = 0, offsetY = 0, style = {} } = pageNumberConfig;\n const fontSize = style.fontSize || 12;\n const color = style.color || '#666';\n const fontWeight = style.fontWeight || 'normal';\n\n // 根据 position 计算 x, y 坐标\n let xMm = 0;\n let yMm = 0;\n const pageNumberWidth = 20; // 页码宽度 mm\n const pageNumberHeight = 6; // 页码高度 mm\n\n const marginTop = page.marginMm?.top || 0;\n const marginRight = page.marginMm?.right || 0;\n const marginBottom = page.marginMm?.bottom || 0;\n const marginLeft = page.marginMm?.left || 0;\n\n switch (position) {\n case 'top-left':\n xMm = marginLeft;\n yMm = marginTop;\n break;\n case 'top-center':\n xMm = (widthMm - pageNumberWidth) / 2;\n yMm = marginTop;\n break;\n case 'top-right':\n xMm = widthMm - marginRight - pageNumberWidth;\n yMm = marginTop;\n break;\n case 'bottom-left':\n xMm = marginLeft;\n yMm = heightMm - marginBottom - pageNumberHeight;\n break;\n case 'bottom-center':\n xMm = (widthMm - pageNumberWidth) / 2;\n yMm = heightMm - marginBottom - pageNumberHeight;\n break;\n case 'bottom-right':\n default:\n xMm = widthMm - marginRight - pageNumberWidth;\n yMm = heightMm - marginBottom - pageNumberHeight;\n break;\n }\n\n // 应用偏移\n xMm += offsetX;\n yMm += offsetY;\n\n // 转换为 px\n const xPx = xMm * this.mmToPx;\n const yPx = yMm * this.mmToPx;\n const widthPx = pageNumberWidth * this.mmToPx;\n const heightPx = pageNumberHeight * this.mmToPx;\n\n // 生成 HTML\n const alignStyle = position.includes('left') ? 'left' : position.includes('right') ? 'right' : 'center';\n const justifyContent = alignStyle === 'left' ? 'flex-start' : alignStyle === 'right' ? 'flex-end' : 'center';\n\n return `<div style=\"position: absolute; left: ${xPx}px; top: ${yPx}px; width: ${widthPx}px; height: ${heightPx}px; font-size: ${fontSize}px; color: ${color}; font-weight: ${fontWeight}; display: flex; align-items: center; justify-content: ${justifyContent};\">${this.escapeHtml(pageText)}</div>`;\n }\n\n /**\n * HTML 转义\n */\n private escapeHtml(text: string): string {\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#039;');\n }\n\n /**\n * 渲染单个页面(直接渲染,不做智能布局)\n * @param components 组件列表\n * @param pageNumber 当前页码(可选)\n * @param totalPages 总页数(可选)\n */\n private renderSinglePage(components: ComponentNode[], pageNumber?: number, totalPages?: number): string {\n console.log(`[PrintEngine] renderSinglePage: 页码=${pageNumber}, 总页数=${totalPages}, 组件数=${components.length}`);\n\n // 渲染所有组件\n const componentsHTML = components.map(comp => this.renderComponent(comp)).join('');\n\n // 如果页面配置启用了页码,在固定位置渲染页码\n const pageNumberHTML = this.renderPageNumber(pageNumber, totalPages);\n\n return componentsHTML + pageNumberHTML;\n }\n\n /**\n * 虚拟分页:基于相对间距的流式布局\n * 核心逻辑:\n * 1. 计算每个组件与上一个组件的间距 (gap)\n * 2. 按顺序累加高度,遇到表格就拆分\n * 3. 换页时从 marginTop 开始,忽略原 gap\n */\n private calculatePages(components: ComponentNode[]): ComponentNode[][] {\n const { page } = this.template;\n const { heightMm } = this.getPageSize();\n\n // 连续纸模式不分页\n if (page.size === 'CONTINUOUS' || heightMm === Infinity) {\n return [components];\n }\n\n // 可用高度 = 页面高度 - 上下边距\n const marginTop = page.marginMm?.top || 0;\n const marginBottom = page.marginMm?.bottom || 0;\n const availableHeightMm = heightMm - marginTop - marginBottom;\n\n // 1. 按 yMm 排序(从上到下)\n const sortedComponents = [...components].sort((a, b) =>\n (a.layout.yMm || 0) - (b.layout.yMm || 0)\n );\n\n // 2. 计算相对间距\n interface ComponentWithGap {\n comp: ComponentNode;\n gap: number; // 与上一个组件底部的间距 (mm)\n }\n\n const componentsWithGaps: ComponentWithGap[] = sortedComponents.map((comp, index) => {\n if (index === 0) {\n // 第一个组件:间距 = 距离页面顶部的距离\n return { comp, gap: (comp.layout.yMm || 0) };\n }\n\n const prevComp = sortedComponents[index - 1];\n const prevBottom = (prevComp.layout.yMm || 0) + (prevComp.layout.heightMm || 0);\n const gap = (comp.layout.yMm || 0) - prevBottom;\n\n return { comp, gap };\n });\n\n // 3. 遍历组件,累加高度\n\n const context = this.createRenderContext();\n const pages: ComponentNode[][] = [];\n let currentPage: ComponentNode[] = [];\n let currentPageHeight = marginTop; // 当前页的累计高度\n let isFirstComponentInPage = true; // 标记当前页是否是第一个组件\n\n for (let i = 0; i < componentsWithGaps.length; i++) {\n const { comp, gap } = componentsWithGaps[i];\n const compHeightMm = comp.layout.heightMm || 50;\n\n // 边界检查:组件高度接近页面高度时输出警告\n if (compHeightMm > availableHeightMm * 0.8) {\n console.warn(\n `组件 ${comp.id} (${comp.type}) 高度 ${compHeightMm.toFixed(2)}mm 接近页面可用高度 ${availableHeightMm.toFixed(2)}mm,可能影响分页效果`\n );\n }\n\n // 4.1 如果是表格,进行跨页拆分\n if (comp.type === 'table' && comp.binding?.path) {\n const tableData = context.getValueByPath(comp.binding.path);\n if (Array.isArray(tableData) && tableData.length > 0) {\n const result = this.splitTableWithGap(\n comp,\n tableData,\n gap,\n isFirstComponentInPage,\n availableHeightMm,\n currentPageHeight,\n pages,\n currentPage\n );\n currentPage = result.currentPage;\n currentPageHeight = result.currentPageHeight;\n isFirstComponentInPage = false; // 表格后不再是第一个\n } else {\n // 空表格:按普通组件处理\n if (this.shouldBreakPage(currentPageHeight, compHeightMm, gap, availableHeightMm, isFirstComponentInPage) && currentPage.length > 0) {\n // 换页\n pages.push(currentPage);\n currentPage = [];\n currentPageHeight = marginTop;\n isFirstComponentInPage = true;\n }\n\n // 创建组件副本,避免修改原数据\n const compCopy = {\n ...comp,\n layout: { ...comp.layout }\n };\n\n if (isFirstComponentInPage) {\n // 新页面第一个组件:忽略 gap\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n } else {\n // 同一页:应用 gap\n currentPageHeight += gap;\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n }\n\n currentPage.push(compCopy);\n isFirstComponentInPage = false;\n }\n }\n // 4.2 普通组件:按相对间距累加高度\n else {\n // 使用辅助方法判断是否需要换页\n if (this.shouldBreakPage(currentPageHeight, compHeightMm, gap, availableHeightMm, isFirstComponentInPage) && currentPage.length > 0) {\n // 换页\n pages.push(currentPage);\n currentPage = [];\n currentPageHeight = marginTop;\n isFirstComponentInPage = true;\n }\n\n // 创建组件副本,避免修改原数据\n const compCopy = {\n ...comp,\n layout: { ...comp.layout }\n };\n\n if (isFirstComponentInPage) {\n // 新页面第一个组件:忽略 gap\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n } else {\n // 同一页:应用 gap\n currentPageHeight += gap;\n compCopy.layout.yMm = currentPageHeight;\n currentPageHeight += compHeightMm;\n }\n\n currentPage.push(compCopy);\n isFirstComponentInPage = false;\n }\n }\n\n // 5. 添加最后一页\n if (currentPage.length > 0) {\n pages.push(currentPage);\n }\n\n // 6. 返回分页结果\n return pages.length > 0 ? pages : [components];\n }\n\n /**\n * 表格跨页拆分(基于相对间距)\n * 支持 repeatHeader 配置、精确行高计算、空表格检查\n */\n private splitTableWithGap(\n tableComponent: ComponentNode,\n tableData: any[],\n gap: number,\n isFirstComponentInPage: boolean,\n availableHeightMm: number,\n currentPageHeight: number,\n pages: ComponentNode[][],\n currentPage: ComponentNode[]\n ): { currentPage: ComponentNode[]; currentPageHeight: number } {\n // 读取配置:是否重复表头(默认 true)\n const repeatHeader = tableComponent.props?.pagination?.repeatHeader !== false;\n\n // 使用精确计算的高度\n const headerHeight = this.calculateTableHeaderHeight(tableComponent);\n const rowHeight = this.calculateTableRowHeight(tableComponent);\n const marginTop = this.template.page.marginMm?.top || 0;\n\n // 空表格检查\n if (tableData.length === 0) {\n console.info('表格无数据,跳过渲染');\n return { currentPage, currentPageHeight };\n }\n\n let remainingData = [...tableData];\n let workingPage = [...currentPage];\n let workingPageHeight = currentPageHeight;\n let isFirstFragment = true;\n\n // 循环处理:直到所有数据都分配完\n while (remainingData.length > 0) {\n // 计算当前页剩余高度\n let remainingHeight = availableHeightMm - workingPageHeight;\n\n // 第一个片段需要考虑 gap\n if (isFirstFragment && !isFirstComponentInPage) {\n remainingHeight -= gap;\n }\n\n // 计算能放多少行\n // 如果 repeatHeader = false 且是第一个片段,则表头已经在第一页了,后续页不需要表头\n const needHeader = isFirstFragment || repeatHeader;\n const availableForRows = remainingHeight - (needHeader ? headerHeight : 0);\n const rowsCanFit = Math.floor(availableForRows / rowHeight);\n\n // 确保至少有 1 行数据(避免只有表头的空页面)\n if (rowsCanFit <= 0) {\n // 当前页放不下,换页\n if (workingPage.length > 0) {\n pages.push(workingPage);\n workingPage = [];\n }\n workingPageHeight = marginTop;\n isFirstFragment = false;\n continue;\n }\n\n // 取出当前页能放的数据\n const dataForThisPage = remainingData.slice(0, rowsCanFit);\n remainingData = remainingData.slice(rowsCanFit);\n\n // 判断是否为最后一页(用于合计行)\n const isLastPage = remainingData.length === 0;\n\n // 创建当前页的表格片段\n const tableFragmentYMm = isFirstFragment\n ? (isFirstComponentInPage ? workingPageHeight : workingPageHeight + gap)\n : marginTop;\n\n const tableFragment: ComponentNode = {\n ...tableComponent,\n layout: {\n ...tableComponent.layout,\n yMm: tableFragmentYMm\n },\n props: {\n ...tableComponent.props,\n _pageData: dataForThisPage,\n _showHeader: needHeader, // 控制是否显示表头\n _isLastPage: isLastPage, // 标记是否为最后一页(用于合计行)\n _totalData: tableData // 传递全量数据(用于 total 模式合计)\n }\n };\n\n workingPage.push(tableFragment);\n\n // 计算合计行高度(如果启用合计功能)\n const showSummary = tableComponent.props?.showSummary === true;\n const summaryMode = tableComponent.props?.summaryMode || 'total';\n const shouldShowSummaryOnThisPage = showSummary && (\n summaryMode === 'page' || // 每页都显示合计\n (summaryMode === 'total' && isLastPage) // 仅最后一页显示合计\n );\n const summaryHeight = shouldShowSummaryOnThisPage ? rowHeight : 0; // 合计行高度等于一行高度\n\n // 更新当前页高度(包含合计行)\n const tableFragmentHeight = (needHeader ? headerHeight : 0) + dataForThisPage.length * rowHeight + summaryHeight;\n if (isFirstFragment && !isFirstComponentInPage) {\n workingPageHeight += gap + tableFragmentHeight;\n } else {\n workingPageHeight += tableFragmentHeight;\n }\n\n // 如果还有剩余数据,换页\n if (remainingData.length > 0) {\n pages.push(workingPage);\n workingPage = [];\n workingPageHeight = marginTop;\n isFirstFragment = false;\n }\n }\n\n return {\n currentPage: workingPage,\n currentPageHeight: workingPageHeight\n };\n }\n\n /**\n * 生成打印 HTML\n */\n generatePrintHTML(): string {\n const { page, components } = this.template;\n const { widthMm, heightMm } = this.getPageSize();\n\n // 页边距\n const marginTop = page.marginMm?.top || 0;\n const marginRight = page.marginMm?.right || 0;\n const marginBottom = page.marginMm?.bottom || 0;\n const marginLeft = page.marginMm?.left || 0;\n\n // 连续纸模式:不分页,单页渲染\n if (page.size === 'CONTINUOUS') {\n const pageContent = this.renderSinglePage(components);\n const styles = generatePrintPageStyles({\n pageWidthMm: widthMm,\n pageHeightMm: heightMm,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n isContinuous: true,\n minHeightMm: page.minHeightMm,\n });\n\n return generatePrintHTML({\n title: '打印预览',\n styles,\n bodyContent: `<div class=\"print-page\">${pageContent}</div>`,\n });\n }\n\n // 标准页面模式:虚拟分页,生成多个独立的页面\n const pages = this.calculatePages(components);\n const totalPages = pages.length;\n\n // 渲染每个页面\n const pagesHTML = pages.map((pageComponents, index) => {\n const pageNumber = index + 1;\n const pageContent = this.renderSinglePage(pageComponents, pageNumber, totalPages);\n return `<div class=\"print-page\" data-page=\"${pageNumber}\">${pageContent}</div>`;\n }).join('');\n\n const styles = generatePrintPageStyles({\n pageWidthMm: widthMm,\n pageHeightMm: heightMm,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n isContinuous: false,\n });\n\n return generatePrintHTML({\n title: '打印预览',\n styles,\n bodyContent: pagesHTML,\n });\n }\n}\n\n/**\n * 工厂函数:创建打印引擎实例\n */\nexport function createPrintEngine(template: PrintTemplate, data: any) {\n const engine = new PrintEngine(template, data);\n\n return {\n /**\n * 生成完整打印 HTML\n */\n generatePrintHTML() {\n return engine.generatePrintHTML();\n },\n\n /**\n * 注册自定义渲染器\n */\n registerRenderer(renderer: ComponentRenderer) {\n engine.registerRenderer(renderer);\n },\n\n /**\n * 注销渲染器\n */\n unregisterRenderer(type: string) {\n engine.unregisterRenderer(type);\n },\n };\n}\n","/**\n * 资源加载工具\n * 用于等待图片、二维码、条形码等异步资源加载完成\n */\n\n/**\n * 等待文档中所有图片加载完成\n * @param doc 文档对象(可以是 window.document 或 iframe.contentDocument)\n * @param timeout 超时时间(毫秒),默认 10000ms\n * @returns Promise<void>\n */\nexport async function waitForImagesLoaded(\n doc: Document,\n timeout: number = 10000\n): Promise<void> {\n const images = Array.from(doc.querySelectorAll('img'));\n\n if (images.length === 0) {\n // 没有图片,直接返回\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n let loadedCount = 0;\n let errorCount = 0;\n const totalImages = images.length;\n\n // 超时处理\n const timeoutId = setTimeout(() => {\n console.warn(`图片加载超时,已加载 ${loadedCount}/${totalImages},失败 ${errorCount} 张`);\n resolve(); // 超时也算完成,避免无限等待\n }, timeout);\n\n // 检查是否所有图片都已完成\n const checkComplete = () => {\n if (loadedCount + errorCount >= totalImages) {\n clearTimeout(timeoutId);\n if (errorCount > 0) {\n console.warn(`有 ${errorCount} 张图片加载失败`);\n }\n resolve();\n }\n };\n\n // 为每个图片添加加载监听\n images.forEach((img) => {\n // 如果图片已经加载完成(cached)\n if (img.complete) {\n if (img.naturalHeight !== 0) {\n loadedCount++;\n } else {\n errorCount++;\n }\n checkComplete();\n } else {\n // 监听 load 和 error 事件\n img.addEventListener('load', () => {\n loadedCount++;\n checkComplete();\n });\n\n img.addEventListener('error', (e) => {\n errorCount++;\n console.error('图片加载失败:', img.src, e);\n checkComplete();\n });\n }\n });\n\n // 立即检查一次(可能所有图片都已缓存)\n checkComplete();\n });\n}\n\n/**\n * 等待所有打印资源加载完成\n * 包括:图片、二维码(已转base64)、条形码(已转base64)\n * 注意:二维码和条形码在渲染时已同步生成为 base64,所以主要等待外部图片\n * @param doc 文档对象\n * @param timeout 超时时间(毫秒),默认 10000ms\n */\nexport async function waitForPrintResourcesReady(\n doc: Document,\n timeout: number = 10000\n): Promise<void> {\n // 目前只需要等待图片加载\n // 二维码和条形码在 QRCodeRenderer 和 BarcodeRenderer 中已同步生成为 base64\n return waitForImagesLoaded(doc, timeout);\n}\n","/**\n * 打印 SDK 核心类\n * 提供完整的打印功能封装\n * 解耦设计:直接接收模板数据,不依赖模板服务\n */\n\nimport { createPrintEngine } from './printEngine';\nimport type { PrintTemplate } from './types';\nimport {\n generateBatchPrintStyles,\n generatePrintHTML,\n getPageSizeFromConfig,\n} from './printEngine/htmlTemplate';\nimport { waitForImagesLoaded } from './utils/resourceLoader';\n\n/**\n * 打印选项\n */\nexport interface PrintOptions {\n template: PrintTemplate; // 直接传入模板数据\n data: any; // 打印数据\n preview?: boolean; // 是否预览(默认 false)\n}\n\n/**\n * 批量打印选项(同模板多数据)\n */\nexport interface BatchPrintOptions {\n preview?: boolean; // 是否预览(默认 false)\n onProgress?: (progress: BatchPrintProgress) => void; // 进度回调\n}\n\n/**\n * 批量打印进度\n */\nexport interface BatchPrintProgress {\n total: number; // 总任务数\n completed: number; // 已完成数\n failed: number; // 失败数\n currentIndex: number; // 当前处理的索引(-1 表示未开始/已结束)\n}\n\nexport class PrintSDK {\n // 无需配置和缓存,完全解耦\n\n /**\n * 打印\n * @param options 打印选项\n * @param options.template 模板数据\n * @param options.data 数据对象\n * @param options.preview 是否预览(默认 false)\n */\n async print(options: PrintOptions): Promise<void> {\n const { template, data, preview = false } = options;\n const engine = createPrintEngine(template, data);\n\n if (preview) {\n // 预览模式:打开新窗口显示\n const printWindow = window.open('', '_blank');\n if (!printWindow) {\n throw new Error('Failed to open print window. Please check browser settings.');\n }\n\n const html = engine.generatePrintHTML();\n printWindow.document.write(html);\n printWindow.document.close();\n\n // 等待所有图片加载完成后再打印\n await waitForImagesLoaded(printWindow.document);\n printWindow.print();\n } else {\n // 直接打印模式:在隐藏 iframe 中打印\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n document.body.appendChild(iframe);\n\n const html = engine.generatePrintHTML();\n const iframeDoc = iframe.contentWindow?.document;\n if (!iframeDoc) {\n throw new Error('Failed to access iframe document');\n }\n\n iframeDoc.write(html);\n iframeDoc.close();\n\n // 等待所有图片加载完成后再打印\n // 注意:二维码和条形码已同步生成为base64,主要等待外部图片资源\n await waitForImagesLoaded(iframeDoc);\n iframe.contentWindow?.print();\n // 打印完成后移除 iframe\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 1000);\n }\n }\n\n /**\n * 快捷打印(不预览)\n * @param template 模板数据\n * @param data 数据对象\n */\n async printDirect(template: PrintTemplate, data: any): Promise<void> {\n return this.print({ template, data, preview: false });\n }\n\n /**\n * 预览后打印\n * @param template 模板数据\n * @param data 数据对象\n */\n async printWithPreview(template: PrintTemplate, data: any): Promise<void> {\n return this.print({ template, data, preview: true });\n }\n\n /**\n * 仅生成 HTML(不打印)\n * @param template 模板数据\n * @param data 数据对象\n * @returns HTML 字符串\n */\n async generateHTML(template: PrintTemplate, data: any): Promise<string> {\n const engine = createPrintEngine(template, data);\n return engine.generatePrintHTML();\n }\n\n /**\n * 批量打印(同模板多数据)\n * 生成包含所有数据的完整打印文档,只需要用户确认一次打印\n * @param template 模板数据\n * @param dataList 数据列表\n * @param options 批量打印选项\n */\n async printMultiple(\n template: PrintTemplate,\n dataList: any[],\n options: BatchPrintOptions = {}\n ): Promise<void> {\n const {\n preview = false,\n onProgress,\n } = options;\n\n const { page } = template;\n\n const progress: BatchPrintProgress = {\n total: dataList.length,\n completed: 0,\n failed: 0,\n currentIndex: -1,\n };\n\n // 报告初始进度\n onProgress?.(progress);\n\n // 生成所有页面的HTML片段\n const allPagesHTML: string[] = [];\n\n for (let i = 0; i < dataList.length; i++) {\n const data = dataList[i];\n progress.currentIndex = i;\n onProgress?.(progress);\n\n try {\n const engine = createPrintEngine(template, data);\n const html = engine.generatePrintHTML();\n\n // 提取 <body> 标签中的内容(即所有 .print-page)\n const bodyMatch = html.match(/<body[^>]*>([\\s\\S]*)<\\/body>/i);\n if (bodyMatch && bodyMatch[1]) {\n allPagesHTML.push(bodyMatch[1].trim());\n }\n\n progress.completed++;\n onProgress?.(progress);\n } catch (error) {\n progress.failed++;\n progress.completed++;\n onProgress?.(progress);\n console.error(`处理数据 ${i} 失败:`, error);\n }\n }\n\n progress.currentIndex = -1;\n onProgress?.(progress);\n\n // 获取页面尺寸信息\n const { widthMm: pageWidthMm, heightMm: pageHeightMm } = getPageSizeFromConfig(page);\n\n // 生成批量打印样式\n const styles = generateBatchPrintStyles({\n pageWidthMm,\n pageHeightMm,\n isContinuous: page.size === 'CONTINUOUS',\n minHeightMm: page.minHeightMm,\n });\n\n // 组装完整的打印HTML\n const fullHTML = generatePrintHTML({\n title: '批量打印',\n styles,\n bodyContent: allPagesHTML.join('\\n'),\n });\n\n // 执行打印(只需要确认一次)\n if (preview) {\n // 预览模式:打开新窗口\n const printWindow = window.open('', '_blank');\n if (!printWindow) {\n throw new Error('Failed to open print window');\n }\n printWindow.document.write(fullHTML);\n printWindow.document.close();\n\n // 等待所有图片加载完成后再打印\n await waitForImagesLoaded(printWindow.document);\n printWindow.print();\n } else {\n // 直接打印模式:使用 iframe\n const iframe = document.createElement('iframe');\n iframe.style.position = 'fixed';\n iframe.style.top = '-9999px';\n iframe.style.left = '-9999px';\n document.body.appendChild(iframe);\n\n const iframeDoc = iframe.contentWindow?.document;\n if (!iframeDoc) {\n throw new Error('Failed to access iframe document');\n }\n\n iframeDoc.write(fullHTML);\n iframeDoc.close();\n\n // 等待所有图片加载完成后再打印\n await waitForImagesLoaded(iframeDoc);\n iframe.contentWindow?.print();\n // 打印完成后移除 iframe\n setTimeout(() => {\n document.body.removeChild(iframe);\n }, 1000);\n }\n }\n}\n\n/**\n * 创建 SDK 实例(无需配置)\n * @returns PrintSDK 实例\n */\nexport function createPrintSDK(): PrintSDK {\n return new PrintSDK();\n}\n"],"names":["Executors.DatePipe","Executors.CurrencyPipe","Executors.MoneyPipe","Executors.UppercasePipe","Executors.LowercasePipe","Executors.SlicePipe","Executors.DefaultPipe"],"mappings":"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"}